mirror of
https://github.com/howelljiang/baidu-voice.git
synced 2026-07-22 07:03:54 +08:00
init
This commit is contained in:
+145
@@ -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
|
||||
Reference in New Issue
Block a user