mirror of
https://github.com/howelljiang/baidu-voice.git
synced 2026-07-21 22:53:57 +08:00
171 lines
5.3 KiB
Python
171 lines
5.3 KiB
Python
"""Config flow for Baidu TTS integration."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import Any
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.config_entries import (
|
|
ConfigEntry,
|
|
ConfigFlow,
|
|
ConfigFlowResult,
|
|
OptionsFlow,
|
|
)
|
|
from homeassistant.core import callback
|
|
|
|
from .const import (
|
|
CONF_API_KEY,
|
|
CONF_APP_ID,
|
|
CONF_SECRET_KEY,
|
|
DOMAIN,
|
|
STT_CONF_LANGUAGE,
|
|
STT_DEFAULT_LANGUAGE,
|
|
STT_LANGUAGES,
|
|
TTS_CONF_FILEFORMAT,
|
|
TTS_CONF_LANGUAGE,
|
|
TTS_CONF_PITCH,
|
|
TTS_CONF_SPEED,
|
|
TTS_CONF_VOICE,
|
|
TTS_CONF_VOLUME,
|
|
TTS_DEFAULT_FILEFORMAT,
|
|
TTS_DEFAULT_LANGUAGE,
|
|
TTS_DEFAULT_PITCH,
|
|
TTS_DEFAULT_SPEED,
|
|
TTS_DEFAULT_VOICE,
|
|
TTS_DEFAULT_VOLUME,
|
|
TTS_FILEFORMAT_MAP,
|
|
TTS_LANGUAGES,
|
|
TTS_SUPPORTED_VOICES,
|
|
)
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
STEP_USER_DATA_SCHEMA = vol.Schema(
|
|
{
|
|
vol.Required(CONF_APP_ID): str,
|
|
vol.Required(CONF_API_KEY): str,
|
|
vol.Required(CONF_SECRET_KEY): str,
|
|
vol.Required(TTS_CONF_LANGUAGE, default=TTS_DEFAULT_LANGUAGE): vol.In(
|
|
TTS_LANGUAGES
|
|
),
|
|
vol.Optional(TTS_CONF_SPEED, default=TTS_DEFAULT_SPEED): vol.All(
|
|
vol.Coerce(int), vol.Range(min=0, max=9)
|
|
),
|
|
vol.Optional(TTS_CONF_PITCH, default=TTS_DEFAULT_PITCH): vol.All(
|
|
vol.Coerce(int), vol.Range(min=0, max=9)
|
|
),
|
|
vol.Optional(TTS_CONF_VOLUME, default=TTS_DEFAULT_VOLUME): vol.All(
|
|
vol.Coerce(int), vol.Range(min=0, max=15)
|
|
),
|
|
vol.Optional(TTS_CONF_VOICE, default=TTS_DEFAULT_VOICE): vol.In(
|
|
TTS_SUPPORTED_VOICES
|
|
),
|
|
vol.Optional(STT_CONF_LANGUAGE, default=STT_DEFAULT_LANGUAGE): vol.In(
|
|
STT_LANGUAGES
|
|
),
|
|
}
|
|
)
|
|
|
|
|
|
class BaiduTTSConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
"""Handle a config flow for Baidu TTS."""
|
|
|
|
VERSION = 1
|
|
|
|
async def async_step_user(
|
|
self, user_input: dict[str, Any] | None = None
|
|
) -> ConfigFlowResult:
|
|
"""Handle the initial step."""
|
|
if user_input is not None:
|
|
# Provide unique ID to prevent duplicate entries
|
|
app_id = user_input[CONF_APP_ID]
|
|
await self.async_set_unique_id(f"baidu_tts_{app_id}")
|
|
self._abort_if_unique_id_configured()
|
|
|
|
return self.async_create_entry(title="百度语音合成", data=user_input)
|
|
|
|
return self.async_show_form(step_id="user", data_schema=STEP_USER_DATA_SCHEMA)
|
|
|
|
@classmethod
|
|
@callback
|
|
def async_get_options_flow(cls, config_entry: ConfigEntry) -> BaiduTTSOptionsFlow:
|
|
"""Get the options flow for this handler."""
|
|
return BaiduTTSOptionsFlow()
|
|
|
|
|
|
class BaiduTTSOptionsFlow(OptionsFlow):
|
|
"""Baidu TTS integration options handler."""
|
|
|
|
async def async_step_init(
|
|
self, user_input: dict[str, Any] | None = None
|
|
) -> ConfigFlowResult:
|
|
"""Manage the options."""
|
|
if user_input is not None:
|
|
return self.async_create_entry(title="", data=user_input)
|
|
|
|
options = self.config_entry.options
|
|
data = self.config_entry.data
|
|
|
|
schema = {
|
|
vol.Required(
|
|
CONF_APP_ID,
|
|
default=options.get(CONF_APP_ID, data.get(CONF_APP_ID)),
|
|
): str,
|
|
vol.Required(
|
|
CONF_API_KEY,
|
|
default=options.get(CONF_API_KEY, data.get(CONF_API_KEY)),
|
|
): str,
|
|
vol.Required(
|
|
CONF_SECRET_KEY,
|
|
default=options.get(CONF_SECRET_KEY, data.get(CONF_SECRET_KEY)),
|
|
): str,
|
|
vol.Required(
|
|
TTS_CONF_LANGUAGE,
|
|
default=options.get(TTS_CONF_LANGUAGE, data.get(TTS_CONF_LANGUAGE)),
|
|
): vol.In(TTS_LANGUAGES),
|
|
vol.Optional(
|
|
TTS_CONF_SPEED,
|
|
default=options.get(
|
|
TTS_CONF_SPEED, data.get(TTS_CONF_SPEED, TTS_DEFAULT_SPEED)
|
|
),
|
|
): vol.All(vol.Coerce(int), vol.Range(min=0, max=9)),
|
|
vol.Optional(
|
|
TTS_CONF_PITCH,
|
|
default=options.get(
|
|
TTS_CONF_PITCH, data.get(TTS_CONF_PITCH, TTS_DEFAULT_PITCH)
|
|
),
|
|
): vol.All(vol.Coerce(int), vol.Range(min=0, max=9)),
|
|
vol.Optional(
|
|
TTS_CONF_VOLUME,
|
|
default=options.get(
|
|
TTS_CONF_VOLUME, data.get(TTS_CONF_VOLUME, TTS_DEFAULT_VOLUME)
|
|
),
|
|
): vol.All(vol.Coerce(int), vol.Range(min=0, max=15)),
|
|
vol.Optional(
|
|
TTS_CONF_VOICE,
|
|
default=options.get(
|
|
TTS_CONF_VOICE, data.get(TTS_CONF_VOICE, TTS_DEFAULT_VOICE)
|
|
),
|
|
): vol.In(TTS_SUPPORTED_VOICES),
|
|
vol.Optional(
|
|
TTS_CONF_FILEFORMAT,
|
|
default=options.get(
|
|
TTS_CONF_FILEFORMAT,
|
|
data.get(TTS_CONF_FILEFORMAT, TTS_DEFAULT_FILEFORMAT),
|
|
),
|
|
): vol.In(TTS_FILEFORMAT_MAP),
|
|
vol.Optional(
|
|
STT_CONF_LANGUAGE,
|
|
default=options.get(
|
|
STT_CONF_LANGUAGE, data.get(STT_CONF_LANGUAGE, STT_DEFAULT_LANGUAGE)
|
|
),
|
|
): vol.In(STT_LANGUAGES),
|
|
}
|
|
|
|
return self.async_show_form(
|
|
step_id="init",
|
|
data_schema=vol.Schema(schema),
|
|
)
|