From 0b3b26eeda8d470c342cdfaa2e70d1655105b2f9 Mon Sep 17 00:00:00 2001 From: Howell Jiang Date: Sun, 13 Apr 2025 12:04:30 +0800 Subject: [PATCH] init --- __init__.py | 145 +++++++++++++++++++++++++++++++++++++ config_flow.py | 178 ++++++++++++++++++++++++++++++++++++++++++++++ const.py | 45 ++++++++++++ manifest.json | 12 ++++ stt.py | 173 ++++++++++++++++++++++++++++++++++++++++++++ test2audio.pcm | Bin 0 -> 64640 bytes test_baidu_api.py | 111 +++++++++++++++++++++++++++++ text2audio.pcm | Bin 0 -> 64640 bytes tts.py | 91 ++++++++++++++++++++++++ tts_test.mp3 | Bin 0 -> 15840 bytes wake_word.py | 134 ++++++++++++++++++++++++++++++++++ 11 files changed, 889 insertions(+) create mode 100644 __init__.py create mode 100644 config_flow.py create mode 100644 const.py create mode 100644 manifest.json create mode 100644 stt.py create mode 100644 test2audio.pcm create mode 100644 test_baidu_api.py create mode 100644 text2audio.pcm create mode 100644 tts.py create mode 100644 tts_test.mp3 create mode 100644 wake_word.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..19d3ee3 --- /dev/null +++ b/__init__.py @@ -0,0 +1,145 @@ +"""百度语音集成.""" +import logging +from typing import Any, Dict, Optional + +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers import config_validation as cv +from homeassistant.helpers.discovery import async_load_platform +from aip import AipSpeech + +from .const import ( + DOMAIN, + CONF_APP_ID, + CONF_API_KEY, + CONF_SECRET_KEY, + SERVICE_TTS, + SERVICE_STT, + ATTR_MESSAGE, + ATTR_LANGUAGE, + ATTR_VOLUME, + ATTR_SPEED, + ATTR_PITCH, + ATTR_PERSON, + ATTR_AUDIO, + ATTR_FORMAT, + ATTR_SAMPLE_RATE, +) + +_LOGGER = logging.getLogger(__name__) + +CONFIG_SCHEMA = cv.deprecated(DOMAIN) + +async def async_setup(hass: HomeAssistant, config: Dict[str, Any]) -> bool: + """设置百度语音集成.""" + return True + +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: + """设置百度语音配置项.""" + # 存储配置数据 + hass.data[DOMAIN] = { + CONF_APP_ID: entry.data[CONF_APP_ID], + CONF_API_KEY: entry.data[CONF_API_KEY], + CONF_SECRET_KEY: entry.data[CONF_SECRET_KEY], + } + + # 创建语音识别客户端 + client = AipSpeech( + entry.data[CONF_APP_ID], + entry.data[CONF_API_KEY], + entry.data[CONF_SECRET_KEY], + ) + + # 加载TTS平台 + await async_load_platform(hass, "tts", DOMAIN, {}, entry.data) + + # 加载STT平台 + await async_load_platform(hass, "stt", DOMAIN, {}, entry.data) + + # 注册服务 + async def async_tts_service(service): + """处理TTS服务调用.""" + message = service.data.get(ATTR_MESSAGE) + language = service.data.get(ATTR_LANGUAGE, "zh") + volume = service.data.get(ATTR_VOLUME, 5) + speed = service.data.get(ATTR_SPEED, 5) + pitch = service.data.get(ATTR_PITCH, 5) + person = service.data.get(ATTR_PERSON, 0) + + try: + result = await hass.async_add_executor_job( + client.synthesis, + message, + language, + 1, # 1表示mp3格式 + { + "vol": volume, + "per": person, + "spd": speed, + "pit": pitch, + } + ) + + if isinstance(result, dict): + _LOGGER.error("TTS失败: %s", result.get('err_msg')) + return + + # 保存音频文件 + with open('tts_output.mp3', 'wb') as f: + f.write(result) + + _LOGGER.info("TTS成功") + + except Exception as ex: + _LOGGER.error("TTS异常: %s", ex) + + async def async_stt_service(service): + """处理STT服务调用.""" + audio = service.data.get(ATTR_AUDIO) + format = service.data.get(ATTR_FORMAT, "pcm") + sample_rate = service.data.get(ATTR_SAMPLE_RATE, 16000) + + try: + result = await hass.async_add_executor_job( + client.asr, + audio, + format, + sample_rate, + { + "dev_pid": 1537, # 普通话(支持简单的英文识别) + } + ) + + if result.get("err_no") != 0: + _LOGGER.error("STT失败: %s", result.get('err_msg')) + return + + # 返回识别结果 + recognized_text = result.get("result", [""])[0] + _LOGGER.info("STT识别结果: %s", recognized_text) + + except Exception as ex: + _LOGGER.error("STT异常: %s", ex) + + # 注册服务 + hass.services.async_register( + DOMAIN, + SERVICE_TTS, + async_tts_service, + ) + + hass.services.async_register( + DOMAIN, + SERVICE_STT, + async_stt_service, + ) + + return True + +async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: + """卸载百度语音配置项.""" + hass.services.async_remove(DOMAIN, SERVICE_TTS) + hass.services.async_remove(DOMAIN, SERVICE_STT) + hass.data.pop(DOMAIN) + + return True \ No newline at end of file diff --git a/config_flow.py b/config_flow.py new file mode 100644 index 0000000..0f1a3db --- /dev/null +++ b/config_flow.py @@ -0,0 +1,178 @@ +"""百度语音配置流程.""" +import logging +import os +import asyncio +import voluptuous as vol +from typing import Any, Dict, Optional + +from homeassistant import config_entries +from homeassistant.core import callback +from homeassistant.data_entry_flow import FlowResult +from homeassistant.helpers import config_validation as cv +from aip import AipSpeech + +from .const import ( + DOMAIN, + CONF_APP_ID, + CONF_API_KEY, + CONF_SECRET_KEY, +) + +_LOGGER = logging.getLogger(__name__) + +# 测试音频文件路径 +TEST_AUDIO_PATH = os.path.join(os.path.dirname(__file__), "text2audio.pcm") + +async def async_read_file(file_path: str) -> bytes: + """异步读取文件内容.""" + loop = asyncio.get_event_loop() + return await loop.run_in_executor(None, lambda: open(file_path, "rb").read()) + +async def async_validate_api( + app_id: str, + api_key: str, + secret_key: str, +) -> bool: + """验证百度API配置.""" + try: + # 创建语音识别客户端 + client = AipSpeech(app_id, api_key, secret_key) + + # 测试TTS + result = await asyncio.get_event_loop().run_in_executor( + None, + client.synthesis, + "测试语音合成", + "zh", + 1, # 1表示mp3格式 + { + "vol": 5, # 音量,取值0-15,默认为5中音量 + "per": 0, # 发音人选择,0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫 + "spd": 5, # 语速,取值0-9,默认为5中语速 + "pit": 5, # 音调,取值0-9,默认为5中语调 + } + ) + + if isinstance(result, dict): + _LOGGER.error("TTS测试失败: %s", result.get('err_msg')) + return False + + # 测试STT + try: + audio_data = await async_read_file(TEST_AUDIO_PATH) + except Exception as ex: + _LOGGER.error("无法读取测试音频文件: %s", ex) + return False + + result = await asyncio.get_event_loop().run_in_executor( + None, + client.asr, + audio_data, + "pcm", # PCM格式 + 16000, # 采样率 + { + "dev_pid": 1537, # 普通话(支持简单的英文识别) + } + ) + + if result.get("err_no") != 0: + _LOGGER.error("STT测试失败: %s", result.get('err_msg')) + return False + + return True + + except Exception as ex: + _LOGGER.error("API验证异常: %s", ex) + return False + +class BaiduVoiceConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """处理百度语音配置流程.""" + + VERSION = 1 + CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_PUSH + + async def async_step_user( + self, user_input: Optional[Dict[str, Any]] = None + ) -> FlowResult: + """处理用户初始步骤.""" + errors: Dict[str, str] = {} + + if user_input is not None: + # 验证API配置 + if await async_validate_api( + user_input[CONF_APP_ID], + user_input[CONF_API_KEY], + user_input[CONF_SECRET_KEY], + ): + return self.async_create_entry( + title="百度语音", + data=user_input, + ) + errors["base"] = "invalid_auth" + + return self.async_show_form( + step_id="user", + data_schema=vol.Schema( + { + vol.Required(CONF_APP_ID): str, + vol.Required(CONF_API_KEY): str, + vol.Required(CONF_SECRET_KEY): str, + } + ), + errors=errors, + ) + + @staticmethod + @callback + def async_get_options_flow( + config_entry: config_entries.ConfigEntry, + ) -> config_entries.OptionsFlow: + """创建选项流.""" + return BaiduVoiceOptionsFlow(config_entry) + +class BaiduVoiceOptionsFlow(config_entries.OptionsFlow): + """处理百度语音选项.""" + + def __init__(self, config_entry: config_entries.ConfigEntry) -> None: + """初始化选项流.""" + self._config_entry = config_entry + + async def async_step_init( + self, user_input: Optional[Dict[str, Any]] = None + ) -> FlowResult: + """管理百度语音选项.""" + errors: Dict[str, str] = {} + + if user_input is not None: + # 验证API配置 + if await async_validate_api( + user_input[CONF_APP_ID], + user_input[CONF_API_KEY], + user_input[CONF_SECRET_KEY], + ): + return self.async_create_entry( + title="", + data=user_input, + ) + errors["base"] = "invalid_auth" + + return self.async_show_form( + step_id="init", + data_schema=vol.Schema( + { + vol.Required( + CONF_APP_ID, + default=self._config_entry.data.get(CONF_APP_ID), + ): str, + vol.Required( + CONF_API_KEY, + default=self._config_entry.data.get(CONF_API_KEY), + ): str, + vol.Required( + CONF_SECRET_KEY, + default=self._config_entry.data.get(CONF_SECRET_KEY), + ): str, + } + ), + errors=errors, + ) \ No newline at end of file diff --git a/const.py b/const.py new file mode 100644 index 0000000..ab9b558 --- /dev/null +++ b/const.py @@ -0,0 +1,45 @@ +"""百度语音常量.""" +from typing import Final + +DOMAIN: Final = "baidu_voice" + +# 配置项 +CONF_APP_ID: Final = "app_id" +CONF_API_KEY: Final = "api_key" +CONF_SECRET_KEY: Final = "secret_key" + +# 服务 +SERVICE_TTS: Final = "tts" +SERVICE_STT: Final = "stt" + +# 服务属性 +ATTR_MESSAGE: Final = "message" +ATTR_LANGUAGE: Final = "language" +ATTR_VOLUME: Final = "volume" +ATTR_SPEED: Final = "speed" +ATTR_PITCH: Final = "pitch" +ATTR_PERSON: Final = "person" +ATTR_AUDIO: Final = "audio" +ATTR_FORMAT: Final = "format" +ATTR_SAMPLE_RATE: Final = "sample_rate" + +# 语音参数 +DEFAULT_SPEED: Final = 5 +DEFAULT_PITCH: Final = 5 +DEFAULT_VOLUME: Final = 5 +DEFAULT_PERSON: Final = 0 # 0: 女声, 1: 男声, 3: 情感男声, 4: 情感女声 + +# 音频格式 +SUPPORTED_AUDIO_FORMATS: Final = ["mp3", "wav", "pcm"] +SUPPORTED_SAMPLE_RATES: Final = [8000, 16000] +SUPPORTED_CHANNELS: Final = [1] # 单声道 +SUPPORTED_CODECS: Final = ["pcm", "mp3", "wav"] + +# 语言支持 +SUPPORTED_LANGUAGES: Final = ["zh"] # 目前只支持中文 + +# 错误码 +ERROR_INVALID_AUTH: Final = "invalid_auth" +ERROR_UNKNOWN: Final = "unknown" +ERROR_NOT_SUPPORTED: Final = "not_supported" +ERROR_SERVICE_UNAVAILABLE: Final = "service_unavailable" \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..065a84b --- /dev/null +++ b/manifest.json @@ -0,0 +1,12 @@ +{ + "domain": "baidu_voice", + "name": "Baidu Voice", + "documentation": "https://github.com/howelljiang/baidu_voice", + "dependencies": [], + "codeowners": ["@howelljiang"], + "requirements": ["baidu-aip>=4.16.10"], + "version": "0.1.0", + "iot_class": "cloud_push", + "config_flow": true, + "platforms": ["tts", "stt"] +} \ No newline at end of file diff --git a/stt.py b/stt.py new file mode 100644 index 0000000..ea072ea --- /dev/null +++ b/stt.py @@ -0,0 +1,173 @@ +"""Baidu Speech-to-Text integration.""" +import logging +from typing import Any, Optional + +from aip import AipSpeech +from homeassistant.components.stt import ( + AudioBitRates, + AudioChannels, + AudioCodecs, + AudioFormats, + AudioSampleRates, + SpeechToTextEntity, + SpeechMetadata, + SpeechResult, + SpeechResultState, + Provider, + async_get_provider, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from .const import DOMAIN + +_LOGGER = logging.getLogger(__name__) + +class BaiduSTTBase: + """Base class for Baidu STT functionality.""" + + @property + def supported_languages(self) -> list[str]: + """Return a list of supported languages.""" + return ["zh-CN"] + + @property + def supported_formats(self) -> list[AudioFormats]: + """Return a list of supported formats.""" + return [AudioFormats.WAV, AudioFormats.OGG] + + @property + def supported_codecs(self) -> list[AudioCodecs]: + """Return a list of supported codecs.""" + return [AudioCodecs.PCM, AudioCodecs.OPUS] + + @property + def supported_bit_rates(self) -> list[AudioBitRates]: + """Return a list of supported bit rates.""" + return [AudioBitRates.BITRATE_16] + + @property + def supported_sample_rates(self) -> list[AudioSampleRates]: + """Return a list of supported sample rates.""" + return [AudioSampleRates.SAMPLERATE_16000] + + @property + def supported_channels(self) -> list[AudioChannels]: + """Return a list of supported channels.""" + return [AudioChannels.CHANNEL_MONO] + + async def _process_audio(self, audio_data: bytes, client: AipSpeech) -> SpeechResult: + """Process audio data using Baidu STT API.""" + try: + if not audio_data: + _LOGGER.warning("No audio data received") + return SpeechResult("", SpeechResultState.ERROR) + + _LOGGER.debug("Total audio data size: %d bytes", len(audio_data)) + + # 使用百度语音识别API + result = await self.hass.async_add_executor_job( + client.asr, + audio_data, + 'pcm', + 16000, + { + 'dev_pid': 1537, # 普通话(支持简单的英文识别) + } + ) + + _LOGGER.debug("Baidu STT response: %s", result) + + if result.get('err_no') == 0: + text = result.get('result', [""])[0] + return SpeechResult(text, SpeechResultState.SUCCESS) + else: + _LOGGER.error("Baidu STT error: %s", result.get('err_msg')) + return SpeechResult("", SpeechResultState.ERROR) + + except Exception as ex: + _LOGGER.error("Error during Baidu STT: %s", ex, exc_info=True) + return SpeechResult("", SpeechResultState.ERROR) + +async def async_get_engine( + hass: HomeAssistant, + config: dict, + discovery_info: Optional[dict] = None +) -> Provider: + """Set up Baidu STT component.""" + _LOGGER.debug("Setting up Baidu STT engine") + return BaiduSTTProvider(hass) + +class BaiduSTTProvider(BaiduSTTBase, Provider): + """Baidu STT api provider.""" + + def __init__(self, hass: HomeAssistant) -> None: + """Initialize Baidu STT provider.""" + self.hass = hass + self._app_id = hass.data[DOMAIN]["app_id"] + self._api_key = hass.data[DOMAIN]["api_key"] + self._secret_key = hass.data[DOMAIN]["secret_key"] + self._client = AipSpeech(self._app_id, self._api_key, self._secret_key) + self.name = "Baidu STT" + self._language = "zh-CN" + _LOGGER.debug("Initialized Baidu STT provider with language: %s", self._language) + + @property + def default_language(self) -> str: + """Return the default language.""" + return self._language + + async def async_process_audio_stream( + self, metadata: SpeechMetadata, stream: Any + ) -> SpeechResult: + """Process an audio stream to STT service.""" + _LOGGER.debug("Processing audio stream with metadata: %s", metadata) + + # 读取音频数据 + audio_data = b"" + async for chunk in stream: + audio_data += chunk + + return await self._process_audio(audio_data, self._client) + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up Baidu STT from a config entry.""" + provider = await async_get_provider(hass, DOMAIN) + if provider: + async_add_entities([BaiduSTTEntity(provider, config_entry)]) + +class BaiduSTTEntity(BaiduSTTBase, SpeechToTextEntity): + """Baidu Speech-to-Text entity.""" + + def __init__(self, provider: Provider, config_entry: ConfigEntry) -> None: + """Initialize Baidu STT entity.""" + self._provider = provider + self._config_entry = config_entry + self._attr_name = "Baidu Speech-to-Text" + self._attr_unique_id = f"{DOMAIN}_stt" + self.hass = provider.hass + + # 初始化百度语音识别客户端 + self._client = AipSpeech( + config_entry.data["app_id"], + config_entry.data["api_key"], + config_entry.data["secret_key"] + ) + + async def async_process_audio_stream( + self, metadata: SpeechMetadata, stream: Any + ) -> SpeechResult: + """Process an audio stream to STT service.""" + _LOGGER.debug("Processing audio stream with metadata: %s", metadata) + + # 读取音频数据 + audio_data = b"" + async for chunk in stream: + audio_data += chunk + + return await self._process_audio(audio_data, self._client) \ No newline at end of file diff --git a/test2audio.pcm b/test2audio.pcm new file mode 100644 index 0000000000000000000000000000000000000000..15e6e7b6c89178403e3ae16e98fd541148a19cd4 GIT binary patch literal 64640 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 G0{;(ecE51| literal 0 HcmV?d00001 diff --git a/test_baidu_api.py b/test_baidu_api.py new file mode 100644 index 0000000..06992e2 --- /dev/null +++ b/test_baidu_api.py @@ -0,0 +1,111 @@ +"""测试百度语音API.""" +import asyncio +import logging +from aip import AipSpeech + +# 配置日志 +logging.basicConfig(level=logging.DEBUG) +_LOGGER = logging.getLogger(__name__) + +# 百度API配置 +APP_ID = "118461597" +API_KEY = "BZk7p3B0DurJuRLrN1cx9iHF" +SECRET_KEY = "sn0i6jtJNPcGI2V13P3MKiGCQYoz9xzf" + +# 测试音频文件路径 +TEST_AUDIO_PATH = "text2audio.pcm" # 修正文件名 + +async def test_tts(): + """测试语音合成.""" + try: + client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) + + # 测试TTS + result = await asyncio.get_event_loop().run_in_executor( + None, + client.synthesis, + "测试语音合成", + "zh", + 1, # 1表示mp3格式 + { + "vol": 5, # 音量,取值0-15,默认为5中音量 + "per": 0, # 发音人选择,0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫 + "spd": 5, # 语速,取值0-9,默认为5中语速 + "pit": 5, # 音调,取值0-9,默认为5中语调 + } + ) + + if isinstance(result, dict): + _LOGGER.error("TTS测试失败: %s", result.get('err_msg')) + return False + + # 保存音频文件 + with open('tts_test.mp3', 'wb') as f: + f.write(result) + + _LOGGER.info("TTS测试成功") + return True + + except Exception as ex: + _LOGGER.error("TTS测试异常: %s", ex) + return False + +async def test_stt(): + """测试语音识别.""" + try: + client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) + + # 读取测试音频 + with open(TEST_AUDIO_PATH, 'rb') as f: + audio_data = f.read() + + # 测试STT + result = await asyncio.get_event_loop().run_in_executor( + None, + client.asr, + audio_data, + "pcm", # PCM格式 + 16000, # 采样率 + { + "dev_pid": 1537, # 普通话(支持简单的英文识别) + } + ) + + if result.get("err_no") != 0: + _LOGGER.error("STT测试失败: %s", result.get('err_msg')) + return False + + # 验证识别结果 + recognized_text = result.get("result", [""])[0] + _LOGGER.info("STT识别结果: %s", recognized_text) + + if not recognized_text or "测试" not in recognized_text: + _LOGGER.error("STT识别结果不准确: %s", recognized_text) + return False + + _LOGGER.info("STT测试成功") + return True + + except Exception as ex: + _LOGGER.error("STT测试异常: %s", ex) + return False + +async def main(): + """主测试函数.""" + _LOGGER.info("开始测试百度语音API...") + + # 测试TTS + tts_result = await test_tts() + _LOGGER.info("TTS测试结果: %s", "成功" if tts_result else "失败") + + # 等待1秒 + await asyncio.sleep(1) + + # 测试STT + stt_result = await test_stt() + _LOGGER.info("STT测试结果: %s", "成功" if stt_result else "失败") + + _LOGGER.info("测试完成") + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/text2audio.pcm b/text2audio.pcm new file mode 100644 index 0000000000000000000000000000000000000000..15e6e7b6c89178403e3ae16e98fd541148a19cd4 GIT binary patch literal 64640 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 G0{;(ecE51| literal 0 HcmV?d00001 diff --git a/tts.py b/tts.py new file mode 100644 index 0000000..342428e --- /dev/null +++ b/tts.py @@ -0,0 +1,91 @@ +"""Support for Baidu TTS.""" +import logging +import asyncio +from aip import AipSpeech +import voluptuous as vol + +from homeassistant.components.tts import Provider, PLATFORM_SCHEMA +from homeassistant.const import CONF_API_KEY +import homeassistant.helpers.config_validation as cv + +from .const import ( + DOMAIN, + CONF_APP_ID, + CONF_API_KEY, + CONF_SECRET_KEY, + DEFAULT_SPEED, + DEFAULT_PITCH, + DEFAULT_VOLUME, + DEFAULT_PERSON, +) + +_LOGGER = logging.getLogger(__name__) + +SUPPORT_LANGUAGES = ["zh", "en"] +DEFAULT_LANG = "zh" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( + { + vol.Required(CONF_APP_ID): cv.string, + vol.Required(CONF_API_KEY): cv.string, + vol.Required(CONF_SECRET_KEY): cv.string, + } +) + +async def async_get_engine(hass, config, discovery_info=None): + """Set up Baidu TTS component.""" + return BaiduTTSProvider(hass) + +class BaiduTTSProvider(Provider): + """Baidu TTS api provider.""" + + def __init__(self, hass): + """Initialize Baidu TTS provider.""" + self.hass = hass + self._app_id = hass.data[DOMAIN][CONF_APP_ID] + self._api_key = hass.data[DOMAIN][CONF_API_KEY] + self._secret_key = hass.data[DOMAIN][CONF_SECRET_KEY] + self._client = AipSpeech(self._app_id, self._api_key, self._secret_key) + self.name = "Baidu TTS" + + @property + def default_language(self): + """Return the default language.""" + return DEFAULT_LANG + + @property + def supported_languages(self): + """Return list of supported languages.""" + return SUPPORT_LANGUAGES + + async def async_get_tts_audio(self, message, language, options=None): + """Load TTS from Baidu.""" + options = options or {} + speed = options.get("speed", DEFAULT_SPEED) + pitch = options.get("pitch", DEFAULT_PITCH) + volume = options.get("volume", DEFAULT_VOLUME) + person = options.get("person", DEFAULT_PERSON) + + def _get_tts(): + result = self._client.synthesis( + message, + language, + 1, # 1: mp3 + { + "spd": speed, + "pit": pitch, + "vol": volume, + "per": person, + }, + ) + if isinstance(result, dict): + _LOGGER.error("Baidu TTS error: %s", result) + return None, None + return "mp3", result + + try: + audio_type, audio_data = await self.hass.async_add_executor_job(_get_tts) + return audio_type, audio_data + except Exception as ex: + _LOGGER.error("Error during Baidu TTS: %s", ex) + return None, None \ No newline at end of file diff --git a/tts_test.mp3 b/tts_test.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fb6641961cdfa39da42a5695a69cbd5f2043d62a GIT binary patch literal 15840 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%0D3!-%@aKt|u6fZuPGSm15fJ4d+s$Jp!=F2Dk z=ZEK0p|Q6&363ke9~93qOm;u+wu*1aqvo;@p5-X>6{2!YGl+gD`ksE^Bu9_M@He?^ z@Xw_?6Ghf{WyFZl30y!H069y+uaMw-a}^!1gCU6K9m|+C+j>Tf76~aNCbn|@c6eHn z@N-zEm}LY`nJfbjDIIXe(1{y?G|PbO*YGqjZ&o!Pmxz1&V9%l`=EvKB^woD{y{|%A zHT_M+J8fBAD?B>`>ibR}JCd+Ym21|AnSD&mdzp({_~>%d}{`e#H@-w)w|cP+ru?ta3frY@%_oHSjaU; zhU_3px|LoE3>!I%a@G^W`tf>?Ty;uI_6=ro^Wh{e4#7HYO@!ENv##2I} ze}ns68#(H@Mc*!mYJqaYP00XM3>I`iIrbwu*D1>b4q6(>7-|J-k(>n(!uG#HRfzsZ4h zCJrS>EJl;mm;FOSyNzzPy%XNX*qGNvZI1S1n5 zLUp+M(7ag2c!fx%c9mNgxzsSUQJadn91&>|f97)wk)@Fo8E`XWr5=M{15%(sJn(B& z;V7tQmJN#H1F4rZm-RHw(#oI1)BX+Xi zz{l8<(kM2K(!wdYCa={`XdsH;dEPn8b9YMM#z5|9l$JsG%dkzuq>1+Qd(FR2QhjZR^X6?o2L1qI)hj^Q{rTNacF=?~H zM6}yO>h$ zMPQ3L9>~47O;)(2#XN*d1_KqbNH`1-gNs`{vBr+SB&@?6eGV^YjbqSn~_AMVVo!Da!j?Y+*zq%f@NOF8QaP zSvLy(i70Qh*6rCgEfk)jt!lc8d zCKV*85Pi)i_2P3cGY!H5T;OkLYtgYtmdNUspJvK9q!Kd9aF~Rjr3e!7XD$7oWiGn^ zio~@$gT#1Lau$f=7>zoijLWsB(}_mn#_9-dwBb%_sd7|g)1;`_?lg%z{)xT&i@Z3s zoM?gWKwwe%uzEhYJ+Fr8Ya% z1Epzcg3}pvyedTz&{vk^;TcNwxC|;8dGE<^B$&e2&K5OcCrNw-uRpBNur3?xH>044F%^?Kqm@xzlH zu_bY7&}1}`Nn<4Z@~p4bdD?4@_3Fiaqqr$ZI2_(xv+8AiISqmc)5WkDa&zOV6tvgd zjL9hnn%1lt5zxys*5k)#Qm`AHU9^16<~C}#-=XQAIxH`xACuAuxBORuX05D!nV!q` zo(u)`M(u8VT@DkebXi#i_5Zd0a8*={=pGgb-Y^ZepVV0`Y~Z)ejx P0{{Ej|K#U?_xXPSLVKdW literal 0 HcmV?d00001 diff --git a/wake_word.py b/wake_word.py new file mode 100644 index 0000000..abbc9ab --- /dev/null +++ b/wake_word.py @@ -0,0 +1,134 @@ +"""Support for Baidu Wake Word Detection.""" +import logging +import asyncio +from aip import AipSpeech +import voluptuous as vol + +from homeassistant.components.wake_word import ( + WakeWordDetectionResult, + WakeWordDetectionResultState, + WakeWordProvider, +) +from homeassistant.const import CONF_API_KEY +import homeassistant.helpers.config_validation as cv + +from .const import ( + DOMAIN, + CONF_APP_ID, + CONF_API_KEY, + CONF_SECRET_KEY, + CONF_WAKE_WORD, + DEFAULT_WAKE_WORD, +) + +_LOGGER = logging.getLogger(__name__) + +SUPPORT_LANGUAGES = ["zh", "en"] +DEFAULT_LANG = "zh" + +async def async_get_engine(hass, config, discovery_info=None): + """Set up Baidu Wake Word component.""" + _LOGGER.debug("Setting up Baidu Wake Word engine") + return BaiduWakeWordProvider(hass) + +class BaiduWakeWordProvider(WakeWordProvider): + """Baidu Wake Word api provider.""" + + def __init__(self, hass): + """Initialize Baidu Wake Word provider.""" + self.hass = hass + self._app_id = hass.data[DOMAIN][CONF_APP_ID] + self._api_key = hass.data[DOMAIN][CONF_API_KEY] + self._secret_key = hass.data[DOMAIN][CONF_SECRET_KEY] + self._wake_word = hass.data[DOMAIN][CONF_WAKE_WORD] + self._client = AipSpeech(self._app_id, self._api_key, self._secret_key) + self.name = "Baidu Wake Word" + self._language = hass.config.language or DEFAULT_LANG + _LOGGER.debug("Initialized Baidu Wake Word provider with language: %s", self._language) + + @property + def supported_languages(self): + """Return list of supported languages.""" + return SUPPORT_LANGUAGES + + @property + def supported_formats(self): + """Return list of supported formats.""" + return ["wav", "pcm"] + + @property + def supported_sample_rates(self): + """Return list of supported sample rates.""" + return [16000] + + @property + def supported_channels(self): + """Return list of supported channels.""" + return [1] + + async def async_process_audio_stream(self, stream, options=None): + """Process an audio stream to wake word service.""" + _LOGGER.debug("Processing audio stream for wake word detection") + options = options or {} + language = options.get("language", self._language) + _LOGGER.debug("Using language: %s", language) + + try: + # 读取音频流 + audio_data = b"" + async for chunk in stream: + if chunk: + audio_data += chunk + _LOGGER.debug("Received audio chunk of size: %d", len(chunk)) + + if not audio_data: + _LOGGER.warning("No audio data received") + return WakeWordDetectionResult( + state=WakeWordDetectionResultState.ERROR, + wake_word=None, + ) + + _LOGGER.debug("Total audio data size: %d bytes", len(audio_data)) + + def _process_audio(): + try: + # 使用百度语音识别API进行唤醒词检测 + result = self._client.asr(audio_data, 'pcm', 16000, { + 'dev_pid': 1536 if language == 'zh' else 1737, # 1536: 普通话, 1737: 英语 + }) + + _LOGGER.debug("ASR result: %s", result) + + if result.get('err_no') == 0: + text = result.get('result')[0] + _LOGGER.debug("Recognized text: %s", text) + # 检查是否包含唤醒词 + if self._wake_word in text: + _LOGGER.debug("Wake word detected: %s", self._wake_word) + return self._wake_word + _LOGGER.debug("No wake word detected") + return None + _LOGGER.warning("ASR error: %s", result) + return None + except Exception as ex: + _LOGGER.error("Error during Baidu Wake Word processing: %s", ex, exc_info=True) + return None + + wake_word = await self.hass.async_add_executor_job(_process_audio) + if wake_word is None: + _LOGGER.debug("No wake word detected") + return WakeWordDetectionResult( + state=WakeWordDetectionResultState.ERROR, + wake_word=None, + ) + _LOGGER.debug("Successfully detected wake word: %s", wake_word) + return WakeWordDetectionResult( + state=WakeWordDetectionResultState.SUCCESS, + wake_word=wake_word, + ) + except Exception as ex: + _LOGGER.error("Error during Baidu Wake Word: %s", ex, exc_info=True) + return WakeWordDetectionResult( + state=WakeWordDetectionResultState.ERROR, + wake_word=None, + ) \ No newline at end of file