From 11751babd1bba05aec74712b772e65e7d6f7ef32 Mon Sep 17 00:00:00 2001 From: Howell Jiang Date: Fri, 18 Apr 2025 00:00:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E7=9A=84=E9=80=89=E9=A1=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 18 ++ README.md | 120 ++++++++- config_flow.py | 178 ------------- const.py | 45 ---- .../baidu_voice/__init__.py | 35 +-- custom_components/baidu_voice/config_flow.py | 170 ++++++++++++ custom_components/baidu_voice/const.py | 141 ++++++++++ custom_components/baidu_voice/hacs.json | 6 + .../baidu_voice/icon.png | Bin custom_components/baidu_voice/info.md | 19 ++ custom_components/baidu_voice/manifest.json | 17 ++ .../baidu_voice/quality_scale.yaml | 60 +++++ custom_components/baidu_voice/strings.json | 21 ++ custom_components/baidu_voice/stt.py | 147 +++++++++++ .../baidu_voice/translations/en.json | 58 ++++ .../baidu_voice/translations/zh-Hans.json | 58 ++++ custom_components/baidu_voice/tts.py | 249 ++++++++++++++++++ hacs.json | 6 + manifest.json | 12 - settings.png | Bin 0 -> 64674 bytes stt.py | 120 --------- test2audio.pcm | Bin 64640 -> 0 bytes test_baidu_api.py | 111 -------- text2audio.pcm | Bin 64640 -> 0 bytes tts.py | 93 ------- tts_test.mp3 | Bin 15840 -> 0 bytes 26 files changed, 1097 insertions(+), 587 deletions(-) create mode 100644 .gitignore delete mode 100644 config_flow.py delete mode 100644 const.py rename __init__.py => custom_components/baidu_voice/__init__.py (56%) create mode 100644 custom_components/baidu_voice/config_flow.py create mode 100644 custom_components/baidu_voice/const.py create mode 100644 custom_components/baidu_voice/hacs.json rename icon.png => custom_components/baidu_voice/icon.png (100%) create mode 100644 custom_components/baidu_voice/info.md create mode 100644 custom_components/baidu_voice/manifest.json create mode 100644 custom_components/baidu_voice/quality_scale.yaml create mode 100644 custom_components/baidu_voice/strings.json create mode 100644 custom_components/baidu_voice/stt.py create mode 100644 custom_components/baidu_voice/translations/en.json create mode 100644 custom_components/baidu_voice/translations/zh-Hans.json create mode 100644 custom_components/baidu_voice/tts.py create mode 100644 hacs.json delete mode 100644 manifest.json create mode 100644 settings.png delete mode 100644 stt.py delete mode 100644 test2audio.pcm delete mode 100644 test_baidu_api.py delete mode 100644 text2audio.pcm delete mode 100644 tts.py delete mode 100644 tts_test.mp3 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..19b6976 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# 音频文件 +*.pcm +*.mp3 + +# Python +__pycache__/ +*.py[cod] +*$py.class + +# 环境文件 +.env +.venv +env/ +venv/ + +# IDE +.idea/ +.vscode/ \ No newline at end of file diff --git a/README.md b/README.md index bb14c2b..5ef4f11 100644 --- a/README.md +++ b/README.md @@ -8,19 +8,127 @@ 2. 开通以下服务: - 短语音识别服务 - 短文本在线合成服务 - + - 其它的语音库根据需求自行开通 +## 安装方式 + 将baidu_voice目录复制到HomeAssistant的config/custom_components目录下,重新启动HomeAssistant即可。 ## 配置步骤 -1. 在百度云控制台创建应用并获取 API Key 和 Secret Key +1. 在百度云控制台创建应用并获取 APP ID、API Key 和 Secret Key 2. 在 Home Assistant 中添加 baidu_voice 集成 -3. 输入您的 API Key 和 Secret Key - +3. 输入您的 APP ID、API Key 和 Secret Key,输入其它的默认设置参数 ## 配置截图 -![百度tts语音服务配置](baidu1.png) -![百度stt语音服务配置](baidu2.png) +![百度tts语音服务配置](settings.png) + + +##参考资料 + +[短语音识别标准版API](https://ai.baidu.com/ai-doc/SPEECH/Jlbxdezuf) + +[短文本在线合成API](https://ai.baidu.com/ai-doc/SPEECH/mlbxh7xie) ## 注意事项 - 本集成需要互联网连接 - 使用百度语音服务可能会产生费用,请参考百度云官方计费标准 + + + + +## 百度智能云服务开通界面 + +![百度tts语音服务配置](baidu1.png) +![百度stt语音服务配置](baidu2.png) + +## 百度语音合成音色列表 +[TTS全部音色查询](https://ai.baidu.com/ai-doc/SPEECH/Rluv3uq3d) + +### 基础音库 + +| 音色ID | 音色名称 | 性别 | 描述 | +|--------|----------|------|------| +| 0 | 度小美 | 女 | 标准女主播 | +| 1 | 度小宇 | 男 | 亲切男声 | +| 3 | 度逍遥 | 男 | 情感男声 | +| 4 | 度丫丫 | 女 | 童声 | +| 5 | 度小娇 | 女 | 成熟女主播 | + +### 精品音库 + +| 音色ID | 音色名称 | 性别 | 描述 | +|--------|----------|------|------| +| 5003 | 度逍遥 | 男 | 情感男声 | +| 5118 | 度小鹿 | 女 | 甜美女声 | +| 106 | 度博文 | 男 | 专业男主播 | +| 103 | 度米朵 | 女 | 可爱童声 | +| 110 | 度小童 | 女 | 童声主播 | +| 111 | 度小萌 | 女 | 软萌妹子 | + +### 臻品音库 + +| 音色ID | 音色名称 | 性别 | 描述 | +|--------|----------|------|------| +| 4003 | 度逍遥 | 男 | 情感男声 | +| 4106 | 度博文 | 男 | 专业男主播 | +| 4115 | 度小贤 | 男 | 电台男主播 | +| 5147 | 度常盈 | 女 | 电台女主播 | +| 5976 | 度小皮 | 女 | 萌娃童声 | +| 5971 | 度皮特 | 男 | 老外男声 | +| 4164 | 度阿肯 | 男 | 主播男声 | +| 4176 | 度有为 | 男 | 磁性男声 | +| 4259 | 度小新 | 女 | 播音女声 | +| 4119 | 度小鹿 | 女 | 甜美女声 | +| 4105 | 度灵儿 | 女 | 清激女声 | +| 4117 | 度小乔 | 女 | 活泼女声 | +| 4288 | 度晴岚 | 女 | 甜美女声 | +| 4192 | 度青川 | 男 | 温柔男声 | +| 4100 | 度小雯 | 女 | 活力女主播 | +| 4103 | 度米朵 | 女 | 可爱女声 | +| 4144 | 度姗姗 | 女 | 娱乐女声 | +| 4278 | 度小贝 | 女 | 知识女主播 | +| 4143 | 度清风 | 男 | 配音男声 | +| 4140 | 度小新 | 女 | 专业女主播 | +| 4129 | 度小彦 | 男 | 知识男主播 | +| 4149 | 度星河 | 男 | 广告男声 | +| 4254 | 度小清 | 女 | 广告女声 | +| 4206 | 度博文 | 男 | 综艺男声 | +| 4147 | 度云朵 | 女 | 可爱童声 | +| 4141 | 度婉婉 | 女 | 甜美女声 | +| 4226 | 南方 | 女 | 电台女主播 | +| 6205 | 度悠然 | 男 | 旁白男声 | +| 6221 | 度云萱 | 女 | 旁白女声 | +| 6546 | 度清豪 | 男 | 逍遥侠客 | +| 6602 | 度清柔 | 男 | 温柔男神 | +| 6562 | 度雨楠 | 女 | 元气少女 | +| 6543 | 度雨萌 | 女 | 邻家女孩 | +| 6747 | 度书古 | 男 | 情感男声 | +| 6748 | 度书严 | 男 | 沉稳男声 | +| 6746 | 度书道 | 男 | 沉稳男声 | +| 6644 | 度书宁 | 女 | 亲和女声 | +| 4148 | 度小夏 | 女 | 甜美女声 | +| 4277 | 西贝 | 女 | 脱口秀女声 | +| 4114 | 阿龙 | 男 | 说书男声 | + +### 大模型音库 + +| 音色ID | 音色名称 | 性别 | 描述 | +|--------|----------|------|------| +| 4179 | 度泽言 | 男 | 温暖男声 | +| 4146 | 度禧禧 | 女 | 阳光女声 | +| 6567 | 度小柔 | 女 | 温柔女声 | +| 4189 | 度涵竹 | 女 | 温暖女声 | +| 4194 | 度嫣然 | 女 | 甜美主播 | +| 4193 | 度泽言 | 男 | 温暖男声 | +| 4195 | 度怀安 | 男 | 沉稳男声 | +| 4196 | 度清影 | 女 | 清亮女声 | +| 4197 | 度沁遥 | 女 | 温柔女声 | +| 20100 | 度小粤 | 女 | 粤语女声 | +| 20101 | 度晓芸 | 女 | 粤语女声 | +| 4257 | 四川小哥 | 男 | 四川方言 | +| 4132 | 度阿闽 | 男 | 闽南语男声 | +| 4139 | 度小蓉 | 女 | 四川方言 | +| 5977 | 台媒女声 | 女 | 台湾腔 | +| 4007 | 度小台 | 女 | 台湾腔 | +| 4150 | 度湘玉 | 女 | 湖南方言 | +| 4134 | 度阿锦 | 男 | 粤语男声 | +| 4172 | 度筱林 | 女 | 温柔女声 | diff --git a/config_flow.py b/config_flow.py deleted file mode 100644 index 0f1a3db..0000000 --- a/config_flow.py +++ /dev/null @@ -1,178 +0,0 @@ -"""百度语音配置流程.""" -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 deleted file mode 100644 index ab9b558..0000000 --- a/const.py +++ /dev/null @@ -1,45 +0,0 @@ -"""百度语音常量.""" -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/__init__.py b/custom_components/baidu_voice/__init__.py similarity index 56% rename from __init__.py rename to custom_components/baidu_voice/__init__.py index 09f3dc6..2893852 100644 --- a/__init__.py +++ b/custom_components/baidu_voice/__init__.py @@ -1,49 +1,40 @@ -"""百度语音集成.""" +"""Integration for Baidu Voice services.""" + import logging -from typing import Any, Dict from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant -from homeassistant.helpers import config_validation as cv -from aip import AipSpeech +from homeassistant.helpers.typing import ConfigType -from .const import ( - DOMAIN, - CONF_APP_ID, - CONF_API_KEY, - CONF_SECRET_KEY, -) +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = cv.deprecated(DOMAIN) +PLATFORMS = ["stt", "tts"] -PLATFORMS = ["tts", "stt"] -async def async_setup(hass: HomeAssistant, config: Dict[str, Any]) -> bool: +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """设置百度语音集成.""" return True + async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """设置百度语音配置项.""" # 存储配置数据 hass.data.setdefault(DOMAIN, {}) - 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], - } - + hass.data[DOMAIN] = entry.data.copy() # 保存所有配置数据 + # 加载平台 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) return True + async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """卸载百度语音配置项.""" # 卸载平台 unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - + if unload_ok: hass.data.pop(DOMAIN) - - return unload_ok \ No newline at end of file + + return unload_ok diff --git a/custom_components/baidu_voice/config_flow.py b/custom_components/baidu_voice/config_flow.py new file mode 100644 index 0000000..7de9778 --- /dev/null +++ b/custom_components/baidu_voice/config_flow.py @@ -0,0 +1,170 @@ +"""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), + ) diff --git a/custom_components/baidu_voice/const.py b/custom_components/baidu_voice/const.py new file mode 100644 index 0000000..baec114 --- /dev/null +++ b/custom_components/baidu_voice/const.py @@ -0,0 +1,141 @@ +"""百度语音常量定义.""" + +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" + +# 通用选项 +TTS_CONF_LANGUAGE: Final = "language" +TTS_CONF_VOICE: Final = "voice" +TTS_CONF_VOLUME: Final = "volume" +TTS_CONF_SPEED: Final = "speed" +TTS_CONF_PITCH: Final = "pitch" +TTS_CONF_FILEFORMAT: Final = "fileformat" + +# TTS语言选项 +TTS_LANGUAGES: Final = {"zh": "简体中文", "en": "English"} +TTS_DEFAULT_LANGUAGE: Final = "zh" + +# TTS格式映射 +TTS_FILEFORMAT_MAP: Final = { + 3: "mp3", # mp3-16k/24k + 4: "pcm", # pcm-16k/24k + 5: "pcm8k", # pcm-8k + 6: "wav", # wav(同pcm-16k/24k) +} + +# 定义支持的语音选项 +TTS_SUPPORTED_VOICES = { + 0: "度小美-标准女主播", + 1: "度小宇-亲切男声", + 3: "度逍遥-情感男声", + 4: "度丫丫-童声", + 5: "度小娇-成熟女主播", + 5003: "度逍遥-情感男声", + 5118: "度小鹿-甜美女声", + 106: "度博文-专业男主播", + 103: "度米朵-可爱童声", + 110: "度小童-童声主播", + 111: "度小萌-软萌妹子", + 4003: "度逍遥-情感男声", + 4106: "度博文-专业男主播", + 4115: "度小贤-电台男主播", + 5147: "度常盈-电台女主播", + 5976: "度小皮-萌娃童声", + 5971: "度皮特-老外男声", + 4164: "度阿肯-主播男声", + 4176: "度有为-磁性男声", + 4259: "度小新-播音女声", + 4119: "度小鹿-甜美女声", + 4105: "度灵儿-清激女声", + 4117: "度小乔-活泼女声", + 4288: "度晴岚-甜美女声", + 4192: "度青川-温柔男声", + 4100: "度小雯-活力女主播", + 4103: "度米朵-可爱女声", + 4144: "度姗姗-娱乐女声", + 4278: "度小贝-知识女主播", + 4143: "度清风-配音男声", + 4140: "度小新-专业女主播", + 4129: "度小彦-知识男主播", + 4149: "度星河-广告男声", + 4254: "度小清-广告女声", + 4206: "度博文-综艺男声", + 4147: "度云朵-可爱童声", + 4141: "度婉婉-甜美女声", + 4226: "南方-电台女主播", + 6205: "度悠然-旁白男声", + 6221: "度云萱-旁白女声", + 6546: "度清豪-逍遥侠客", + 6602: "度清柔-温柔男神", + 6562: "度雨楠-元气少女", + 6543: "度雨萌-邻家女孩", + 6747: "度书古-情感男声", + 6748: "度书严-沉稳男声", + 6746: "度书道-沉稳男声", + 6644: "度书宁-亲和女声", + 4148: "度小夏-甜美女声", + 4277: "西贝-脱口秀女声", + 4114: "阿龙-说书男声", + 4179: "度泽言-温暖男声", + 4146: "度禧禧-阳光女声", + 6567: "度小柔-温柔女声", + 4156: "度言浩-年轻男声", + 4189: "度涵竹-开朗女声", + 4194: "度嫣然-活泼女声", + 4193: "度泽言-开朗男声", + 4195: "度怀安-磁性男声", + 4196: "度清影-甜美女声", + 4197: "度沁遥-知性女声", + 20100: "度小粤-粤语女声", + 20101: "度晓芸-粤语女声", + 4257: "四川小哥-四川男声", + 4132: "度阿闽-闽南男声", + 4139: "度小蓉-四川女声", + 5977: "台媒女声-台湾女声", + 4007: "度小台-台湾女声", + 4150: "度湘玉-陕西女声", + 4134: "度阿锦-东北女声", + 4172: "度筱林-天津女声", + 5980: "度阿花-上海女声", + 4154: "度老崔-北京男声", +} + +# 默认值 +TTS_DEFAULT_VOLUME: Final = 5 +TTS_DEFAULT_SPEED: Final = 5 +TTS_DEFAULT_PITCH: Final = 5 +TTS_DEFAULT_VOICE: Final = 0 +TTS_DEFAULT_FILEFORMAT: Final = 3 # 默认音频格式 MP3 + +# 范围限制 +TTS_VOLUME_RANGE: Final = (0, 15) +TTS_SPEED_RANGE: Final = (0, 9) +TTS_PITCH_RANGE: Final = (0, 9) + +# 语言选项 +STT_LANGUAGES: Final = { + "zh-CN": "普通话", + "en-US": "英语", + "zh-HK": "粤语", + "zh-TW": "四川话", +} +STT_LANGUAGES_CODE_MAP: Final = { + "zh-CN": 1537, + "en-US": 1737, + "zh-HK": 1637, + "zh-TW": 1837, +} +# STT配置项 +STT_CONF_LANGUAGE: Final = "stt_language" + +# STT语言选项 +STT_DEFAULT_LANGUAGE: Final = "zh-CN" # 默认使用普通话 + +# 错误码 +ERROR_INVALID_AUTH: Final = "invalid_auth" diff --git a/custom_components/baidu_voice/hacs.json b/custom_components/baidu_voice/hacs.json new file mode 100644 index 0000000..c25719e --- /dev/null +++ b/custom_components/baidu_voice/hacs.json @@ -0,0 +1,6 @@ +{ + "name": "Baidu Voice", + "domains": ["tts", "stt"], + "homeassistant": "2023.1.0", + "render_readme": true +} \ No newline at end of file diff --git a/icon.png b/custom_components/baidu_voice/icon.png similarity index 100% rename from icon.png rename to custom_components/baidu_voice/icon.png diff --git a/custom_components/baidu_voice/info.md b/custom_components/baidu_voice/info.md new file mode 100644 index 0000000..b481f62 --- /dev/null +++ b/custom_components/baidu_voice/info.md @@ -0,0 +1,19 @@ +# 百度语音服务集成 + +这是一个 Home Assistant 集成,用于接入百度语音服务,提供文本转语音(TTS)和语音转文本(STT)功能。 + +## 主要功能 + +- 文本转语音(TTS) +- 语音转文本(STT) +- 支持多种音色选择 +- 支持多种音频格式 +- 支持多种语言 + +## 配置要求 + +1. 需要在百度云创建应用 +2. 开通以下服务: + - 短语音识别服务 + - 短文本在线合成服务 + - 其它的语音库根据需求自行开通 \ No newline at end of file diff --git a/custom_components/baidu_voice/manifest.json b/custom_components/baidu_voice/manifest.json new file mode 100644 index 0000000..2bdfd4e --- /dev/null +++ b/custom_components/baidu_voice/manifest.json @@ -0,0 +1,17 @@ +{ + "domain": "baidu_voice", + "name": "Baidu Voice", + "codeowners": [ + "@howelljiang" + ], + "config_flow": true, + "dependencies": [], + "documentation": "https://github.com/howelljiang/baidu-voice", + "iot_class": "cloud_push", + "quality_scale": "bronze", + "requirements": [ + "baidu-aip == 4.16.10", "chardet==5.2.0" + ], + "version": "0.0.1", + "issue_tracker": "https://github.com/howelljiang/baidu-voice/issues" +} diff --git a/custom_components/baidu_voice/quality_scale.yaml b/custom_components/baidu_voice/quality_scale.yaml new file mode 100644 index 0000000..201a916 --- /dev/null +++ b/custom_components/baidu_voice/quality_scale.yaml @@ -0,0 +1,60 @@ +rules: + # Bronze + action-setup: todo + appropriate-polling: todo + brands: todo + common-modules: todo + config-flow-test-coverage: todo + config-flow: todo + dependency-transparency: todo + docs-actions: todo + docs-high-level-description: todo + docs-installation-instructions: todo + docs-removal-instructions: todo + entity-event-setup: todo + entity-unique-id: todo + has-entity-name: todo + runtime-data: todo + test-before-configure: todo + test-before-setup: todo + unique-config-entry: todo + + # Silver + action-exceptions: todo + config-entry-unloading: todo + docs-configuration-parameters: todo + docs-installation-parameters: todo + entity-unavailable: todo + integration-owner: todo + log-when-unavailable: todo + parallel-updates: todo + reauthentication-flow: todo + test-coverage: todo + + # Gold + devices: todo + diagnostics: todo + discovery-update-info: todo + discovery: todo + docs-data-update: todo + docs-examples: todo + docs-known-limitations: todo + docs-supported-devices: todo + docs-supported-functions: todo + docs-troubleshooting: todo + docs-use-cases: todo + dynamic-devices: todo + entity-category: todo + entity-device-class: todo + entity-disabled-by-default: todo + entity-translations: todo + exception-translations: todo + icon-translations: todo + reconfiguration-flow: todo + repair-issues: todo + stale-devices: todo + + # Platinum + async-dependency: todo + inject-websession: todo + strict-typing: todo diff --git a/custom_components/baidu_voice/strings.json b/custom_components/baidu_voice/strings.json new file mode 100644 index 0000000..d6e3212 --- /dev/null +++ b/custom_components/baidu_voice/strings.json @@ -0,0 +1,21 @@ +{ + "config": { + "step": { + "user": { + "data": { + "host": "[%key:common::config_flow::data::host%]", + "username": "[%key:common::config_flow::data::username%]", + "password": "[%key:common::config_flow::data::password%]" + } + } + }, + "error": { + "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", + "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", + "unknown": "[%key:common::config_flow::error::unknown%]" + }, + "abort": { + "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" + } + } +} diff --git a/custom_components/baidu_voice/stt.py b/custom_components/baidu_voice/stt.py new file mode 100644 index 0000000..0ac21e1 --- /dev/null +++ b/custom_components/baidu_voice/stt.py @@ -0,0 +1,147 @@ +"""Support for Baidu speech recognition.""" + +from __future__ import annotations + +import logging +from typing import Any + +from aip import AipSpeech + +from homeassistant.components import stt +from homeassistant.components.stt import ( + AudioBitRates, + AudioChannels, + AudioCodecs, + AudioFormats, + AudioSampleRates, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback + +from .const import ( + CONF_API_KEY, + CONF_APP_ID, + CONF_SECRET_KEY, + STT_DEFAULT_LANGUAGE, + STT_LANGUAGES_CODE_MAP, +) + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddConfigEntryEntitiesCallback, +) -> None: + """Set up Baidu STT platform via config entry.""" + async_add_entities( + [ + BaiduSTTEntity(hass, config_entry.data), + ] + ) + + +class BaiduSTTEntity(stt.SpeechToTextEntity): + """Baidu speech-to-text entity.""" + + def __init__(self, hass: HomeAssistant, config: dict[str, Any]) -> None: + """Initialize Baidu speech-to-text entity.""" + super().__init__() + self.hass = hass + self._config = config + self._client = AipSpeech( + config[CONF_APP_ID], + config[CONF_API_KEY], + config[CONF_SECRET_KEY], + ) + self._attr_name = "Baidu STT" + self._attr_unique_id = f"baidu_stt_{config[CONF_APP_ID]}" + + @property + def supported_languages(self) -> list[str]: + """Return list of supported languages.""" + return ["zh-CN", "en-US", "yue-CN", "sichuan-CN"] + + @property + def supported_formats(self) -> list[str]: + """Return list of supported formats.""" + return [AudioFormats.WAV, "pcm"] + + @property + def supported_codecs(self) -> list[str]: + """Return list of supported codecs.""" + return [AudioCodecs.PCM] + + @property + def supported_bit_rates(self) -> list[int]: + """Return list of supported bit rates.""" + return [AudioBitRates.BITRATE_8, AudioBitRates.BITRATE_16] + + @property + def supported_sample_rates(self) -> list[int]: + """Return list of supported sample rates.""" + return [AudioSampleRates.SAMPLERATE_8000, AudioSampleRates.SAMPLERATE_16000] + + @property + def supported_channels(self) -> list[int]: + """Return list of supported channels.""" + return [AudioChannels.CHANNEL_MONO] + + async def async_process_audio_stream( + self, metadata: stt.SpeechMetadata, stream: stt.AudioStream + ) -> stt.SpeechResult: + """Process an audio stream for speech recognition.""" + try: + audio_data = b"" + async for chunk in stream: + audio_data += chunk + _LOGGER.debug("Metadata: %s", metadata) + result = await self.hass.async_add_executor_job( + self._client.asr, + audio_data, + metadata.format, + metadata.sample_rate, + { + "dev_pid": STT_LANGUAGES_CODE_MAP.get( + metadata.language, STT_DEFAULT_LANGUAGE + ), + "channel": metadata.channel, + }, + ) + + if not isinstance(result, dict): + return stt.SpeechResult( + text=None, + result=stt.SpeechResultState.ERROR, + ) + + if "err_no" in result and result["err_no"] != 0: + _LOGGER.debug( + "Error from Baidu API: %s - %s", + result.get("err_msg", "Unknown error"), + result.get("err_detail", "No details"), + ) + return stt.SpeechResult( + text=None, + result=stt.SpeechResultState.ERROR, + ) + + if "result" not in result or not result["result"]: + return stt.SpeechResult( + text=None, + result=stt.SpeechResultState.NO_SPEECH_DETECTED, + ) + + return stt.SpeechResult( + text=result["result"][0], + result=stt.SpeechResultState.SUCCESS, + ) + + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Error processing Baidu STT") + return stt.SpeechResult( + text=None, + result=stt.SpeechResultState.ERROR, + ) diff --git a/custom_components/baidu_voice/translations/en.json b/custom_components/baidu_voice/translations/en.json new file mode 100644 index 0000000..e3ffda3 --- /dev/null +++ b/custom_components/baidu_voice/translations/en.json @@ -0,0 +1,58 @@ +{ + "config": { + "abort": { + "already_configured": "Service is already configured" + }, + "error": { + "cannot_connect": "Failed to connect", + "invalid_auth": "Invalid authentication", + "unknown": "Unexpected error", + "auth": "Authentication failed", + "test_success": "Connection test successful" + }, + "step": { + "user": { + "title": "Setup Baidu Voice", + "description": "Please enter your Baidu Voice API credentials and TTS settings", + "data": { + "app_id": "App ID", + "api_key": "API Key", + "secret_key": "Secret Key", + "language": "TTS Language", + "stt_language": "STT Language", + "volume": "Volume (0-15)", + "speed": "Speed (0-9)", + "pitch": "Pitch (0-9)", + "voice": "Voice", + "fileformat": "Audio Format", + "test_connection": "Test Connection" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "Update Baidu Voice Settings", + "description": "Modify Baidu Voice settings", + "data": { + "app_id": "App ID", + "api_key": "API Key", + "secret_key": "Secret Key", + "language": "TTS Language", + "stt_language": "STT Language", + "volume": "Volume (0-15)", + "speed": "Speed (0-9)", + "pitch": "Pitch (0-9)", + "voice": "Voice", + "fileformat": "Audio Format", + "test_connection": "Test Connection" + } + } + }, + "error": { + "auth": "Authentication failed", + "test_success": "Connection test successful" + } + } +} \ No newline at end of file diff --git a/custom_components/baidu_voice/translations/zh-Hans.json b/custom_components/baidu_voice/translations/zh-Hans.json new file mode 100644 index 0000000..96985fb --- /dev/null +++ b/custom_components/baidu_voice/translations/zh-Hans.json @@ -0,0 +1,58 @@ +{ + "config": { + "abort": { + "already_configured": "服务已经配置" + }, + "error": { + "cannot_connect": "连接失败", + "invalid_auth": "验证无效", + "unknown": "未知错误", + "auth": "认证失败", + "test_success": "连接测试成功" + }, + "step": { + "user": { + "title": "设置百度语音", + "description": "请输入百度语音API凭据和TTS设置", + "data": { + "app_id": "应用ID", + "api_key": "API密钥", + "secret_key": "密钥", + "language": "TTS语言", + "stt_language": "STT语言", + "volume": "音量 (0-15)", + "speed": "语速 (0-9)", + "pitch": "音调 (0-9)", + "voice": "发音人", + "fileformat": "音频格式", + "test_connection": "测试连接" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "更新百度语音设置", + "description": "修改百度语音设置", + "data": { + "app_id": "应用ID", + "api_key": "API密钥", + "secret_key": "密钥", + "language": "TTS语言", + "stt_language": "STT语言", + "volume": "音量 (0-15)", + "speed": "语速 (0-9)", + "pitch": "音调 (0-9)", + "voice": "发音人", + "fileformat": "音频格式", + "test_connection": "测试连接" + } + } + }, + "error": { + "auth": "认证失败", + "test_success": "连接测试成功" + } + } +} \ No newline at end of file diff --git a/custom_components/baidu_voice/tts.py b/custom_components/baidu_voice/tts.py new file mode 100644 index 0000000..3c97f82 --- /dev/null +++ b/custom_components/baidu_voice/tts.py @@ -0,0 +1,249 @@ +"""Support for Baidu TTS.""" + +from __future__ import annotations + +import logging +from typing import Any + +from aip import AipSpeech + +from homeassistant.components.tts import ( + TextToSpeechEntity, + TtsAudioType, + Voice, + callback, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.exceptions import HomeAssistantError +from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo + +from .const import ( + CONF_API_KEY, + CONF_APP_ID, + CONF_SECRET_KEY, + DOMAIN, + 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__) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities, +) -> None: + """Set up Baidu TTS from a config entry.""" + _LOGGER.debug("Setting up Baidu TTS") + entity = BaiduTTSEntity(hass, config_entry) + async_add_entities([entity]) + + +class BaiduTTSEntity(TextToSpeechEntity): + """Represent a Baidu TTS entity.""" + + def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry) -> None: + """Initialize the Baidu TTS entity.""" + self.hass = hass + self._config_entry = config_entry + + # Generate unique ID and set name + app_id = config_entry.data[CONF_APP_ID] + self._attr_unique_id = f"baidu_tts_{app_id}" + self._attr_name = "百度语音合成" + + # Add device info + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, app_id)}, + name="百度语音", + manufacturer="百度", + model="语音合成服务", + entry_type=DeviceEntryType.SERVICE, + ) + + _LOGGER.debug( + "Initializing Baidu TTS entity with app_id: %s, unique_id: %s, name: %s", + app_id, + self._attr_unique_id, + self._attr_name, + ) + + # Initialize the TTS client + self._client = AipSpeech( + app_id, + config_entry.data[CONF_API_KEY], + config_entry.data[CONF_SECRET_KEY], + ) + + @property + def default_language(self) -> str: + """Return the default language.""" + _LOGGER.debug("Getting default language: %s", TTS_DEFAULT_LANGUAGE) + return TTS_DEFAULT_LANGUAGE + + @property + def supported_languages(self) -> list[str]: + """Return a list of supported languages.""" + languages = list(TTS_LANGUAGES.keys()) + _LOGGER.debug("Getting supported languages: %s", languages) + return languages + + @property + def supported_options(self) -> list[str]: + """Return list of supported options.""" + options = ["speed", "pitch", "volume", "voice", "fileformat"] + _LOGGER.debug("Getting supported options: %s", options) + return options + + @property + def default_options(self) -> dict[str, Any]: + """Return a dict of default options.""" + # Get current values from config_entry.options first, then data, then fall back to defaults + options = { + "speed": self._config_entry.options.get( + "speed", self._config_entry.data.get("speed", TTS_DEFAULT_SPEED) + ), + "pitch": self._config_entry.options.get( + "pitch", self._config_entry.data.get("pitch", TTS_DEFAULT_PITCH) + ), + "volume": self._config_entry.options.get( + "volume", self._config_entry.data.get("volume", TTS_DEFAULT_VOLUME) + ), + "voice": self._config_entry.options.get( + "voice", self._config_entry.data.get("voice", TTS_DEFAULT_VOICE) + ), + "fileformat": self._config_entry.options.get( + "fileformat", + self._config_entry.data.get("fileformat", TTS_DEFAULT_FILEFORMAT), + ), + } + _LOGGER.debug("Getting default options: %s", options) + return options + + @callback + def async_get_supported_voices(self, language: str) -> list[Voice] | None: + """Return a list of supported voices for a language.""" + voices = [] + for voice_id, voice_name in TTS_SUPPORTED_VOICES.items(): + voices.append(Voice(str(voice_id), voice_name)) + _LOGGER.debug("Getting supported voices for language %s: %s", language, voices) + return voices + + def get_tts_audio( + self, message: str, language: str, options: dict[str, Any] + ) -> TtsAudioType: + """Get TTS audio from Baidu.""" + _LOGGER.debug("=================== TTS Debug Info Start ===================") + _LOGGER.debug("Message: %s", message) + _LOGGER.debug("Language: %s", language) + _LOGGER.debug("Raw options dict: %s", options) + _LOGGER.debug("Config entry data: %s", self._config_entry.data) + _LOGGER.debug("Config entry options: %s", self._config_entry.options) + + # 获取配置值,优先级:options > config_entry.options > config_entry.data > 默认值 + try: + speed = int( + options.get("speed") + or self._config_entry.options.get("speed") + or self._config_entry.data.get("speed") + or TTS_DEFAULT_SPEED + ) + pitch = int( + options.get("pitch") + or self._config_entry.options.get("pitch") + or self._config_entry.data.get("pitch") + or TTS_DEFAULT_PITCH + ) + volume = int( + options.get("volume") + or self._config_entry.options.get("volume") + or self._config_entry.data.get("volume") + or TTS_DEFAULT_VOLUME + ) + voice = int( + options.get("voice") + or self._config_entry.options.get("voice") + or self._config_entry.data.get("voice") + or TTS_DEFAULT_VOICE + ) + fileformat = int( + options.get("fileformat") + or self._config_entry.options.get("fileformat") + or self._config_entry.data.get("fileformat") + or TTS_DEFAULT_FILEFORMAT + ) + + _LOGGER.debug( + "Parsed values - speed: %s(%s), pitch: %s(%s), volume: %s(%s), " + "voice: %s(%s), fileformat: %s(%s)", + speed, + type(speed), + pitch, + type(pitch), + volume, + type(volume), + voice, + type(voice), + fileformat, + type(fileformat), + ) + + except ValueError as ex: + _LOGGER.error("Error parsing options: %s", ex) + raise HomeAssistantError(f"Invalid option value: {ex}") from ex + + # 获取音频格式 + format_config = TTS_FILEFORMAT_MAP.get(fileformat, TTS_FILEFORMAT_MAP[6]) + _LOGGER.debug("Using audio format: %s", format_config) + + # 准备API参数 + api_params = { + "spd": speed, + "pit": pitch, + "vol": volume, + "per": voice, + "aue": fileformat, + } + _LOGGER.debug("API parameters: %s", api_params) + + try: + _LOGGER.debug("Calling Baidu TTS API") + result = self._client.synthesis( + message, + language, + 1, # Use standard voice synthesis + api_params, + ) + + if isinstance(result, dict): + error_msg = result.get("err_msg", "Unknown error") + error_no = result.get("err_no", "Unknown") + _LOGGER.error( + "Baidu TTS API error - error_no: %s, error_msg: %s, full_result: %s", + error_no, + error_msg, + result, + ) + return None, None + + _LOGGER.debug("Successfully generated audio, size: %d bytes", len(result)) + + except Exception as ex: + _LOGGER.error( + "Error during TTS generation: %s, type: %s", + str(ex), + type(ex).__name__, + ) + raise HomeAssistantError("Failed to generate TTS audio") from ex + + _LOGGER.debug("=================== TTS Debug Info End ===================") + return format_config, result diff --git a/hacs.json b/hacs.json new file mode 100644 index 0000000..d3bf683 --- /dev/null +++ b/hacs.json @@ -0,0 +1,6 @@ +{ + "name": "Baidu Voice", + "render_readme": true, + "domains": ["tts", "stt"], + "homeassistant": "2023.8.0" + } \ No newline at end of file diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 495e785..0000000 --- a/manifest.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "domain": "baidu_voice", - "name": "Baidu Voice", - "documentation": "https://github.com/howelljiang/baidu-voice", - "dependencies": [], - "codeowners": ["@howelljiang"], - "requirements": ["baidu-aip>=4.16.10", "chardet>=5.2.0"], - "version": "0.1.0", - "iot_class": "cloud_push", - "config_flow": true, - "platforms": ["tts", "stt"] -} \ No newline at end of file diff --git a/settings.png b/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..323c45a38fd4b58fb247ca8f658dc280813c5478 GIT binary patch literal 64674 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 literal 0 HcmV?d00001 diff --git a/stt.py b/stt.py deleted file mode 100644 index 3166f63..0000000 --- a/stt.py +++ /dev/null @@ -1,120 +0,0 @@ -"""Baidu Speech-to-Text integration.""" -import logging -from typing import Any - -from aip import AipSpeech -from homeassistant.components.stt import ( - AudioBitRates, - AudioChannels, - AudioCodecs, - AudioFormats, - AudioSampleRates, - SpeechToTextEntity, - SpeechMetadata, - SpeechResult, - SpeechResultState, -) -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__) - -async def async_setup_entry( - hass: HomeAssistant, - config_entry: ConfigEntry, - async_add_entities: AddEntitiesCallback, -) -> bool: - """Set up Baidu STT from a config entry.""" - async_add_entities([BaiduSTTEntity(hass, config_entry)]) - return True - -class BaiduSTTEntity(SpeechToTextEntity): - """Baidu Speech-to-Text entity.""" - - def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry) -> None: - """Initialize Baidu STT entity.""" - self.hass = hass - self._config_entry = config_entry - self._attr_name = "Baidu STT" - self._attr_unique_id = f"{DOMAIN}_stt" - - # 初始化百度语音识别客户端 - self._client = AipSpeech( - config_entry.data["app_id"], - config_entry.data["api_key"], - config_entry.data["secret_key"] - ) - - @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 async_process_audio_stream( - self, metadata: SpeechMetadata, stream: Any - ) -> SpeechResult: - """Process an audio stream to STT service.""" - try: - # 读取音频数据 - audio_data = b"" - async for chunk in stream: - audio_data += chunk - - if not audio_data: - _LOGGER.warning("No audio data received") - return SpeechResult("", SpeechResultState.ERROR) - - _LOGGER.debug("Processing audio stream with metadata: %s", metadata) - _LOGGER.debug("Total audio data size: %d bytes", len(audio_data)) - - # 使用百度语音识别API - result = await self.hass.async_add_executor_job( - self._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) \ No newline at end of file diff --git a/test2audio.pcm b/test2audio.pcm deleted file mode 100644 index 15e6e7b6c89178403e3ae16e98fd541148a19cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64640 zcmcG$1#}&|(k3dYX``7bc9@x&nVFfB6FgyNIAJ`&6J}#Z4U?d{&(Eh?2tRbQ2a(Esd@^TNBozyI?&{?8x(asBT%3;+N7`ad53U%UL@ z)%Cx7{{OdO|0_ED*Yf_qz4c%7{Ga&sf2-I3C))OZr;Oh{=J3ZL{pa8RSYP3rh0lL~ z|F0?a?=lejJ&OP1SpF{Icj^Cr_jkF!OJbk#K?2+re|;A|FMI>TF9At#{X56M-zdCW_(tJh z;Z@;#g};C2DJ-clFa8gi^ZV`JefaOK_*DRW{civ7z7^j4&r$u)>)%g)x2mwM5_}XS zLw&znRQN>vS4;j~_U~Tff3@y+zkj#2Fn8hmg?S6h`mZ$=@<<`Q3rCi5^aB_;;&i@Iiv86!lx3_L7xiq6_%=T z3~ejyrSz-B!g>YxWrSW!kVE56c&D&59n$}zg#vFEmc+P~=R*k&sM8AtB0uB}dGdG$ zPvVI@hYRq_14Y2y!V(cY$%S%k+yYNbP?7<8LQ4v3C@jOu3!sfA=1x}vHvwu;AAPPAolnb>KKwTDI6!}Bj^guZ?+){4(e`*nxl@W z3i`&!LMwNo{?PKCs5@!|bQu6GID`CgRr~;@^Ui!KU%~%D$KjoZs4rTFQg|%%xFuX? z@=m-GYJ_*AJm}+ieu{tLt^2%r?&I|+jyKiLsKs#+p)62mBkzD!I!LXi-e41Gx`wm|>=PB}S+R^*K``jP3XhOG zKBGNh7#G1tk}BL_X^v=@8?VU;E8qb_SG<8%py#xq(2^bO0xC%&h2=zJLwF~lhq#|C zLK5ysBGC@?oaEtjv<`>jS}1~rav9I#!F(~^$e*&dY!ptS-Ow#QlRQOFw6d%y4uNqR z#a3cfh*$Nj6EDsKNdoH6UyHNVndkw2%%X5vR13Ew5iHzw5Fg;5u*&ueo@|5bGIyfS z^b9_Wv)Du4+qDdrBq2PV)<<>8J#>w>;eX?N`hhIK)#+Nc9Y^A_cq<>GS;dKHz3Pv* z5)*LVNPZiSU;}6{;dp{}oS%hSd$Uc*z_$TE`OrhcYIIs_${eH$`p6qmU-F5U=EZO$ zR*flS1oGq0P+3wMr_twBhw2L|ze|E~HjMH{be}I~zz@kPHV}6rec4Ic0r$Yg(KoydC(z-n5=vns`6aXrjU;pNZO*lW z>=eENeBBwhL~D3F3Szgo2Rh6H$WMM7W~9m&lFj^@<^akJ5t^X>^d|3zPNL1U4Qop# zlP|bBmuXLW6Qz?B)E4IE2$+R4(VyrPcc8U+Dyo8CP*t14r=c>m%Z_$TL zhZ(BFcktHy7~8}fuq`lSJ7X(~WCz$H{+K`EpJ3(`!&$&-4Olz+n(gDoQEOC!uLbFm z#0sGQFQ9#sNHX8g{n10d5uHG>Xe_$QJEJma7Bb?Z7?YPIn6xJENiAX^9>i0)D?BAm z(h+9j-=sddNE(uhcpMSQUAzPfcq{fp>p>p00;%zYMbQm3QyZpL)mE#2s1}!-y3Tdm zS;o2D5pQ2%A8v1DziUmlRJSA-T(|sbb+ctz2iqz+t~r|6E84C&F44hwDXB^-k>w;x zxF>a1y6du)Y07z}uI`;KT~|xzsnc}(4Bw2EjoJFY^>+;QO`+xs=I?GDJw|$pUjKMe zuSZ^WykmXF`la~Vys>w(SF%S5b1%baeW)%;w4E;yEQeul6K*~w2ITix;$@TjxEcO>6WoDb3x9E+ymJ+ zvdnq$w#({pHUi(4Ug*o3Z@Z858sj@Xpl8UlBJCqihCdH8ghmHd3%Kt)*=M_VHLp<~ zdUs+L_1%QS?3i}db-_N$Qaf)@_R#cK$yJkT#2<^f6ZPo(v+wR-{(ArD-MtT$KG*+z z{8O=Sdw;BnznNSrH6Y_dUcMS6Z!<)Bj0>q*A}Zp(*DHM!ua-p*mHk;_cbF6!A9gA1 zde8`;A?8r!oUmPR6IJ|E^S3q0t&&+feL%*&oUxXFtWv?AJlQhc(L-&mEn*`{wlqgK z);P@luGeVqGv2-ZMg>g^i48s-JT-JhSl!Twpq2r~fO3A%JPGku`;*^**-=n|c&xc;So(+7t?%lwTwLhpInti zPk%bjc|q&!Z3eC*|?ch%p2d3XN9#;;jXWn&K}ElMLf4_rHyk)9KM z&xYG8_OH}G%w^i|F}~!S8n>&MisR7dMfQi+4IJu0jDd0!e%V>f`PF&U_Abvadu;lb z#O%0IDVE$++b65VQdX6P%3@h$<#U09^u{OVYu*KZqkU?5HuLiJo$g!DN9Q}!zg@s< zzyAKsg1Q9_^F8b_!XwyolN&akHViTb7#8UI>1HTK(o%hGpJBt65!p)m+tgyo^J5=; ztMPfnhhZ-!+;4R^!G+lNL`xV*fH8wD$=)6ixYjiC& z&1;6of?^wL?yWJq%CR<5C2TQo+OfJnlo4O+5pZFcA3-Zm5 z=JpNtx-?VVpsT8wmHmdBW?#3dZZAED`PT5kp4fA)*Lly@?(N;bdv@?T<^I%s&;7gC zAuo&jTQ}rc)oY+zb$u`0661H%H{(I$TvM!mF^SdQyDB=i<=@L}l5sWdLc;OrXJ1}_ z-0-UOy${#j?hJT5^hLuL-mfCw)%=+Mt!Dg`))#~Ah3eR z?r@))1+_EFO)NUJXjsvI0=sxz*6qQY?bUK-WOdHAWV5Wy%y#LK2@ijcPdu4J?XixA zu1s9iG#loqzxz?o+g@uuygmB))Czdx*Vn7LM+=Xu=7+i+(s}u?ZmM!s`bU{>D&ld~ z?UHefF~qHnM_ISVhR%i=Zo@rWcr0*R?G|sYpc{{OvmC9s^JIRRoVnS((u}dgzm)m# z{7vOYgRi?HYv1>N*6?}%XKP=6ev|t?KI(g7qx3yFSJeZacS3K5$CdK0wY*{53bTD% z`Q0ynv3_**uoA^1ZWOB=mhG`zu8gm$>3PG_x1{b)ZIjwOm zuUg-Wxm@$gj@#O!MvvVe-+gxD<-~XKU$4jIrY*|3LbJS@hF2_+Puuw9qbpDC z#X8`kV!ATSl;@5;4W2E$Jbj1wE%1%=?d*Tc@1Up6@LkbFPd35!I4?2RnSMUz>!;cu z8ofRI=x>w@B8~6ReS0GrrxLJKj$W|%1pO?Gjs{l7gx&0)IQK6wZX?? z69e~_epWxU!KaGFN@bSvD<0`LUq6SOQhVkWBt^zAjSq@l^TYMy{?Dz^bH4`uc#(e2 zK1U6sZKc+pa|7Q76%URL`(AWVakZFdabt-;ifst{9PrfJAJjOwMew1ZN&(-zpSevjgh_u>#l9u~ zbk?54H{UYe$G!G@^5**9^Q|rnz1HOBrkgGASRV9!*5Fm(r-ren)b4p3(Lvw1;>*jq zs+*d>YT3DV?_%|eKdF(_bW4M(RjQWjUFLjvtY>NY8S7@tOFt98G&Vb?>i38*eZL(4 zGU;Qx4_cHX{jP18+Lgc5DLx&7(u1#u)+s8MN+=UrPAu1|Oz)D}5oy80ef~Bbm6wrt z*4$OqdLge|?v0$zISq5HIXCjJ*cZ~PL{z>TOL^Y#8SVSn=cRA!z!M?V1s{_ z&p7wnx;c20Yof)PT_&wg+{ka6KP-BE=~2<^r7rHdH0yfRTYucTes|)N*RQSL}SvQH{gvjH@u9%#4!fLgu+i;vUUxsh!a) zd1=!1I1)YK>%=dMKB4z%AEIMsX6>*~)NW#Ixb7+WxdP^doC*&q5m_dp!sGH=%e*Xc zHeyt;;B7Tjk|&G4!W=%`d9L7C?$+Efc|mzqb8qJzv)$Hq;cwC!<5|xwzMp*Wdr$Nl z=MV0zh>W{l`%crl zlkc(zM_&B-zWf)@A1~vVr?$!SMyltg&~YVhRF0^ZUwdE44uPpfW>&dX=XKS0WnHDl zmM9k5+N-60Ia+Dwx$SetXE#W{kl-DY_PxcI8Xu>Ao)lXo%V{}mFXsBfibxBLUA(Ra zbPC-PUZ%KbsUD@0imxr29I-ikZiu(vH;?P)Fk>_2B@y^0?V!3qUFkAAhTFm%Z?rOa zo3KN=rTfcN#XZD>x*u?_?>^jpsK-fCGn|&yruw`#9q3=IA4Fy;DDA+g#n0AKur3z7#)OxncEA zrImmP{~;yDRQ*wTcIli5&+tJZfA}qMudeTiKRef26ASv})ymK(e~OW5cEm<1BN~N?#gEAz1UKi z&JF5jdr!;3+%1{2({3ckC$xz(#(009`Dy#xcCV+rS^PfogX{gC5BZ;sQOPlW2}vo{ zvqB4ET)xsox3YfQLgb>WB3=b_@tEheqsX!{o@K^F=!5_9&-P97?&R6oyhGtQjy_h$ zIvZQOvhSwlq&!K!pVT7dOh&n!;<*)b_vXE@epIvZD|xk{lR4Mj*QZS2sgS23LxXDs zRSzs4P|v@aztjJye-+;pj~&J*a-PsvC@MY|G*q4DshjC~u$8j87a1$Q71M-K;wAZ@ z{+qFl>AB&Mu81;3iC69_9`YWc9Eky|W)sz^OB|`vXjxovSnZY|88jnxg6bv@+X(j{r1>?S`J zHw#(h9zKoisDw~V+AY142FMF_^A#%1mlNayWv6bQE>!neZYq@&FOq@8AXFs>P*cDj zj%#IHq0Sz5o9(c*sMX6FWVutI=CPb-In#3c=g!UTotK*(o?RlRT<*ynF+VH+PWIRA zM|mb||AJdqcUyPsPU~!27cGFBxJrkhA;KKohHpS+q#*qT!vWnId6@37-lzm99rTm+ zGxZz=_MBnikbU@fGH4q<*iSjD( zz1UNZ7Cl4{xsCpSevfigel1UsDobsoE^>mhOSvLhY@g=R&XW6L4aQt|#ff5ZPH`_(k8}|KA=~K+g5;*?D7!CYD3Ri46v;#JKSG=k zC*75Og#p+i%oe8McQ`<}E|pTgi&gLke1;##Go%OPCr%*!1&8Q~V|kWV9&Ho5h!Lm) zIxZXo^vZ~~(QkY&-id8sH|DWCwqCo=>yZRfMYxXJ(Zlo#Dna_;vMgLH&!godf*(p& z&#RZwAygj!i5RWQi{edm1v|}3(Rh@r4W!RdD-xyd(k{}|bRu4*J*KaiH-CvrQxAYf z&!U6OpHt0;&PGQ`0&7F7sk3Ppl1%*2ZT3(drPUG_;mSOLg`l!hDZGzzXAO2$sv{?$ zX6hbR4UG^YaXYk$jYU_;C|m)h(*w93-b3o6zqF}k(`ZkFjK#N&@{*C`Y_s}`ig9W*UvRkAVzQg*_Qs|hlo?msfWM_o_f|WDsQk$S* z;s?^1xziik0O_*W2VY~2TrXKi+(c|4Ea9DSW7eH%Xdp`F0|5(t$Zn#i{5(#?{@NL; zkS&1gY$AKePh!S7j#X+npj@}agV=-j76#E?S~wsUq4*n`NA%&erYk3*Km>$z*+{9#bQRt5Y=w1E@&El=e zd9^q%LWbeKq!Qhvl|&24Q?`}{OOMbnKHRm(HHgd>XA*zt)n9BNP1aFzp-k(GkZ?Lg={{Jr_!s)PTa{t zZIU`04HK4%XSL?M1%A#u(^G)^wgKEKfdmMCWRat+dPBM>bfpc@Y|e#&YNlhb7$`3# z2CX$ywF9&xS&HvrFH#a2=|nnHJBQ72oOid&J6jR1uD8v4W|NOLv=_--b% z@G@c~Kd)6|_sLA56J0}dxEU`NI^s*N$69rvk8lvpWFytJ)J->Bn8e;`P1r2q6l;yz zAtPBz0(k_BVpoKfyfU-UMWm_phE{T&Wnl!9fACV&hi=v4NlCn&Zv-Ta<508|&1Mwc z<ib;(yRW7KC)XCYg@!y1t=R zs2h8a4g*fu7EA0iP3BK%Lq18kkAKkSd^c*0_R#ZMyfjd#r)9YQM6d9Deq7u_hSMcU&IkM?miqEhs4@S*y7COs3sBt(+DA2s zTIdw{rc@tCIHs%3a5Bjd8qo-baChcMeMB!@o;Tz@0Uu7n8(Empix}8k=WLoS4#jT} z!DF-t+MP7v^N5v>WGhh<)Kc1m`cZG!pLh$tAS~pMwY~gL(o=ZL)_^Q4jV_}|JQ;is zkI7gPPm{E3roHETNokhNFN6Uldc8Klt=BC`JRu8E4Xvu{ z4vNJe@g%XX7)s{3Ca7mvCc6f6wF)^av}1R9DO8W0)P_2rk`J<3e8e8BbLlQLjSOeC zwJK-`i5C9kykSMA2@i-Y+g@ff}Yay-s?pOxY<=)CZQ5WEnNR>x2$0{;SdoJNrX;*MUZ+cl9z zkhjt~9Ke2px1%>&02F`1CXim_3n|BHQy06&jA#;XNMzw2`ao4W7@cBMP&|p|_xTgt zm(SB)YiER$;$GGY{ZOmmn~1Bm`2x~FYR!vibLa$~gL;BbCLDPQ4{%3ZP0dv|qQ+#l zFbPeefoKHZj)L(D?GCStd!kop9A5=mOJf>M%i*cG7Wo_N*eG-Xd}f2ezxI)P;&AN3 zA;J<=lpb|erk})GN-?xn8wdU~kv#*XeI1KIX~HAEkUO=LS_-~EN)r*!)@nly`%!b+ zmi|Tl5JH9ebPk=wpQ25q6X5m;-+^Zv(QrH(uRx8M8_UKy_!>=C`=X)JJo1&Er(Qr; zBcF=qpyDWuWP!}w$@kF`JVVGPHOMG-066g$4?|XT3Hggl@hR;PQ2jUxCJNdMJWOGw zuxq<0MuSjAu{r(MszeUk#5zsITe?&g)yVe#w2en8sp)>yrJPPx{!?P2{ zXAf^EloejHr`j<3n*W9G;D*rdH)t@wpib6ip&cYn96=iL0D6p$1P_&kCz5c{hzIf6 zS}B$R{=X_{H%bs%;*NX z;S#p-v1~f5D$~#p=7ZxeC%FeRpAPJp(4`0WI z@$S4mX!8ZI7{DsT$pJWhsqXStks)u*;d2A+Y#3%DfERua@ z`{+K}oV8-#=@jbDyxC?-=ugc;i}OTQ5GbNAf8IFJESl$=s+qr=&zRqvUK^tf#q`JJCBjSIR@>-& zZztB#`4e)+XIj&Grff`H8=nUL5w>@eY+sJRp48BKwXxCc; z@(yPY&x}pir8h~tklHsbFe5OlSNugT0R6hWFkarOUu~Rb+HDSVf9l@A z{i@ptcjD2`y|-Hjx9@I;-Flg+ahq|QX{Gt8>AhjPK1{ztH&|&dyQCk|V=_mW6b#NSoBcI&PsTrK#uQg#|HPt65y|$%Qt<=hQsM_B|B*H)!)((y107=cMe_V7Q~klPrnYuuSM+iz2?@~P3Pg~am2lr`yEq&ZnNNq zAMsLjfMc@djHRvpmfhd7Cuef@>)cJ2AGQ^CyGxdl}sI?*DzDI=8r%0}h2 zQdRd>*IA#fQx$`My@%TawYNqjCflfxAwcp}=H%9}&oR=L%6duxt1+sxg}lT9X5w9#rv)xDAr zNL$2X#2_BetMFebT96YpJQW_6Y`Rx zQ+s5uD!5S4Ft@)o8aGzLz%RJdH?Z`yu%`H-WuReKiPfbO{3A`5+{b%Q^6+&l=lRq- z%I&;V3#53wAoF6*D0`Tzw(EiQMsBlQSAm!Pr|pzA-`XDNQPI_twnWEJ2VR?>!Cl3h z;sfw~QE8>(tK65iNqVK0ZjW+LS|rvHeZ}sA4|wZ;@@4!Q|H(h|@4Oet^XDX3EGyNQ zA1i<8uNzJq&zKII-Q0@0O>jHw*3T`-{Mgvt_=mB$@v`2o9F)sR*#tB^=E0J+ch2k9 zE%|qHZ)RW4oSe}l<7V2AB(L~!aYGW@rVLL0mar#2G)YWZm0T^YM(!Bfi2_%)#d=3@ z*Cnt}+QD;H@g*VEcx%f-gRA)N60N-Rb<{1zr?%HKbEt>S>xNsjoFPO>OC=vPP8GG~ ztQx&#M+Jt0TedgO70ycbeb(u=499YHD21p4@Dsmd*(g|8CF~?^$X=l@ARbl3Ofo~L zC8=O9RTWNc?(`Tc%ajfBxevj@iWu$ybtV<5^Fz~gn&~7^0*$x*(=KYn^FRMys ziOdHXbJCh8mrNX(xHb7n%E**q$!n9RrrbnI*KUztSO20vg9FV!^*=nv`$lz5d28+)0~ zn_ig&b0hN*b2;-C(SEEg!_Bl3^4{wHO(<>^w{V--Rp_Duepy$j(Zp5GkLDG2bFx|&sOr%j{#V7>H3p*Rj3h!d>eP$5caE%q0QI2@=^Teu<| z5F*J7JP7y0!T10whTgy$T!z14V_7csXCK%>SkI?Jj6x8;Nd)n}xI!8#k5@M7?&$w9 z)HJ>@_B5?BH8#C5UN=(XedAF>6MZ9HAEkus65ET5g*%|(_oZXCg{s9l$l+~|v|cDU zk~cNiKleJ}CW|@Q_(&Nnjg>;>_TWN#i#&N0 z9YR;phqMTlv~<^g7j-RDlhuyeY^{>^M(wW6psiSI)|XY{Wl&Lc2BJX9gS{GwXW#?) zBpwGbC9$|Ou|fRCZWM>=fc4T9Vz_h=Cw2v*CVKK_d^SXX9YrqWhO6TOtQS!Dwzf28kfcxaepc%VO{FK=+_Z|deL<&&y2TSu#J(H)3P>cz^-?ai5n&B6|zD>Zi)yc?MRl84LhP1iggxeeB1-4erV(`Cam zdA8U`ik9EV@xmsEPVqw;=-EqoJbk6vwbwM9&8CrBw04jlpr5p(+7&v9Vb+JH&|)xa z&I5)xksp8vlzKduQSO5s5EHf(;?vT>GF^?jpg+)Tv;u8{m1iKt@|A@MG6%Yf4nk~9 zB{GMMAdf-gZzdiSBcvlzd3lbk%G(uRolf^!!Mek`Y+YmUzRp(c${wY^+(s%Zb&yVq zHH0+00e8XOP%LwT{@skmsGVI?oRgjY&L8$hw%XPhOGnGZf@k@M^7He8^G@bY&ApRz zC}&wN$^V%*G52szRNi!JX}i;U(K^F%PrJex71=C2TW+cwDGdet`?%iEt(Cc-{+?3J zu*PgP&o{2ur|ZiZ9~yS)F3Z#95{gM_C>_ zzwxVlCB$}}f>=d8L?Cv8aT$g$fW+QL>It`mmf}6JzH~?`CeN2o$}w_PrJqt$X`n1t zHY+8Sv+_pyvHZ83Alb#0;ykgL*jcDY&f}S2iOu0tSU7XgYBWo=y5_lzu940?j%0f~ z`*2$`>uSp^%SKBPOM1R559e>pubclzUSwYHf&fdo0xhq5K^ayW% zH|YH}#VXPpK@pCKSU1D4+OS%;7BrFW#^=ThhDQ1#`rG;^`X;&pS+5*Ya^xn`d03BH z2~&j(un%6Kxo9ow0Fh=3_zAv<$Fh-Z9y`Vsux_j?e7wO1^>^_VDT&1n17+5 zsMTfJTu`?l)zZQ~!C`PD*pE87}Oz4ilYZQx5-Qy9O4Y!-`P3hU42vg$0Jda^NW6Xe=sU(!lz_y2+YnSz#Sy4{~;MUUaN<>a=7U z1iaA(^(WCJkW?oQ!CP*t3{!ID9daXOoo;~Mp(~<$sZ;^Ic$xAHJV8a2$#NB`t>`BD zi3P$G;R58lga5%@!P5Q{%|nX;@$SfrfR#Fz7lT>*ie&-yZn7850(8V&RR=uE7XSs~t)Yb*QYzH+V{ zrM%Fc)-~4!=_=@=lxs>~<%xV+PM62YHKb;uAl4TLh_^xO3?$yfg8#rjp|@|)Cx|Ux z#(VJtJer^3)%aVM#v1dA{5sGu5bl%0I8%0;(LzL)m1X5vF($KHbUWP%v6DyXQaYY4 zr*~-}E5%9z-=1Y2d<5SMx*LHtCKa{Bi|{L4j9dcF>@Lg~VuUW@LUA`(1_q$oVrjOt zOj-+{71Dj_vNTL85G`Ujc+HNBwZxKQn7C6&BC|+s;(&54qp!RV4~MpyVKsiCE!Kjy zF6wHSsx_OZdvXOiwwZ#qc1VvP;%g!!8f$QA8oTAX>8vPC;W(MTpsMj52r|uCkgC3A!H8r%2{tJpd7*fR{7@ zN!pF;L6Q=na9!@t9|H&OX2)TM7iR{Lq7|4A`$m&#QQ*$8tRH;e1&Pp-&jV>`=Oxj4 zke0phc!*1`01`8nNJ2B=q9BRxVgqr57$d46@4HAfr7}`0X%*O8J)~SQQ7j`>l77Hy zQ(p`g?+D$12U?K=d>Ud>`@xzM$PwQOenv!BX=Swis_N?HayV}|yE^}L9I}_N_p%SQ zC)(ayCtFWg{cQ)W0GC;d*dE#@+aj$6*1q-}#}p@ZjCO+0o?d~O70Po_dq93UengIn z-9Uz~hn3JOKUF5`{?c{Ur7CZg=dczk$~t+JTv@&&C5kb^1Yw1+Ot=ra+#*1p5FmeT zf9*05&~aXeN5QJG7<4%XIC&r+4UxL(%!~g8k-@!TefQ+!0X-bb-FXT~Mqi!^Zw&>S zo&s4}k0I6`X8Adw^Cqw*tgH(}?H+}kS-dqmi!7)#o`~P$qJW{E0@SpDFj;sac!}l3 z?&47~Q!FV3Ns8nKoVf$|w2_n}y2LtCJ+R;=icQ5LVg}?GPf9?#hK~b(4(IiuwPCCw zy`pV|2(TLJV3)f~ah-M^b}Y2}+lSdZ+dtagSPxitSf5+#S-)C-SoT=E+1lEsTK}}} zwAFSTcf517a6WgrX+OZ9S&N@UdvFJGhujA2xPw$(*{Qsdd&|X@zja0QXLQANR>cE& zbd+*eUI$1+Be{cAN*pT;6V`!L4<{pW6~Ok6f+YF^_?Z=UFz5mCyTJ6k9M?cH9Rlsh z6Fi@swd5N>XRgLQpa*jywcrZ3gFO8XbezE!veh6<8v}pV1H|qUy8$_0GBY0tlrPkT zN(0V!8TsL9_!(A6b8?V`2;;!UJ1zK#%fy}H5iwruFU^x$N+zkkbOKiR36c|N*;HyP zaq+O&RSXehf%e;oM84s}_%nFI8}S^FJY`vL`cNCI6{tb#pDurw-MP%U&vDdV2RO67 z{gKURn`m8SJp+>SFUtkX5o>3gVCxFpy4@D)NOlnC1m_-CGwmouod@w2Xdd}fNGF6` z5(dkjx_!!8xvTt2sSKX~-a4%NskGDu>&7Undu8x7!MZj4*n7-c?K25eerf|!OLKVcLG0Zfv{Til^ROz zV6745j`C2sxNMOs%Bw&}Dk|TSPDwAMRIog+z`l#3@aZUwCLh5o*$t0E-N2uA7;0EX zdumtIt!jYU#I?!k( zHrcV&(aK?Tj#WF;r}R5*1u^;YAVo6qVRA$Y*KO2IR36C3l*W2r!z#U9_fVItd#&rC z+o>3p5cpJ(?J&Qu3mL*bVK3-vXYpWs0tKNk)CO>m;XIywVFp-t{sOuz23k}B@8SdM z1GE{+V(3D8o3@1+91Wg*J8c3Sm=0I3Xl>S$dBJl8cZP#LItb>t2$G@?tUaD+B*bTo z!Qo^HxdnV^5k82+rSp=PyjV^Kl=zThRor#)Al1Js!SKI^@)7jQY`LA>Q`#u@g>^hh zI11WZV;qL7qeo1m>GT{urL|CdyF6Sm&QNCy#~pjPJ=j*(O02%t%a-p2-UZqDs6c@T z=F<5i3a)^zemFla-)bG_sOI=#OSE@Xzfl`R@FQMS7%3$Q7VsxFmecjBf$O}KOeNZ| z(6q#OMqgP!$DkNL={04t(h)4JDvDl8hdES9ydpdY|EPqQqXFO*_z6W1!`j@6&d@GvXK6NVNOx-AwKenz)xetmsYTKRS`YdV1vd3(dXl!ICFvd-27G9x zFI>euSu z>&ECN>sslCDpIxoZkycQc{K~V70k-Z&7D@z(r$88h829fb0jOmFKcCJSJF}0 zB<~^TMDzeHE8ZLcpJ15JUoZceOyPd3(>%3OgsRnr8{7}*L1J+ zkuZ)g4DSuyjETksV=Lnp}IlQms0Yix6)Cmvsj6oK}FDG(6J6`JypGW-qpc5 z$3Dq6+7@9;vy?9I%5Rr{F#mmCjoe;2uABwAJSQXDo*kIiD}QEQ_nd9H6RpP`iao@# z#`cJ|!mHQ{wF+KSMv`TH_4k3FCCwZ$iwaO%siMj1!D8hC%ui#YdSg7nRxwzGMbq3RPK8 z?JxCMu=B1Ilx5oIR#I}R(}}x>-Y>*0P%5HK^0?u>%PmW{-*D9Zn@4NY za>ZY1pdY5s1`MdIuz|G0z49; zy{0XK_@7c>Z)^uCRsgF`M-~9ytEQ+NS_IPR6sm!fAd+GnUPx9#MBFj_hLjbzfYdo4 zZjz464V5hAsqTrsjp43gxUq<7sHv~%glVbygn6||GaNKjGP)c0>z62^93;&bBZbz) z2VJJ^wFEU-{pRqrt+EWT>@66P_c{AWmMyDmcKfWZ8I9ALrnOG*m~lM4WBSRAIhji` z&ZnQxinCm{?=48o8Eg&44a7=xj&qx^!0VP*Q87%ND<=A71sOfpD-lMcPmo_nkK?9V z?x(yic_bU_0BTU$Fj}c25}~rN7+<01T+LnY)lZs_N*vd$&ur(M8`LeXKOO5G26Ym> z1ae@B_K~gxZ(v>I1T=Ri8i@Y}`T7PGgZ1D(o>1uV2LE6p?ApqPh=pb72HVDu5KTA< z@?RP7gVFTEJk>4EeAXQ3rkOvRt{XQQpBWPk9{K>~8|WCL zVANKl5%i7vQq6KbwfkAt=FiMOn`g=ylzAwFXKc+llh!xoQ_`&Da;YoQuBXgQF{d_9 zdzKoWF)gox?Th6}ZqNLi+759FW}26{(8tezv~H5xTsZFkrbtJ>1;#X!r|)&&uO7AB z{_?bXU+_SN>Y$N%=pEu?K#gL-*4Lcz)=yUMh;o&2&a_T0=xJ4)<6Xs_cKapgBCRB= z16IszR-L<}_V{n&CkzI?XD7rvG!?6gpM+_`M4^ND4D7ZFq$2JCvuCWZ6Yxy~sV_7a zt`G-lCw`SK%ihWX<*06;{*8Vi?B1GT;>I~fFH^K>qRGeTX85TOGc3~A)6JDHiV;F7 z;thNMR%xr$ovy)-J(iOBEAvL@UCKF;H9WIIR>RDd>AA@XNySp#Gt`XWG|!aLsR`*N zGWTVU&aGgNu^lNmo1gA#347RL@Drt;XIXbI@>=^-4)qTVy6c&*_cXdZ=XxG@+hn$Q zeD!Q<{-!IY>u)%1=p!!%3wnTbo;;)mZ8!Z0J5DpS#$dBG*Dh#HV0HNF+z1|(mVh$U zcAaNjF&!TuVhTIj3KwPPZvP+&Jx6)NJ z=EB$q8@3oD%%{yyOvOyqOubBXO@A2A8B+8qy5+iq%6Zvc+9&iU?*UC`yawB=_0`_0 zSgqn*Z;!CQvsJJ;U|)@`U~_?I!Mpsb`9JbL# z)>XE*_CAiM4$T>*{so%lV2J+Mgk^G#bQMd;U%(n~qfFB^(wBgZ#Y6SUdI`KVqx6mS zSiee_r_5J~Qc3PB?Et)By%0xAk!j%d=!>2KVzCVP!kxv@3p5gt$!&Bltkr&i`qP!av|IC<)P(gTw{m6)_9!mCxWu{RrCj01>c1(MLQc1c6nx zhO{8DfHAs5TvTO<0_*=vEA?hq=>kA$ZQ3ENkJbnc<4=DaQuv>k>IvC9Mfkvl++-t~Z!7k_+ zhy!s$_0bH73dw@lkw&-=jN)$m1m|H7h{Nbl7L#3I&F&`$03~=pUXyp^6Zs6gC9jgb zWFbTp4u(jtj<9pGCSX)XLUArcI=+VdkMUdl2BgPTkRccG74QpO0;~2IJ^@(R4Y+#@ z;u+S1bv^@+z?~spvmExq1%P;*g5A>NAd;>s>@K&#?(I`xNsb0>z8F}-NuZ}61Y~Fw z>&VIj{`?Uzj=8iW4X1YPJ?H}KwFz1$Kyo59PoS2fxoN&|T~8aNEdw1Q9^!1f(=DJS zmji7-4x&DH!5;8|2zFpYbj&+kj?4rPST=4!gmR=b& zqfu=6FHG3R!T?jB4K~eB*vH!#O+dTQb7X^E!L494=HtzHKkUN21fz5w#%U+CZVDh9 zwXiqNL66aXz@B@f>M%Z5*mZxK9|7BRF8DPD0DjT|tp65}TJg5LE3|L`;7t>O(^f*{ z-w}QZ;+#GJPG10f{C&Y+Rs-;@{%9gvf;OXlVDH~RkI)PB0qld1@ckCB`#TW*vmg4s z7)^mVpB6Ab{GtD8P|5?)i1+Z-e8#VuJM-qe0qk3^%*z9UTmDz7#H)bK(FA(h1MtW{ zpcSiOv`#_n%X^4{DLmPrB&q{;PG8`+1;BMX&;i&Pd=6@i1fIAKSI5vlQ1?=p9iveX zXlr!@kyqfua)C`93w?jd@4_hqmmr;o)|`d1Pw|Toi*p^k5RuTr7x2bgcrzZ(JIH}J zQwBq8g#G@(kRniNuoP;-+-nZ0CB)8jfYb(dF1G@tst!D<2)IBIIDNqj&Og9#mVymh z9S=T_k5KAE=*1=QE}jNXILr_6gOCpY`aT5sNg-l-4kY;<@IAhOIrJTD;taqSDD>KZ z%s~4PD7y?qeOG}#)d6m7@CzMl2)>khs21F-h{}WCsWeciIP^Ij+8Y4v@P>~MScd^{ zB7_%|5(-bs07uq=R3A!c0`2dNdVvkpA4Y2cq{5RFy1>15(66RYOD!1l%Aji%mKp*1 zeSh`M1%1nh7A8XfqM?69U9TgVmHAYBIk=QZGu>u~oDzX$0qy!8y;e-C{95qwxta5_aC zPl1_|4Ut=gXJjxqXTk`aXNGe(^w1+O7==)%KNM>Bg!;YVo;QqY5R6O!w8l2e zg*g$Ni;)j4vO*gjkly_|r{l{nF3W{@y<*UUiZJFqfu}nIog7dehY^YSRqj{t(+SXe zKRD4N7`&T(!5>UvCdB|vqCrX|gS-%dYGVQUtcChQL~u(q9rz&`qVV&q5@M+M z6L73j;J@EU(n&G#6!>v{pLyt7*XDGMP*a4$ZHZqZh1B|)0n zSOCnjhv07;1N#*AYqe-=T9(zNKiOJ1dE^nu4F?*GhJat`G<*#aIwTW7mS_*KrTVSmqb`H>i zinImAbhCC?8v*it4(rP&BX97mA<$0tqa)xst_-ppq7BJZ@Q(aLw!jG?cR&+)0pC8b zhD8dOg%iRfAxr28k$LywYN_}qp!%uORJj!FW0G~1bX9eqlnqK3HTZI$e! z>~$QKU5&KA=^3yu8sRA6gFHzeW6U%=-4A)L^Y-&O=iS>oz-Oz^P4AyxBfZ~vyLoMN z^EQD|o_H9r0Q_4$v9 z$*prQJNwJ6z4wN$i`ZLYYPpLQN|p=_c@Qutl>9f2t^zEotPS6eDTYQsK6(FIdgjLe`aeAG?t|X&RD%zeC^?Pcn`s?U#Tl%-`J%!&aZd+6LZpBWWX19rtd=dj=LVZjBh+JA`T$z?p zJ0co|uMO!C@WB{l=%|h3opczvM=2|PbKi7rb8+rEp7zpve(e|-FL>Zem(fReIFuS<_mnB&>Gu;;?@sH-+B~bo=h~i#FB}w#fbM zmx^pTd1=m{MB0M%av9gMGYT_HO6-$eancR=NQ&6Mv~PWf1T`(SJ$z*3x~R*Mbt7(s z)1iJroL>{4zWQF;mwZj8D;caBSOkY zb|1@s83zsGG=BDJCmKkHegNkL9&Ayr5uoBfp5-|TM{a>QhcOss=KLstLv#< zEW~rO*zZ8yTQFKaTJXbHdA=2WT|VpTZ*>)%%lMgE4G%soAG(p~(4kJzHB&Xgw0Gt%upQ{W>Up=PWLe?;oZu|a?=z{lQu_QTpB$T*A8-9y z@ALdm8^2WkE~jw?o!l;Qf2mRB`&4dKvq`;6HLcO1ei1%*eL5Q|^JkI$(i&+xlvA>- zG1bnsW%kdUl)J)orX<(3n%tndYHS>^C+K8IY{=1|@PN{O6^zvlb98&fEnF!&No^|C za&57lwtNM$deU0TL3k#pRoVWUH2o1HHhQuYAAeu$D}H*1|>%e`{drtYL@XZZQd_? zYT?gM$$8)3CcKPa@~!E&Q%MyvYZncainL<5ye=m)Wgd#q_IP9+?i=S@5z6 z)FyS7L?E-JhrQVP!D_UBbXZ*Dz0H+pGW?eJG1LIoXH$I>B?G597rWxKM zY2=CKgQlH0oTqtFD2eq`aZcq(vZZt@qu4IB}_}LkU!PgNa!0{t^AqF3#$6p-d|%t z>2U1g|8h-)&*~|+pLeKoN1E(Rv>q=GExeZVEB9pa16Q=-%S_bW2qZ(-hxQK14e|s$ z_nmCGuZz&>G=2CEEKMI)cDrZV>5{kR#-=Ui!In5%ZC8+Vi>S$t6t0L(@mV6Yq^^~o zGmLX`O8t?SR0$u|>6CALUd^d;b1uOC0M zXIVL>R!D^kx2vR7H`i%WPl|pa?v)BinSV$S&aw6`o~fRh_EgK(qT_{=^OhAv+O{ZK z_KL8~up_up>5pOag0}nZf}j0>W}&c_@5K(Fo}=P5D7D;uZ5v9OTYK7;+iE-DSCuEi zxfDnjGyU0#Y%sr4jMiSzmeD=aUDO@Yei7FSfr5-Gq6*)QA0gO8R$EK+1gLv8p)o&} z3*~DFQ-oH~LZl1+{B8QUx=(80u{tL@209yhmPym(%FxuDlPr%jVMK4HhSZmRqpi)J z^CWtHDD9Llj{TPQ#S2WE^CsjgCArd5YA3%{&j-#fHLH{^sGPsa_nNT-R@ik-Qvu3u z;$Jz=-O^rIEEdHUUo9!L9dbrV(U7ee_$oq?pcT{jhFk=R zci;2K(lx~eox=z)!E@v)$Vk|1UXdG|c`E&T`ljDKk+f4S#r)%L^7910q>;Za%7?=_i1Fkiydp-+)l)FJTx?sC<3jI=$mwy{02pK{)G zkM-_?>(A&3ba*WHOq=oovg>88P1mPY{%K3OlMeE2t|nIB-PpiyuK%!r zDFKB48L0JlYcm9_dRj|8AvUYMaVmd=20`O~=B(nZ<-F}|?54fbq5!&#t{?E0k zLOyEbOEoie zz4dzCRq-;{1s+_3+|V25iH6GYxyS11=I!lG^vv-b@YMAhr9<*PaLgy@smyoa##+`1 zg}8+d2gmKt6>yLE%TVH6fxe{|JB(RIf1yXR$=q6g7ylN{l31ackR?>s)YV?m`sfbo z;*e;>Yy5>;+(IS?2zy23EN;c!^oX)oI`6sSD(7_CTiUPL>f3tRR@=td)RNMcnnjaL z9|{`gZ_ZngH!tr=Uhn({1*rvl3hEYGOkFK2Y^7ZZ-ZO-jttdR!xU>)8MCc23&!D_abc8&L>NoCYi~(_c?C&X+Rj>0UO(m8~rxmIA?*|j8X&DE6PlzrP5WI zqkK~u11I?h3cpmcIev?t-c2`QelvU6rra~G7ypf)Cn&;5akqF^bc?k$-8B_7&%_vU z6SDI9@bBR#5ZE7d1{F#*B6~q?`d$84I^gy7UiLKcoOEZp8oIVQ!<{=FHl$QkvNgBP zD*0}Su}m*cDjHBE7F{M#^4PVN%>5Zd8NjD=o^%DNBrjvP&f zf=?R?;lK0T1x%^bunu?Z@}`^+$C9(QnWph|xY1-*^a@&>?PBouQE z`K92Q*Yaig|G1e@&U}Qr^bW9)zVtTg6>=!GgrXG55pqvBU&FkEpg>vR8se9Wlk`M7o9BnS)5qX*Z$R+=04~>EKetT z(>vJm+&$E)v z0yF3u)MXOzy@tTlUtvUEz(xBI*!o>4qV_;3_D-n=1AtXNH&VA+m#I6b_c!PaWA$xxW3=ZqwKQwQ z^HBG<=cYmBwhSuk`t)B^2KmR;UZ2cbVsf+uz;8wb6Om@yve1cG!BSq{vdwvZ?rUQI(>*=9T6#<{IWe zbELVS`9E`P(Uqd6#iS*o@L2XSV!|*6RUls z?V!7*d#>A{3)OAXmernxx?`SrRJg#KxYpcdmSAI<=`OmR5Qd&tgxI=U;buATTXlan4@OBF7%b zUl@sbLLMBd; zT_`^|zD8lctpe5W6V`$!Ta~NK`Ee#Tp52b~u>dNFip)JQ-A?KvMlF*12nMeYG*5}d zL1G!O^G?9^YXb8fg1hNT;yOm?H8@2Qy1W+PuvWld{S&N~n-qboRz=!rGq7plQ~(uC z2~fOxaH4!5-;gr?{RCeZ$+K9;GoXX5Ojg7084RVQ39tAWEYV)L#=HKXMW_cXUIugU z2B_?HFfRXr3)!u%20}XytWO=NcqOPx-$4<12;A2wX#1LjBl{`8lyAysqNyN<$)WhFg_CxaJVo9Bo;O?8U_SIwCMl--=bMPn zJ&D*uJcP$dOU8gfZHL`w99GjNs05cnF}oBugK5yQb|hPom7r5>j5@~v{doay1Iffo zd|d_KbOx%Eeb~)5fEQeiRl0~+44!QP#&Q7^b8FxT+5mU;L}Cn1k+I+@rehBF2G=qe z->UVZ2LDGC zk%r6y^8bnD0pM_|gN?ANoxqH=z)%0-(8`0!DGQd%58Sf&|M^-8XnZbM1_AGZfv&Ya zvb>{_QQizJUl;t=K%xZiI0bx6$N#^hvS3s6c(wB2I6UfK_@{{XzZ8noKkuS4UZV)f z-}|7Z$pJ^w2zkR7!A$+aE2OD0_{7cN;iyT(sr87@$SHmg?j;%gMgh{?uVJJWFhI$0 zf?09Cxz(yjT+@KdS)}fQJ3k+z*bVQnG;thUiWz)ne`FAkAw+z_rs^nSF7k}mg5f)b zJoQN8U%a{x@jz{i_d|gv8i(BDnn;*ggYlKY#U8~>VH7a0?hN0s9llR_$xT0>r=@y9*zK@ZsjMv?Od2S1ji0>9Osh*v%mTDVKoWCvLR`RjX?Hsn|3A5u^=G3Gz8P98yJ5~CIp zUZoQ`R5g%`mD%|BT;#&N#`hYNlQ56BgOj|2-zp+|I*b^gMo_brT9hi!L3&aXGC_HQ z=gT2I-j}!uhV2p7kAZ~ihgk;22gZyIj~*F$hOJ~@`_TA*sGQW zi!>NdaE1DUxT^S2zQ{Z-lD7ao&Q`rdRm=q%pRf;*ybQS|*$b;Xg7~crAUi52$OY;O z;wfrm2|GY%(0vcdC}jzqAl0C&D!a%;Azvzf*gY4h zQ;D}=a5d_9a<=l6)T$#%0_O*Zbb_gBKAu%Y(idZLP#HvqDhU{DK!&nxGeHFJRbg3s{EU@ zOXcX+@@uM!(g*J)8)wQBwH!G}nM6v;c(oR>4jJ}KF1$=fh1lp_C! zH2nRT=T@mAecZd58ZU3dyr;>k;B-SU*tVIH`JLW#556 zZWEm-okV8JOtA1@!D*T3`Q8GmjhwAWbL# z$0Up&PaKgqsvD_L~u zhHJdD`WF0oP3&*$kTNxwET@dZoIFP~rXt8r^e4F`RRvYa(m%>x;vL>+V>r=iXjO(P zu|y|$X=dU7{!UCL%Rt4_2sJ>8d_q}Dyq2evA~<~`@ffM>Q=zU}Le*C)lX<8tw7@36 zV%5D?mI9+}f?Dmmf}}+yiufc|$2=dZ#*nEvEhZul=LEicL7lF!)Kc8!N6@!$1};!X zkw=t0II~RZf66>mGy`yUOa)sV2z=zSIuLusQY8VO*iW5~Bug!xz-Dmme-Xpzrts2C zReaP!thE?oDZJ!%asknrEL1&GCE~qu0ae~x(jrG9ohkt?Ethg%^;4e0LtUa6h#)GS zm_!aBlH`ZDEl!26d?|U5IE@=~GG)cMo>gB$y5I**!3^R6s+M_VD>zs*$imqMC0IX# zM+(j$;xX#W{?Gv*Qv~b=cBMO69jDYI^$wI>i{dCj`eeh(wI9(^9bHXC{r1ryoA`;E8S3ZOvJ{ITaYoa;1 z1bU+l#1XQhIt%sEE$p}}i5RjF3JE{52QqphRhL(<43XzT;~oaJmKI$9Wi?jyAf?GE zSB3s+8}wz-$ScvKUXG;>k=rSfY=rkZ0Df;HSqHnyd))s_IQv(TH{m$10t^!N2Ha!M z%O176@(sN*CSxSqL%Cxj{^-0esCASAH4yH|dpKRjs(py6WJOd}>xfn4Pw2GHLK~Zj zs!dg_7zYzh`#JdJkK_h$C57RH`HVWOCNWX{t=xnAqX3mqUF=H^JnysU6Y`CGi_do)co zLrF9hPvk1@);;0ce1}>70ZO_=RP+@21i1(8@Km2e?UR93vtB8SeS3@Qz|VKX&j(>2 zn}^@D8RzLrwIx)Af1Y=Ln;THDd0F1+2jAT)rWReEVOlB7|k$DUJKb6g6_1ti- zE0FRz@V~{f`xqO20)EjPYAwkU)0GF(2hS1L3`c~`WU&>kF^@A{E9_HPwXh5R`B&kG zLaiy@w5h0NNpE|QYrVIE>LstzZ_7Y!R^I7LI{$Q z>ZTeczZt>XOKl0F{9gHv2xPcunlCS*i)v-2A^w?3~bT1Ahl8fn9yuiy0IrJ+ZAaKgxfR zzaUS|nU{Shw_M>3b7avz^U~s$wukPuav`yri4fc97yHf-(;0$SWmKIpSUDyjD`%9Fn&yqf6?|I21si(+5T+Mn~_W0BL5Z$ z=N`tN?n2!~T{^~_?RZfVX5OFE?{|F4?Bu)O+k89ox#8#IU%MvQ5>gXFlLnLH!~fn?`j!&ny0g?hjX*DmrHVeao_MxKu5Ql)PHmZjuD${ zYXc{*qwA^PZ+Nc%Tl1TXVJ9(G@`l{st=Q+4Bp1%iUitf5s{2RC_ex)?er)l{`qi1R zFyU?d;v{`~d|qGk3#&mnuF3H07RZKHD7Pi%NwxA(8w2-+>@0h}!qxEA#(KJ2hO>sM zLW(lURn9)$(yFj+?z-IU{38WD^55tEEIeJZ&NUD$`g@gO`fHG4=BovF9v|2|_+(Jo zz)Asw{7d@|(k~LTxoWITtx;=w?T%~MjV}~S=KR72g|g{s@%56=)+Bp~+bG?ZN2?2| zb=(%Qqc%nN!qCq6(`fXK^o=(THr6(FGiLaFFbu-Zxlw$_Ens5khSYxI336QKBL|`? zk{_br2<(DPs&7<1<{q2NZQw`opSUy&U7b7U^V|Pi$m*yUl?;`hm0spw zE1*?`x7^mKenC%tl9AINqTNS&-CG@(Y+Ec3Op6QWo2Hv5n>rW#%uhG%u(ox3!P>qh zM{!HFPYunH_IS|f`@$zKk2y_~;F^x(ei05F+Xu*hH}W|tpz-7^>OMW19l-SlTdQmxQGMac)Z@KGyL#KtSPLy7MSBaL<(|%-lri_0VRo9Q<-i;jV|q1JF~jCGiGzBR@A%Qn^Fan5xIdI@lKz}FMNH!i^l7z}yu|z4o$PFG?`0iP5^HHt+_gBM zB-Fmhwcm5eJ3{V3MAJLjWWI%l)|Jyo8jR?Pbl12Oy(FRxVY-@{5V0!GWCPouvf&x8 zl5Tl?-SN&Cr^Z{kebysL=ir`OBoXM=xq)a2K6DRR3W<-?;l!5c zX-r$NbqqTeJYF@ViS^e|}cz4TyaGu@VYh)$h-;gCCx4Co*l zhEeJOZVE5qFYW+eoC4NMOZ6j$_`QIYOF?X53el*%bv3gf1o0UeIx5kgwBzo59|_WBplTTh)_w+%mUAJxtBIcb?X6pTUv>b_}IynION0bcVcu%kU-ROhQrkd32JH%arsW+YKf$-`J9 zy?}R0@(}p9(}B3Hg-#)baL9{+W&4p~j6hCNc1tuoBFo5T>QIFun=^Xg(GTT7B+bX+ z#H>%pQ5A``@@Qo=5QmDyE1>uHkoO%XYh;`H6#mvDNaEj${tF(`K%A7IuvceOk_9=8NW_YK4W6f>x*wT_ zyOcUoWhI&(15~aGW=0ZnNL#GkrMTQI4?y)DNzfn^l$l^5(^h>G&q{4QWKzvd$7l>hW364wHEH*)5>=wf*t{G ztOeGPP52?pd%66XtcPs3^2#px3uZzi;*OGqS>@%W$OR+5N^WU5+Pc>;$17_FyffOEK{z9;L#(R&Kc zqA2pX!jKmAlN3tKR1QGLwTakC-yoLAE4?9dHs*B|By(gar|2O}3$>KD4D#2jA@jIB zcFzQ2F*vCGNNYN-j%KP8oA62s5cLH4DKUsPk%8(ed8~R1sN`63!@tZK<&|fz zT!w55AN&sWf}AdkP_yk+N6K4~DB6>Jr5=^5f(IBzxrnK9L)i!25B{YRm22?Y$1BaH zaOE7bC4AKtU_9EYje)H1SHHoNU4?8Qk5w|sK57Sas$GXYD_rR;31mYm0y(PZu!0sK zt86zIs#(fLHIfM=HcGV8lS~6|S(V<290CffZ3{`Mht)S^6zx$r%AJ6i?8Yt-O#P`& zIucu!NC+N8IRI?WY*XZTKAnl*aNKvY4(ztd`D7DMT?djM^?Om5z{+ z)NlA!ooXNIG0DqYrNhX-3Z~uaeaQlTFc`Z{Ig+B*$iZq8>aHAw@&8V>RhLQ0L@v}6 z{eg=QRgMx{(Ul{E2%zc`59GFlKy6n)NcoD0B$S%OEV!kAs}HeO^5qQT7a^0wmCkVS zXDSPUl}Aw*rRz#L@O>S~@6tGQewmHc@D@F8b%YgIRdrd9oi-az-=9iPN)Prp4l_2M zm`KMG@8Ea-p#DvrR=$AU(vy=ZEAd^{$-~emSOoGpfT{<5rAKDLgp8BplmhAuWy0v^ z$n|jo-j&ybKPyLWMxMw$;*oqzDwD^l z3FJIr_+P**lqJ5%X-Zk7ob83%O^;Py4VnIC0jui{7czEb)i;ykITWtZu$Z7NQolv0g3jPPGRjIAQRP@R2#LFGFl#`OeKAo zpJbr?L@GsALN|i~bTjxsR3;+`t9)M>M+76o@hFhLv*69=sMp|rTuM(w_WD+76BL^T z@Q3TwS7ao!nz|)#@`}j+TL=Vm7nDpD$l1WHW99qmVoIQWh##2A7r+3egN;I8X|i+hpF^9ARj9O#~RA*JeR!vjxpx60V>IzX#?Wi=w9P0vo#YA!_$wRvl ztn|kG+N|tAZpvC{1x(1oY>edNl~7%TAUAUe(vF^j!7Bru*HU;}=3thu2a?+!?AtH$ zIM}b+@U?zJPE9hD#0$U+B`VXwhSx;B8woC}J@uCS0{(8E`XBfvGZY_*=u-0@DDi7( zN+yA^7>}MDRVnZ`>RLSeai}o2Vx@HfYP}x`Nvd*5kud&QP%M2`?YN)J0bX*A7)jiQ zKBFt}=Pa-c@1dPQo*L@YuIOp99?6xU5xg4pYyz}TGsyK&u=XWhf<5^M=iluAD?9#V`A)>^90Rivr7l(;$;09FYAv-x zYQti0F|sWddRlvKdVYA`c=X3XXy$4nYa@cW zO!q^_p+?jKk|e*vBgNv0^u|1^BY%~~NgnS{Zz*Y~R09c_`Eo5(7IV}naLlnteYk=y z!?&1N^u!}MfqTv_Woxm|pyFK%2k$-P#GfEl;Pr#lhRS@om%JA>ZZ}kA^QA`eNbn>V zz%}F%y^+2~vd7rENIPyW#G)G_t9gV}uCAI2+S1w~n$=>4a7^eWtU!0%%`{K7BexMg z>NF|HvlS{xw|%1Zbg`i*!TjD_(^NM9V$QXkS$PBUXXLHUt)H8gyDr~tI%L^k9bjAJ zxaVy^?m!BS!Y}X{7;xHmp(c-;rMd046ee1sJ)=L}J`8a{^5f%dbI#QBLv)!2LOg7Vxg;JKf zgk+DCP|$9`iMmg|BgaAqABgTydENuw1e|{ssOti7`fNwXlXW;T8dIsXkzm4 zy6a}fL^q@#A{p}pc>@*WL{#!!lsQssIDP+dTJ0&weOX}JSu(naF?B~Kj=iv!sRwk* ztqNA(Z-)T1#}b2^ggj^xD}%uA*R+XZQ%Z{fN4g1pARn89FSek12}2E7_L zzrN_e69ug~$<$$@m`=TT3YV<27&dDoq5fTgDOYXxc5jqi8u^imGzwL_L$#pu;tc8%70HZd7sK~37QE9jWY3zJ ziI~B^sSn7ke1^Jr04mr|YNoOne)y5nZmhvCUVks^z3lBF&6P$V?IjDh*6v{9P9T>c z49d*UsNQ?vo>)S?rz=9o{Q{nq&Pd|f$@D;yZD;HpG_xOB%N?1s%mjvIf-&Zupw88^ zrEtG*4Tr>gq_z$~GG+>#d%rLvr!abEDE%*1#2Csz-2z$@s$}EVn<{PbcJ$P9$GSE< zKG@D%4_e1sE0>syTAH7l@=YU5XA0Fqt+};1*wmu1uW3YaFKa8?XX_#RZnsIQDmPcY zQqzQc@T^!_H`hkAYD)}};Hcheotg`}83sSYEA1!IUrZ5B@SA`xRi=B109&cMKr_}-)sfiK2iZM0!QVE8 zqAm)m!=<=sjKsQrBoC77qNme7>~t0=Vvix`v5is&S&k9dvr}=tb|$`{ei%kBCV!Gm zkpWzj>I`i?gS|Hisg4ck7W5KiZPUy(`W?LlIk!c~Kbpy=v)Rb3N47q<3A}~OE#;E2 zTT1wTU-l$3gXzs&qNh=Ra&H!*8|5x_gfdHhDpf_#oDrTI?l5#W$+i!)h1s^+TH1b> z)VDM$4lK48g%xc!H!K=jyuNrx(PjMCAWOD2*>=}z%#*nRjNu%r<0MF|C!A~ zdU+|KNE>1B=r(D5HLtb3^%M2|bQ&$Ec_%g%^ZB9N6S!;_f*XsX_TkLCjr;vbaJzx( zC51o|5uv6i8^EB~#~m~Rtn+@TCH6u)vmESl5){3shz~>|j2E-Pcb@`c^(P^tEpm}p z;TF08X>(7I$YX{Ac{LD{GdTYx89nQeeK<@>#m%EF#+Su8`4T5_8=RoY#5dv`*&R8{ z!>MUh95n(u?eFw!Ivg7O3E*5Sv#l^Erz35&6UTB5xCdMjQhnFqYXNp586J!huz(Yo zblO8ns7rjv6~G~W!*#P!{!cpXedp=!$wPX0q)X?N?N#h)wkL2~jkE48DYopftg@W5 z^tWg%J1vt-)|70v^t52%WQI{M6 zm;R@^=mDNjg>oVkW1SA2)I%gEm4aSjlo|%*%WvdvJw&Qef}ADamnR_SFj+b%9g^1I zPd!QT){{87qWl(5otmW|&gg2U3{U$i1D8 z`B=!dL~>bct^ya!?c$ztSGiE`Gdi0*;I?8n^+%p~clZa&Fmvfhbc7pD9VF*NZ#x>Q z=eOwVHB`#;e)2Z)*7meS?uXnKhO z;x4hj=*F27$6&Lija9&+x4(>&R2f{>j+2E ziod!L=$Bdf3-|mja2KpZrI`TVLl*o|$5r5Jg<(?{5XCZx&e;|64{sehe^Qh+8=q@ z0aOGz7K#@R>A2U_#!$6gRZc#<;e}-d|cd3|u-%?kmrg-^!1WU;08ymBM6~ zbO32~Q*ll`m(ECg&_^!{qq;!8BsamG<+IZM|26Stq7_+-($eF>n{+_`o+rpF7|s3Q zI`cD;DxJt9&WumsAM$JXNqi?>;g-P1#d5dVK(;MIAPIRC-HF-)PAU(#7k_m!62Ic` zn|~ou7)cAB^X{Lnj;pt5FyJEX#U1-xd z&8|kS-azjObXrK4Z_CHjKx#d0q}Nk>=oMVDkS`2}vy2uqHJ>$eMVl~L6g5}HMZz8Q z4^#NQe19$&uAjs3rX8k_0{?D~74jR3qbtxzU4vd_rCLRu1vkZ8IFlm4ZU>;VoK3b$ zt)#J12(r2BN>_k04@G8Ml=Qdvws$e|1qVxAr5Dm#taUB$|19MoZXU0QPGmN@lB!Dw zF`tp7K8LLjhxrvKM-urm!ZP7HeC8{J!9swLhRpq?V0?#jdhR+>tp_uEadwuY*WyOl z5UT1pxNCOFWpVqMBK7z7LSp?TcNuq0*EFyOy&Ol8x9qk(wgubzTdP`^S#Me+tOX_i zS~G0#Y?rLb)-~uYHP#jFT;!TB-NfnHONJkXe#yjP4Nhjt3J=A0LI!u3udi9I9ih>R z1I06%WX*B0CsM7KgRx)EtE>;3jokeZ#*ZEi>~ss2Dq{W0eZv1VWHUzu42>{nd5Xp6UrAZ(%aYNS zW|n%^8DP}5T3jXf93k$_&J25!bD(U1I%uA%nrkMk*Im<- z+9Q}*5xS$gw_-3~nlCR_5_x_pHZ7Uqb>5t-Qa!(OLgQG zs0^QBOv>Sgw%L2a`xrUJP0>Meva}ExfV-u=(k{6p+&nt$GPzKe{c+e_A{qey8%W2~ zU+Eg~c@}bgd5NpamlwK=JH)lesFeiUb0iRAJ#_LwU(ExvXr(|hW}J!IavIu$Y|M9 z@(~Q}`Qn$hFRrRC!k%gGE=?tmsTygzlFT*NM6e4~6V+JP*w|S6g1yQQHLNyn(;XA? z#Uj1QkfMp_lDKmsp%HkQ4x!iMHqab;*bH=Y=>R@kk=sfgrEPF8pOO5$?Ywcw3f_tY z&rEMqX_mK_Hyjy>tH9;#My~Kd$>}vqtx>D^;smGwz4!_^l}5m~b(XqEuVYM1ZDgA- z;zwfEJQ7xj(=`^2Kl(P_MHjRkIPG&Z55;AoEFMKh@H%b;&e4W!A7md~BTY!)f216e zDm*l$}mTjDIIN@|vLEuI7)uFHI<=&kvOsk^yp@hVG?;)muK zi|8ore&A?i+wZ!J{`LgCm*tqJsD&SsorqY`VI1XCLm>Gjx+}(^hV$qYUs3J%&tH;Q+@S^j! z*Wf+p354f;2{L#I5FSLY(LjhiYhTJMA!SUEL7<5`Aag6>U4+ zI9(%ckY+5hlGBBroCYY%BK8xFvBXG3siOSD)6Ub|)6>1t(ZY7ey4iZel5HMfZd4Rp z)Uq%qFD0*K!TN%X{K)*+f({s$n8I+8;)a2ZF++Gm(rXqWo%%W$V8IM zwF85y1RO#qzJH7*{_lK#Ygv6;qseEsw!UzKuY(!0m$^Z4)IxHpdI)DtqBKk?C%5vX zx_-Eg=xNXq{Wkh~P2M`*nI4Ddv@{&K+smYmNPP>&?K1*6)F2=@7vY=vM2So@^h!9v zHis6nH5VpS&?IVFqOa3CWE`2bRdp}*zYMG)5y?vp^lNn;w7)cr_L1o3e9^_C0lS2L zN>qZPc%9tYTgL5h?Qyk6-dd{Vm1S;mcau=quaGq@%7306o-O3Y=S|Jc$hPGi&6}BD zA-`6ke~HGv!nUqtkc*_Q(Pw}S#%WIYH}eSswo=BgOISeQcHKpNv%pb78s9kmU?0|R zrcWi!Af6IpfDYY*zwSD*Nws*kI#0Pmq_)x-*C+d1$2|9DPc8RsS2}WZKOv|2BRbp; z2g^QI8AN!o>n>8OknN$ixy~Mw@Y(P46}h);3$`zPmw2drmv2jlJc+Iu&Pt96R?_mTsB=+m z)0+JByxaL#^VVmxnWzmRXqG-wf6{+RV63lJAL%m%`DL7V1|2#+vC)(rZUZAxMIPv)9Q|FL zy_Y<1oT6it^SrygM?~83L#YHe-}hif%|tkITXLyp%wxJQ`e(Fdp0k7Djvc|KBWvp$ zx0&C7ersdJ@|sFweW9uNPCHf~u6JrzYn|Guy2-lP@NzfQm1xR{Bl*!>B`ysW$Z4{x z8h~`dz1|l<3*I}r+E!XV79BRXH1#V8!wmnFJ3RY(2AkPF$2a$Fc1)%v>qXv={8I)0 zn4Xm^uy?b4bdFG3G7)rB>WFr+|2V%NTwQjTaY1OckS{*IhC;s;0hzwl3{MSPedg;* z2|4Umt^qSfO_Z7d6*%mz=(uM~cDg(*JQJLy9S-MS&l>OFUcHnqFH#2+K2SU)P@U*n z%r{oc@8im|BHNh%D&7_+^KP~U-%q?Mold~tY zW=26q=WID^A`(x2XFkvI%PXI!nig87*(h6~Yc4^do*csV^H~jul;lA#$JLbE`dYYlz-BnjFkH2@H z*H^9vomW*n+hCew{n&fVZT1TPS*RqmL<;@|ai->hI6$ng@zuW5wAW15bkXj>Cwrx7 zrcKli(AL*vLcvl~+Z{Vu7JmSJDjKnFWC2~K9K`(r{e-A1%2`}8uh+A{NCZbTj$f)Cr|fSIEL(kW9%79P&?y3a!W4ooJ0Dx zpXZUMn}@|L?&D4I=15U$JW&N5uJ=)i%s;rvenvNhW=JOAjXraCHM{W4?rGcTUh0_?i;ZTV(P5MaEW$$d1C%3eylXv1x7Bgm z&f8a7OIuRSSxEVBh79+;xyy0_v%h2>%^H^dD!WQnOqL}(B5!bh^@2O*)g}41e;k+H z^}$58V(Rlhw6ea7#>U^$mh(&WziYf@c;>Ui*xu)q{-^$neyjE^U&yLJ;BJ7^ya!KL znA!}t!wb?Xc`#CRV&zH7W2jjI2`j=)-AHPmh5D^3?n<`>Q8P$WQS(bvMVF3Vq?7f{ z4A%{F40-yc`lkBNx~96_T9YOlSroi5ho8W`WX90F5OmrK{V(gvouxOPUheL$70wvP zecMUvk&;@LaYZra1*X-7`T}d-(!BiK!kqItb#s^J=H{Hp`I_4%Uti!T7-`P1G_mcq z2fAiRJ%}094knA=D^|vN!)vA(rWgsIPKI!w_dc}GUj_xrs#IORcvd(g{6zoVc)AIF z5nU2L!#BMWuE1esm?M#9oFDEs4J>R6<{kHrl1S`ubD) zT84N-AD<3Bspv}mQQzx-?Va_16leGMcVu_7k_0L4E`ee#6n9D~7Tn!#f;+|CLveR2 zTBH;!6t_~KlmfwuOPt8=tjz55zOpy3`}-d}za;Zo$?ojTCFeTV(a)hC^GnAE`&-+y zkTcYwRm>;Q6E~Wkf<1KHf5A81+ZfBwBiGvW5orUdR2Y$bKJiAvBcgWu#;*Jr_o4iU zv+vapwLd5yHoUifDD*K)?4JU4KC#88Ua1|^zt9f(<{MV&ALWwev9*-7i1m!k9=axM zaM-{wUs%QP^sun-yW#7?KZaf*Ca#8kye%|jgr$>tF4ZXW$qVrGW|4A$VmBXu+h#H( zvVf54z~)t7Uay={XMp_D*4iz^X4`FBY(MQd=ByFAJTx)1Mp#Ya6W4@(6T05H&#}RN z*p>hW%uLHeqTVk{4e=*$(P#Nv`*L|5o;q5jyNK&W8sVxbr@`ddoOC#GQ^KtHH*u@u zO2zGrjfkxjTQ@czk3VC_$Nd#IBwk7!LmX+Nv_N`St(NbVKEYH;$q7P3adSS)uOXcs z6TvOI>Z}|(KlEbgg0NiSo5BLlD90hBz5`S#GF#Kk7PG20QC?$Vy+@wadi07n*h(Lo za$$Y@Rr*eDkN#58ywzNtU8r=34@v2WJ(@VeUe4>z&Y@d~yS(R|;j9Uo+F|+@6LQx& z89C`sDuZ<+(xR>b=7qnN?^~*o)X;R->h!^BLsOfixRPfi)k&mj-o@gFxSsaqXF^Ad& zhV#47E1^ZhR)w7ps~Yyw`GaGnJ=GRrdxRwY9BX3>b*%CR8**-WHdR|g!Dpxf+C@C| zagWHgsdna3|21#7^s+ia=7p59$zW$bbaZu|bXr3zgk}x>&DqfThr{Zy+g%|^ARKwX zp&6;YrgF+${0C=11<7lDZrkRtIwfZk z9PaDT^R=qTp)NrSo6kCoTGbt>dTmyJ!2aA7tE-iWwKVA~d`=_e5AuHH zu)5G(7+Y3Js|$qF1lv>Q%+Ah!-`O&BK&X#;2CEzadrf-~ zpp(CXucddD=c;zl-QJZey#qCg8l`@nvOf7^;tYCqFaBBll=yjZ3uC9m=7>v)TNNK2 zUnu@oT;urpiBmuMQv0NrcbT-O-YCN*O;&50hpH=-KUFoPgyR?IOy|FjpQ%J16S_3K zb`~XkrL#90SV2}>PumvjBlB4Gtor@ zmu0p!CZrM>6HC|$@_?K&Jai0{_!5mS01{N&kQUZA=HY5LWsUq6jGnTAaeA!p74;HF zdirWE*9vN&x>Dz+9!hEQX-v|_gz53$#czq<9)CP;du;aD8L{i)j>NY~cpRTZKESSo zJmf=^b{%#taXay8oqB2& zZLe*MZAwU9OJ8-gvQ8k`aq+Qg-0QfT@q-c;CS*fE*pKY*&Ou6A``@Ezq${*D!WqBTc>AB z88hQS2n(4!o7s|^eip@NqnxvE6Ep9C#IWRJ6yxHHNFCY zmhw1ti8@^QOP;E}wjQ!S0SPP4zSHh-40NW34ht&~ddr^Gwl3sO$b*o^A;qjSk&JRF zm9TA2P!`F(r9F7&vykDt4|`N8e7onBi|S!>H_NZoXI9jeLJ;wGkSzqK|Pu-u_9!-mLzjBpx?MZ)=b}+SQ z%D&_|N#_!KB{oQOB@|D{8ow;g9d|6gVZy+KdI?GRi7OUpsB7LlDwtI%Bjem1s zi#$WUtRA6q;4kW7YcKma$JdVe;4WRZ7j@1I{U!8UXJPwZtYjy#F1oG9v2I92yWhm- z{RS`Wf8;Omsa=-4;}4#o?pNc~A?Cc6;~;EDW0SNXS_<__>ywPc zQHkz^z6smoljAnTosY{FUpu}T-a?M+kddnvln&LA%?wjXoPb=*K*_@O%gI+#2kWd8zgKx6)q;$A6Rq z?DS-1JTU>K*fY}EHJ(~>Tbo$BVKrZAO|?!Ac>~Y?j%q54Y*XMFn?v4%Cce`mS-N0P zKcxI3C$a~g#UmjH5{c#PL*2l+@Q`qCVNY#sx!dpR>>85ZD6L9r`;_CK+I=#T*CwmU z9g-d=UP#mvTP2N78k*E0X-ras? zaS_WD*4LkwbC&DWi@9z2o$8H!s72V&(i`8!0Akd$TauB!I%4y3`ToU(J_5GMrBB;7#V=K{Z=y9%OE4Zi>u249j>F2vdESwbguc36G&4x~yht zj1{=0r850_Yd($7y*_&0DeBc!CAwg#Qcig+uaY|unY&&3T8bf?^*c~g7G`9~j5DfX zAvE+S_=BeF9rf1ww^XYsgBAa#e+w4siT*bJ68;aqi_|Dv?OW*^kDaj`7L`1{!eGqF z)PKI~eMtQp!y5)lpQv3k+jrCF^w;-~#ini2`{}>wl2HdVvn%9%cO(DRO!UooFdIUM z#N3Y8IS+gD96V0s7_#yzQf;+4+Sf?p8>aF+9?L{ur5k?eN=gnzBYNOCQTWT`=}<{k z_P-*;(ORj~drK0PXr_TrHI=xF_E?n7%%aTmM{MCLK?Sd+5iMB`+Q`pHlxN7l z|C<=Pd-$gJ;V(Tz)Yf`1K}M0M-HW{9y5KqGBGcJRK6nyG3e_a;k^g-fjI7(l)Sdzz zW-Zz7y8}l-WBQqVp52w*l%Al~hLZ-2$Rmx05SB zjkB8(kJpYoj;df3*}>e&M(lng#=0au*J-y4@0d)U_-iuzAAtt+k&O7?x&QHu-00tF z-wxWokG{q5tq;vG7tw%)$@?~QwcOB5YckC9lWCuq*V0gMHFD5J^^-h&T8?LsaPRt%2@bhaNVi_gT5a4d&(sI*^!wF?f7> zkwIRa42|~K*k%*o*O~arSYs_12n+CejgV@YHcJguRjn!a3RKY3{6z!hiI#Y0)Id*c z%S;ys@x8v`VE#6dGjI$nrOAx(IJ~q|kdD4U_S1;ZS|d*(2BbSS@j*!Q1whVxOue7U zU;w@*n&BArEV4@b!JfQMMtVB9RXxaCUkg6fL$KBw(|13;o{bMQ+~@%=NI@_%%Amm+ zWUB|5tvmSIPmsI+BmTVw0Vn7F`GF8D|H!ky;8;?qaU%^*#ajxU!&G- zQGBT*13%%_TMiDkDGu>1^p{3W;#qfC>~ig$yxdcy# zSszRcaRbndRvA`m53dE;sT91pKDqdLL1tLS{CogkYX}+M9%C#h67x-qsPH^JP(^A? ztg2TZWGpvLL#z3Lk$g%%1sT7lm&B$H22Uaf5uY8g^;TvTtY-DqB7#3FT&SmMyz!-> zf{t-jP9n$RguXK1r(zx$c!6K>zAYdE^;^~eI7;LbouNjhldDyc=VK2mM-=p}zL=YW6_BFo<5t$g7|AIY01s)Dv0fS`cQze18X@&>61pcndu^OB6_Kw?Z5hEj0k5g5 zyr0@he;Qp)NknOenMU9X*ejJ&7E7V}IRA;jZDO)g0#E#TjE$z+nj!x z*GL)z!b@Rta_T@=gUB=6LX>wUB+^l)&3ZWTXbVg+(kkf!6xD@QBxoTDT-#6JTU9sh zG~STIP>6`%dql3xBKziNICdmFZwOjeagc+afIZTM*?l6FkROwWw87|ZDkoPm&8J%X zR507d3zRwHhZn)U-2v6O36@QN^yvhmo@(f|OzY&rpm3Zc18565QLO?kjIM?+uos+& ze~j{`DcHJxP{PT5NC0tl67;*)C~TA<+IJHpmPn4*TKLUrQ&VE5;~1|z0o^2#sn-~U zwj^-%RuWe{2b!57*9?rNKJwwfV$(D5{6;VX!{C!mjOFn6$BbS&IUC;w>PtT{+J^#d z@zb<~{!frGLG}xnFOkI5lz>xuSnpQTf1|hHc~kvFGJMscFcX{Z=ZI!RyD9rIp*%Bd{6TFA}(AObj%X zdV+b?U-}&sLePT23Q@VYDtU=*Jpr2FKxrYn=L)P!;ZoqHzXfKH^N~I9 zklcc-L?5j*T_OAT7y9un@%QbKXU~wAGDlh*$PaSuGOk)g3N^JOufPX_*)Fd8q`!yh&j#rulsOTOa*r&t z_MqpCC!Xg%hwSQm{ZJE z0W|RjQp>;)V)`Mt5s&(n)Q5U<)fs`jZs8Ak#akQ9o7`U9>F z*$_IhTe(528VVmO!pJ@d^fK9?5b$E)O@AP__9JH?HgJ$Ej5K=Gmu#VTj7Bx2jz`$E z@?mX#kNj>mwFk$`5jbEtk;lp+VLpe$E+jJUAe`<2ISfldw#`TWzzfrFe0u{-pxofn zRHrAMpy`fST(S`B;5L@B0>;3TD}%Z8iB@IIS;dHDu4e-1TN4FH%(}&R&MRG#iAjdLZq!Voi;M$`U~3 zOhfj}l@TkL1#Yq#uCf(6o5Jdrk=mM5D>)izP?EMYn-v1nOznsoZ;ga<9yGLL>|CqhlA^9%3N;?LfH}B~ET4Yhe^zE4%n4LLu54>+Pt<5_qHGs)wOaJm9Y`~d z1!g0!mj-{bJ`tja`Tb+?lQz=ttRPb9#z(Sg`f;s~P|S6*37ZiQJA?UN3dJrX`|%-J zG?Ju}x4M^Ay&Aqe26W5{wDnK)kV%a6X4*Lz8B$_i-?0-$bI0wbK7kVStelh$PB4|$ z>|xH1vO4#Jo5<+3 zY3F~S>pwtrI?nah!NF^=OADN(?p%2Z6f_^CrR>xp{=^j{Xls75RC8va<(5KHQjxXK zQ@yb&tx(`BkI(*7#0ZI)nB4p0TX~ ze+5&OaVQQJqp0xsBYS2~_{vhAx4;#e1lqxezhaJ8GtO0z)IIFoGU(A}_J;)Hg>f6L zwJr67O=RLsGwg;-&qDm^3S$BYYn!RSIhyxYw8mMC|G)6i9?;6yw7iN`i`?a9$OBj4 z+b3C>#J130ofzT^%z|Dx*ZqIj<W|CpIUV<!0+k z*cI=k^+*d%JC(XU^|dA6Fk+5Nc7o_1S*{WLZn+cT?Mas zB^m3hj4&wN3dUq88SpVuHu^Z6zOSZYfteT&JN}q&ks3Rqj}<1Xt9c+Rt5O3W`VpFW zESl3sxY{-J*@?t?_CtOgz?cq_*OSfEfynDf5b6`Dc)LO_jg7&sbdzhy7m0WEGv58E z8{0;ytGuG#UK7yebE!9#nZ#k;RNg2ju|`x|_!y(yB|)32p1vflZdy#Lp7Kpf`;^wH*@$o5ow7Q`pL#nzr`x18^TZN~Qrc*N zR!~lZ<#QeZI+_BDi+FmbYs}3EN((DCM(ECpL73GFiS$bWKe>iP3rk zzvi9meTqeChyT96JMnTubPFr=0vY8wV$CUI>%Ti)e|4QqV-p^H6%i--g$Zfw=-X6z_Epm1G>!d1;lrl$@qiwGq~~d&H|wv_x5oSZ(kA$(p?&jD8X z80tG;HR_TJc$3jiF^!WFrMl4nUAYx?jQ>$WsrQgY&8n8gqWeUdg}v;Ze2f~A<>ZTa zTm#s;_JMh~9=SxwdClO2zp_U{3BdJTP<{)zmDOZp@12G&4pI8$+UiTdoZYq4%UGj#+hpq^Y$?j)a->nJOft;$fP z3fWpGsNJzbG2wAqiEr^8+~Xk_Bg?55Fb7ow1^9zXWjuP>h)L^J%R3LZ%B$242 zdDnmnAa-Q)!PH>?kMT1#8KT)`XR^zV#j1LhUDrmWbPX&~8@bkQq_a|Rktx_yj!>bY zo%A=ntqHc@k@ByySt(CWXFx8jbmjOUPlJOWV#n+ZZ|k0c;olKVyt~8%uV5#BA#@aE z#3(X*HY07U$M)lt3P=X?l1u8uFDgpO?Ab%GT4uxcb(;*|yR@w&+2Bqx_(l5hDsl6i~)vQzoT1?NNmgpsUx!+ ztkXVJ@qQo`X06Yn_C$WF&X*ugu^0I+ui2MsD3$TQNy=huu7L;c}{n?Zf)K@Q~G-JnHuCxZb?Sj0Vnd$jkKl$?VYYnAyuFFKgoin$I&d*1PQeKVlIV8utXGqq;nD zv8o?J4cn0DBLiiana-d_oFaR(6BRK__y_vZy}i8$JZ(I2+7hj~_J#J7d%AnSdy{*; zyO?J8JoeP{Zu3U_?D{v1aJxWVsW^2!nvqQs3cjM5Sl;56e3sefXXIn;Rhz13l~!an z#bf`Nhs@mvG~+%-K1OIX`8C;$vPgh$iQ@Sd=`{-#l!n1kb1I$ji{@6RvQ9RU*ZD%Z z2#(=AB@*7$51HW|vR6^GwKGr{xXx62xIo0rBy7aPkOvQ|g&d2NX$dncNjmB%91=py_q53!)#p+$d?M|@Nt zpic#LCeF9gd)BkV)76uty>$&@)}d-8Hp>o{yd($TG3M(onn1t~E|B z&Z_BxM{lp%*_>$p&eDk({c}V?_?7JH7$rik2FI*s+Jbgn!T3X8t4Hfsb+ZxBZF$`XO z85>1sq~u2E!Aa&g={vTZ~rzhE@_l2jXA3o$R+#899H8SdD|QCZ5Gs z`Ym3bZ0Nokt7<7A@tK(Xu=102n&P+N>~iG?2A;#X^od684pc&xOQc!5>~KLc)Tv5 zjlP7c_CQCk^zwQO|54&xN8w)`>D}u2Rm-BCahK30Y16a`+V|Q{_XKw~?W7j!dExoS zm+t%CuTbx%q|t`zfKB8m{HUSIpJelHqS9ED`M&C+g7^iZHJT#D9FP~npTCg?pq+cM z*!6-s#zOHM*nt}}9{aFcM4P(9KMqm#=L;lSksoYDTlxoWsxUcW!!$x%(m%Q*$R*9)p-&rufmq)(Fqy8BCA}El z_Z2eL_tJl)JyI-trb~JSA1H(WyEa(JEkRdXhvYRDiTDRvTVL{EVTfie-p8`go1Lu~ zE2Sz@$9yD(?O08Po#6;O)=uo5!iHKyWK6J@7Q(6f!nM87lN%g~4SGd=x4$!Wox1oA zcw2aVo~NGuo?M=N+7m6iCs8}A9pznjPn@Tn_nP+)-%2uDr|V1cE$ASWnB+;&xtExe zFV!Q|mf8vb>!yaQ#ZhiD`bIM(kl{vq_PadjoFZptm@xy%t_N%QhH(`8$4dC!VfMme$Oe@_E-!&S`zZcH zY=qcx`qI|j?Cp_w`tLIfd7+sy)QPGN?$k9|C*$A(E2tBDQ6KCXy@|R>#*aS|skk%q zR}tCy5mH(#bMpi3s|-5If7oF3F$2o<7Vt*U%?5^(t45e z*qum*IY@5p$>HkiUFT`yF?)_`J+&{j2k!GoZ0YWtWSKr-2iopw>#gtW?Qf}n&=24> zYA%%_KJtz1!4jY=JJc*>cidMyQW3BtSQsVMU)k3qP-bhAkS&u`|bt@A|^^)HAkaOb2i>Ajp*@yN)cT`P5U(N&9 ziZRY3LDx1y$%wOKEr|o=?Fi_I?=o`F(^)e)k)x*?$KkANj3dTJ^7@A`i(9aP8myQ4 zNCNl4Xh({nCRaEJhO^QBKEVqLK?9UeM@kDIN2j7+u93%LNt(_%h4CYcT3#M@q<_I| zy2k3?h);PV+${n;n7mSU=?l<=-od?pMq{kc{{M^>+7J2V1`=~)BMXQ)UG#_kQGW1A zeZ73|$iKPkiSjr-C$v6V8O`H9>E7nP?Dn9!G}6XsFSLoCZ@f02?6>O=KyM`?-EOkp%YB!@6=Q=qwyvEt*<`UE_mb;^c(th9yiFyoQ8jT1grf%8sjOB=Xy43U#_9Pp^X)J0E=@ow2OOqQo4g( z=0x6_CjTt|EvJI3U}wzBptaZJ$i?XUWxs5LKU>K_zr{Jv{+lI?G z@E%QPO?*QQxrglaorqw$!w%jTTlh6k$(@EP9-Uw+?eZ=$CiJZH65 zN3&{o-7CmktmN+C-s1k#o#L*j&DUCbdU!|qdiZOBT#!QTpn3R}yCbd7#&%eO`gN)5 z6-Ij;89~j>#XvQ^jucf?DXTcClAIF+mmW~VD0Z!;&_W8 z3QhG!#;QZ4P8L>5H26fd=|u$E$rb7r2n+Au$Wv3;!zFw-Gl`_>gp_@itm;VUXS6;M zB%#{q>n)KY&+311yaM5=191WgMn&Z2-`JmfWBc{O@uS$G-Z9hvp-$^*te$V=JMfsl zz*Tz-U%idKcob>sHGB6fUQh6d!$+JOq>D$`|E_ZGCb_3Si^g zfh|3h7=X@5w72x#SPjbSXUW@rgyrTt-$yWDo_qQu+5W1nBe&hI9e1xq>v-la4Q+SR zR%t4Al|OhTtaKCgzQj$Si%Rq4iSWFW@^q!8ng~TtN9tKg{8t&XN9{zWZb#yvsw!V7 zXOPg(Nn4@hOK5IEHog67tY8d9J_}gtyHBQ@9T_ zH31yK-{dnqk3yCm43CLGA3BGWG*RkBt-WyR2KM^e*sRXsyNSS3xC(i#h~b4BM1wlK z4s@IQzR6_b?)2tH0&48Z?U6i>wRuo?39XtoSlg!E);?$s&j!z2@6W!g{*8Ja13XL9 zSfZnsbI)o}#Ym-|x3ht{fi0!cd25WE)j$C*yS0e3rvFq=E4@cnTTTArD zNa_`qGM?!h8Q&q`g+!wjb_6gw8SyJ-i?q#TNW_rSV8zVD@sOwM}O} z4XFZS{XMq+UW{gY+Rz5QtsT+CwXj|{;Jdn5$!lYy>VltOlYD?t3fT7 z;ot4x-mf!k9HsG$M6pjkV1KD^m_Qkr1TNZrtk_OCNJHNpZ-3;M&7Mx4vScwn(XMJ+ zwe{K`n$1(kGstt?6G298L4O`vegNO$2BKUBGV?p+jqE1(LD$`?j)kHl)%oB)?EuYa zDfS7CwYU*W;|`?WoJhKls9`Y?uUbR&`*zr6CL<*;M^cO@UZ)A%WdJ;V9AiJ25pIAq zPz38K{silnv+$@3rN z#e(>uI>9rBajyj#k40#$>+rv9qsGcfYR24T$9xV(qD{)fK2i=}PCe{(ZJ>hb(jqwV zdDfg6tRSnb;*H3Tmh&&@X!|p0xgEdIkrd}3BU+KsW`Hq~YV2aIl`#I&Cxh*C6ZA5t z{{&H#R^KV_bZ>iaS>k4`PzApW01#V zpwjEe=2wh6yn98Y;}`gmnqe1Ohj;yNYyvsZIL9!WG0frsBnM5Z3U@lmu9jPAqD)5< zKZpMPOi2JE>?slBTkvaq&#rQT-L9Ja0ffC$$U#4{jvm3S@&zs#eX)K-W2a5JJx=zw(gDrXr@7zHm zzeba}Be80tK~TsG!d!o3vE^WIO~v!joL$+Z+-3bl!bx9YEBOiuXE(Y_8RF)IR4^W$ zs5O#79il%fBkx8)ef7{~`rrkci!OQ#-CDvwSs9uhiaap~y4s6Gw+AWdH}s!9{I?q| za19i^5UN{>hOva#*~m~67&EHeL7T0yKYqt^Bjl=zSc$$wf6tG;6N1z);@;k4e|rlz z{sT{{sOBkZ%j}|cYlt3LOWfFIyuEASqI1#mC!x>wMK0@%1*0n#ruNu0+kgnz60ccz zo|_`AH)i&}<$WY)b>-aQ{AwO6W))Z3#g1_nKk)-R=5csyRoao0J+Ul)&RWn@V`QfG z$obvaVfwHt`_O}-NabU&LXBlT&qO+(&#@3&%xqTMZ2Ys6`BucD^rf$Du^TmGMb<&G zuZG6(HDgzSqY^!jfKE%{k1m8vos;{9Va*gi4N7$pz3Zkmsd$i+Gma#5!B|=tm+|}& zo%Jmv^^WJ4#4x_Ys`G|tVf%Q?yElCIn&VZ*<6mB15H;|c$5U3pBfQ%&JpTh1zt1?w za6IOCf{$06^@hhgt`N^XQ)!2XicJA*R%TW_&`7j13pDTrhp@=y%~)x9=tFLfJbd;A zui1DG=R8q^)K0I=^h-hRH{t&lhmSr6GT!mRd-1vGx%f<+C1pGUd`606#(y%Oh$|>u z%fzQ@#ub5-$+)_baUKx=d>8z6Amchz{o+qtU0h4tN&I0%%Xt0#B>p#u6ZP@%^ZxVU z{qHB@7s2a^t1H}D+({gwZNLC#^iT9qv`7B$Yw$mo9G{8yS!rpoo#L#|X9lk#+Wq;8 zlz;m_f8vg!M`A?8HyJPgeHG&-zWaQ-30@~=%1?X6A^IW4Gx#fUw&;ntl4yDGj-vIV zec~`@JO|q$dLa(c*Wmf$o%lqIWbhL)3*t)u8}(p|#Q&mAJ|3b)Vq`^o#HV7s{JazQ z6ys*$2)@0jz^G&#F&Ze2EP^aDd?EN`s>lq{Gk8g671T!C!ywTktxc?jNovV*i4ypljCv+}9NB=ERx_u2j+Y;5)HG#JkTk^}pYX>jhgFZ29N^L~lbf z+9Y_iGh@xzd3DlC@fuu5VXPy;#YM|48SliJvhm+%o)nw~F}nY|XK+l!Z-R3eoV#F8 z#5&P3){2*X!rJC3yy*}<5%K+u;0OUdNaNcj+VGy@Cf!o zv{l?8*pL6a4n^C8Ttj>pq$JTU@o8|JgP)2O5j^iRwTZP9TruKoDP!KnZ0i}^%>uOq zX;tE#pm8fBB0jZou0mv?mT^Bb*A??1##G!R*a~sa%)iVL$Q*&p5y%{Y%n`^Ofy@!e z9D&Rc$Q*&p5y%{Y%n`^Ofy@!e9D&Rc$Q*&p5y%{Y%n`^Ofy@!e9D&Rc$Q*&p5%~W- G0{;(ecE51| diff --git a/test_baidu_api.py b/test_baidu_api.py deleted file mode 100644 index 06992e2..0000000 --- a/test_baidu_api.py +++ /dev/null @@ -1,111 +0,0 @@ -"""测试百度语音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 deleted file mode 100644 index 15e6e7b6c89178403e3ae16e98fd541148a19cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64640 zcmcG$1#}&|(k3dYX``7bc9@x&nVFfB6FgyNIAJ`&6J}#Z4U?d{&(Eh?2tRbQ2a(Esd@^TNBozyI?&{?8x(asBT%3;+N7`ad53U%UL@ z)%Cx7{{OdO|0_ED*Yf_qz4c%7{Ga&sf2-I3C))OZr;Oh{=J3ZL{pa8RSYP3rh0lL~ z|F0?a?=lejJ&OP1SpF{Icj^Cr_jkF!OJbk#K?2+re|;A|FMI>TF9At#{X56M-zdCW_(tJh z;Z@;#g};C2DJ-clFa8gi^ZV`JefaOK_*DRW{civ7z7^j4&r$u)>)%g)x2mwM5_}XS zLw&znRQN>vS4;j~_U~Tff3@y+zkj#2Fn8hmg?S6h`mZ$=@<<`Q3rCi5^aB_;;&i@Iiv86!lx3_L7xiq6_%=T z3~ejyrSz-B!g>YxWrSW!kVE56c&D&59n$}zg#vFEmc+P~=R*k&sM8AtB0uB}dGdG$ zPvVI@hYRq_14Y2y!V(cY$%S%k+yYNbP?7<8LQ4v3C@jOu3!sfA=1x}vHvwu;AAPPAolnb>KKwTDI6!}Bj^guZ?+){4(e`*nxl@W z3i`&!LMwNo{?PKCs5@!|bQu6GID`CgRr~;@^Ui!KU%~%D$KjoZs4rTFQg|%%xFuX? z@=m-GYJ_*AJm}+ieu{tLt^2%r?&I|+jyKiLsKs#+p)62mBkzD!I!LXi-e41Gx`wm|>=PB}S+R^*K``jP3XhOG zKBGNh7#G1tk}BL_X^v=@8?VU;E8qb_SG<8%py#xq(2^bO0xC%&h2=zJLwF~lhq#|C zLK5ysBGC@?oaEtjv<`>jS}1~rav9I#!F(~^$e*&dY!ptS-Ow#QlRQOFw6d%y4uNqR z#a3cfh*$Nj6EDsKNdoH6UyHNVndkw2%%X5vR13Ew5iHzw5Fg;5u*&ueo@|5bGIyfS z^b9_Wv)Du4+qDdrBq2PV)<<>8J#>w>;eX?N`hhIK)#+Nc9Y^A_cq<>GS;dKHz3Pv* z5)*LVNPZiSU;}6{;dp{}oS%hSd$Uc*z_$TE`OrhcYIIs_${eH$`p6qmU-F5U=EZO$ zR*flS1oGq0P+3wMr_twBhw2L|ze|E~HjMH{be}I~zz@kPHV}6rec4Ic0r$Yg(KoydC(z-n5=vns`6aXrjU;pNZO*lW z>=eENeBBwhL~D3F3Szgo2Rh6H$WMM7W~9m&lFj^@<^akJ5t^X>^d|3zPNL1U4Qop# zlP|bBmuXLW6Qz?B)E4IE2$+R4(VyrPcc8U+Dyo8CP*t14r=c>m%Z_$TL zhZ(BFcktHy7~8}fuq`lSJ7X(~WCz$H{+K`EpJ3(`!&$&-4Olz+n(gDoQEOC!uLbFm z#0sGQFQ9#sNHX8g{n10d5uHG>Xe_$QJEJma7Bb?Z7?YPIn6xJENiAX^9>i0)D?BAm z(h+9j-=sddNE(uhcpMSQUAzPfcq{fp>p>p00;%zYMbQm3QyZpL)mE#2s1}!-y3Tdm zS;o2D5pQ2%A8v1DziUmlRJSA-T(|sbb+ctz2iqz+t~r|6E84C&F44hwDXB^-k>w;x zxF>a1y6du)Y07z}uI`;KT~|xzsnc}(4Bw2EjoJFY^>+;QO`+xs=I?GDJw|$pUjKMe zuSZ^WykmXF`la~Vys>w(SF%S5b1%baeW)%;w4E;yEQeul6K*~w2ITix;$@TjxEcO>6WoDb3x9E+ymJ+ zvdnq$w#({pHUi(4Ug*o3Z@Z858sj@Xpl8UlBJCqihCdH8ghmHd3%Kt)*=M_VHLp<~ zdUs+L_1%QS?3i}db-_N$Qaf)@_R#cK$yJkT#2<^f6ZPo(v+wR-{(ArD-MtT$KG*+z z{8O=Sdw;BnznNSrH6Y_dUcMS6Z!<)Bj0>q*A}Zp(*DHM!ua-p*mHk;_cbF6!A9gA1 zde8`;A?8r!oUmPR6IJ|E^S3q0t&&+feL%*&oUxXFtWv?AJlQhc(L-&mEn*`{wlqgK z);P@luGeVqGv2-ZMg>g^i48s-JT-JhSl!Twpq2r~fO3A%JPGku`;*^**-=n|c&xc;So(+7t?%lwTwLhpInti zPk%bjc|q&!Z3eC*|?ch%p2d3XN9#;;jXWn&K}ElMLf4_rHyk)9KM z&xYG8_OH}G%w^i|F}~!S8n>&MisR7dMfQi+4IJu0jDd0!e%V>f`PF&U_Abvadu;lb z#O%0IDVE$++b65VQdX6P%3@h$<#U09^u{OVYu*KZqkU?5HuLiJo$g!DN9Q}!zg@s< zzyAKsg1Q9_^F8b_!XwyolN&akHViTb7#8UI>1HTK(o%hGpJBt65!p)m+tgyo^J5=; ztMPfnhhZ-!+;4R^!G+lNL`xV*fH8wD$=)6ixYjiC& z&1;6of?^wL?yWJq%CR<5C2TQo+OfJnlo4O+5pZFcA3-Zm5 z=JpNtx-?VVpsT8wmHmdBW?#3dZZAED`PT5kp4fA)*Lly@?(N;bdv@?T<^I%s&;7gC zAuo&jTQ}rc)oY+zb$u`0661H%H{(I$TvM!mF^SdQyDB=i<=@L}l5sWdLc;OrXJ1}_ z-0-UOy${#j?hJT5^hLuL-mfCw)%=+Mt!Dg`))#~Ah3eR z?r@))1+_EFO)NUJXjsvI0=sxz*6qQY?bUK-WOdHAWV5Wy%y#LK2@ijcPdu4J?XixA zu1s9iG#loqzxz?o+g@uuygmB))Czdx*Vn7LM+=Xu=7+i+(s}u?ZmM!s`bU{>D&ld~ z?UHefF~qHnM_ISVhR%i=Zo@rWcr0*R?G|sYpc{{OvmC9s^JIRRoVnS((u}dgzm)m# z{7vOYgRi?HYv1>N*6?}%XKP=6ev|t?KI(g7qx3yFSJeZacS3K5$CdK0wY*{53bTD% z`Q0ynv3_**uoA^1ZWOB=mhG`zu8gm$>3PG_x1{b)ZIjwOm zuUg-Wxm@$gj@#O!MvvVe-+gxD<-~XKU$4jIrY*|3LbJS@hF2_+Puuw9qbpDC z#X8`kV!ATSl;@5;4W2E$Jbj1wE%1%=?d*Tc@1Up6@LkbFPd35!I4?2RnSMUz>!;cu z8ofRI=x>w@B8~6ReS0GrrxLJKj$W|%1pO?Gjs{l7gx&0)IQK6wZX?? z69e~_epWxU!KaGFN@bSvD<0`LUq6SOQhVkWBt^zAjSq@l^TYMy{?Dz^bH4`uc#(e2 zK1U6sZKc+pa|7Q76%URL`(AWVakZFdabt-;ifst{9PrfJAJjOwMew1ZN&(-zpSevjgh_u>#l9u~ zbk?54H{UYe$G!G@^5**9^Q|rnz1HOBrkgGASRV9!*5Fm(r-ren)b4p3(Lvw1;>*jq zs+*d>YT3DV?_%|eKdF(_bW4M(RjQWjUFLjvtY>NY8S7@tOFt98G&Vb?>i38*eZL(4 zGU;Qx4_cHX{jP18+Lgc5DLx&7(u1#u)+s8MN+=UrPAu1|Oz)D}5oy80ef~Bbm6wrt z*4$OqdLge|?v0$zISq5HIXCjJ*cZ~PL{z>TOL^Y#8SVSn=cRA!z!M?V1s{_ z&p7wnx;c20Yof)PT_&wg+{ka6KP-BE=~2<^r7rHdH0yfRTYucTes|)N*RQSL}SvQH{gvjH@u9%#4!fLgu+i;vUUxsh!a) zd1=!1I1)YK>%=dMKB4z%AEIMsX6>*~)NW#Ixb7+WxdP^doC*&q5m_dp!sGH=%e*Xc zHeyt;;B7Tjk|&G4!W=%`d9L7C?$+Efc|mzqb8qJzv)$Hq;cwC!<5|xwzMp*Wdr$Nl z=MV0zh>W{l`%crl zlkc(zM_&B-zWf)@A1~vVr?$!SMyltg&~YVhRF0^ZUwdE44uPpfW>&dX=XKS0WnHDl zmM9k5+N-60Ia+Dwx$SetXE#W{kl-DY_PxcI8Xu>Ao)lXo%V{}mFXsBfibxBLUA(Ra zbPC-PUZ%KbsUD@0imxr29I-ikZiu(vH;?P)Fk>_2B@y^0?V!3qUFkAAhTFm%Z?rOa zo3KN=rTfcN#XZD>x*u?_?>^jpsK-fCGn|&yruw`#9q3=IA4Fy;DDA+g#n0AKur3z7#)OxncEA zrImmP{~;yDRQ*wTcIli5&+tJZfA}qMudeTiKRef26ASv})ymK(e~OW5cEm<1BN~N?#gEAz1UKi z&JF5jdr!;3+%1{2({3ckC$xz(#(009`Dy#xcCV+rS^PfogX{gC5BZ;sQOPlW2}vo{ zvqB4ET)xsox3YfQLgb>WB3=b_@tEheqsX!{o@K^F=!5_9&-P97?&R6oyhGtQjy_h$ zIvZQOvhSwlq&!K!pVT7dOh&n!;<*)b_vXE@epIvZD|xk{lR4Mj*QZS2sgS23LxXDs zRSzs4P|v@aztjJye-+;pj~&J*a-PsvC@MY|G*q4DshjC~u$8j87a1$Q71M-K;wAZ@ z{+qFl>AB&Mu81;3iC69_9`YWc9Eky|W)sz^OB|`vXjxovSnZY|88jnxg6bv@+X(j{r1>?S`J zHw#(h9zKoisDw~V+AY142FMF_^A#%1mlNayWv6bQE>!neZYq@&FOq@8AXFs>P*cDj zj%#IHq0Sz5o9(c*sMX6FWVutI=CPb-In#3c=g!UTotK*(o?RlRT<*ynF+VH+PWIRA zM|mb||AJdqcUyPsPU~!27cGFBxJrkhA;KKohHpS+q#*qT!vWnId6@37-lzm99rTm+ zGxZz=_MBnikbU@fGH4q<*iSjD( zz1UNZ7Cl4{xsCpSevfigel1UsDobsoE^>mhOSvLhY@g=R&XW6L4aQt|#ff5ZPH`_(k8}|KA=~K+g5;*?D7!CYD3Ri46v;#JKSG=k zC*75Og#p+i%oe8McQ`<}E|pTgi&gLke1;##Go%OPCr%*!1&8Q~V|kWV9&Ho5h!Lm) zIxZXo^vZ~~(QkY&-id8sH|DWCwqCo=>yZRfMYxXJ(Zlo#Dna_;vMgLH&!godf*(p& z&#RZwAygj!i5RWQi{edm1v|}3(Rh@r4W!RdD-xyd(k{}|bRu4*J*KaiH-CvrQxAYf z&!U6OpHt0;&PGQ`0&7F7sk3Ppl1%*2ZT3(drPUG_;mSOLg`l!hDZGzzXAO2$sv{?$ zX6hbR4UG^YaXYk$jYU_;C|m)h(*w93-b3o6zqF}k(`ZkFjK#N&@{*C`Y_s}`ig9W*UvRkAVzQg*_Qs|hlo?msfWM_o_f|WDsQk$S* z;s?^1xziik0O_*W2VY~2TrXKi+(c|4Ea9DSW7eH%Xdp`F0|5(t$Zn#i{5(#?{@NL; zkS&1gY$AKePh!S7j#X+npj@}agV=-j76#E?S~wsUq4*n`NA%&erYk3*Km>$z*+{9#bQRt5Y=w1E@&El=e zd9^q%LWbeKq!Qhvl|&24Q?`}{OOMbnKHRm(HHgd>XA*zt)n9BNP1aFzp-k(GkZ?Lg={{Jr_!s)PTa{t zZIU`04HK4%XSL?M1%A#u(^G)^wgKEKfdmMCWRat+dPBM>bfpc@Y|e#&YNlhb7$`3# z2CX$ywF9&xS&HvrFH#a2=|nnHJBQ72oOid&J6jR1uD8v4W|NOLv=_--b% z@G@c~Kd)6|_sLA56J0}dxEU`NI^s*N$69rvk8lvpWFytJ)J->Bn8e;`P1r2q6l;yz zAtPBz0(k_BVpoKfyfU-UMWm_phE{T&Wnl!9fACV&hi=v4NlCn&Zv-Ta<508|&1Mwc z<ib;(yRW7KC)XCYg@!y1t=R zs2h8a4g*fu7EA0iP3BK%Lq18kkAKkSd^c*0_R#ZMyfjd#r)9YQM6d9Deq7u_hSMcU&IkM?miqEhs4@S*y7COs3sBt(+DA2s zTIdw{rc@tCIHs%3a5Bjd8qo-baChcMeMB!@o;Tz@0Uu7n8(Empix}8k=WLoS4#jT} z!DF-t+MP7v^N5v>WGhh<)Kc1m`cZG!pLh$tAS~pMwY~gL(o=ZL)_^Q4jV_}|JQ;is zkI7gPPm{E3roHETNokhNFN6Uldc8Klt=BC`JRu8E4Xvu{ z4vNJe@g%XX7)s{3Ca7mvCc6f6wF)^av}1R9DO8W0)P_2rk`J<3e8e8BbLlQLjSOeC zwJK-`i5C9kykSMA2@i-Y+g@ff}Yay-s?pOxY<=)CZQ5WEnNR>x2$0{;SdoJNrX;*MUZ+cl9z zkhjt~9Ke2px1%>&02F`1CXim_3n|BHQy06&jA#;XNMzw2`ao4W7@cBMP&|p|_xTgt zm(SB)YiER$;$GGY{ZOmmn~1Bm`2x~FYR!vibLa$~gL;BbCLDPQ4{%3ZP0dv|qQ+#l zFbPeefoKHZj)L(D?GCStd!kop9A5=mOJf>M%i*cG7Wo_N*eG-Xd}f2ezxI)P;&AN3 zA;J<=lpb|erk})GN-?xn8wdU~kv#*XeI1KIX~HAEkUO=LS_-~EN)r*!)@nly`%!b+ zmi|Tl5JH9ebPk=wpQ25q6X5m;-+^Zv(QrH(uRx8M8_UKy_!>=C`=X)JJo1&Er(Qr; zBcF=qpyDWuWP!}w$@kF`JVVGPHOMG-066g$4?|XT3Hggl@hR;PQ2jUxCJNdMJWOGw zuxq<0MuSjAu{r(MszeUk#5zsITe?&g)yVe#w2en8sp)>yrJPPx{!?P2{ zXAf^EloejHr`j<3n*W9G;D*rdH)t@wpib6ip&cYn96=iL0D6p$1P_&kCz5c{hzIf6 zS}B$R{=X_{H%bs%;*NX z;S#p-v1~f5D$~#p=7ZxeC%FeRpAPJp(4`0WI z@$S4mX!8ZI7{DsT$pJWhsqXStks)u*;d2A+Y#3%DfERua@ z`{+K}oV8-#=@jbDyxC?-=ugc;i}OTQ5GbNAf8IFJESl$=s+qr=&zRqvUK^tf#q`JJCBjSIR@>-& zZztB#`4e)+XIj&Grff`H8=nUL5w>@eY+sJRp48BKwXxCc; z@(yPY&x}pir8h~tklHsbFe5OlSNugT0R6hWFkarOUu~Rb+HDSVf9l@A z{i@ptcjD2`y|-Hjx9@I;-Flg+ahq|QX{Gt8>AhjPK1{ztH&|&dyQCk|V=_mW6b#NSoBcI&PsTrK#uQg#|HPt65y|$%Qt<=hQsM_B|B*H)!)((y107=cMe_V7Q~klPrnYuuSM+iz2?@~P3Pg~am2lr`yEq&ZnNNq zAMsLjfMc@djHRvpmfhd7Cuef@>)cJ2AGQ^CyGxdl}sI?*DzDI=8r%0}h2 zQdRd>*IA#fQx$`My@%TawYNqjCflfxAwcp}=H%9}&oR=L%6duxt1+sxg}lT9X5w9#rv)xDAr zNL$2X#2_BetMFebT96YpJQW_6Y`Rx zQ+s5uD!5S4Ft@)o8aGzLz%RJdH?Z`yu%`H-WuReKiPfbO{3A`5+{b%Q^6+&l=lRq- z%I&;V3#53wAoF6*D0`Tzw(EiQMsBlQSAm!Pr|pzA-`XDNQPI_twnWEJ2VR?>!Cl3h z;sfw~QE8>(tK65iNqVK0ZjW+LS|rvHeZ}sA4|wZ;@@4!Q|H(h|@4Oet^XDX3EGyNQ zA1i<8uNzJq&zKII-Q0@0O>jHw*3T`-{Mgvt_=mB$@v`2o9F)sR*#tB^=E0J+ch2k9 zE%|qHZ)RW4oSe}l<7V2AB(L~!aYGW@rVLL0mar#2G)YWZm0T^YM(!Bfi2_%)#d=3@ z*Cnt}+QD;H@g*VEcx%f-gRA)N60N-Rb<{1zr?%HKbEt>S>xNsjoFPO>OC=vPP8GG~ ztQx&#M+Jt0TedgO70ycbeb(u=499YHD21p4@Dsmd*(g|8CF~?^$X=l@ARbl3Ofo~L zC8=O9RTWNc?(`Tc%ajfBxevj@iWu$ybtV<5^Fz~gn&~7^0*$x*(=KYn^FRMys ziOdHXbJCh8mrNX(xHb7n%E**q$!n9RrrbnI*KUztSO20vg9FV!^*=nv`$lz5d28+)0~ zn_ig&b0hN*b2;-C(SEEg!_Bl3^4{wHO(<>^w{V--Rp_Duepy$j(Zp5GkLDG2bFx|&sOr%j{#V7>H3p*Rj3h!d>eP$5caE%q0QI2@=^Teu<| z5F*J7JP7y0!T10whTgy$T!z14V_7csXCK%>SkI?Jj6x8;Nd)n}xI!8#k5@M7?&$w9 z)HJ>@_B5?BH8#C5UN=(XedAF>6MZ9HAEkus65ET5g*%|(_oZXCg{s9l$l+~|v|cDU zk~cNiKleJ}CW|@Q_(&Nnjg>;>_TWN#i#&N0 z9YR;phqMTlv~<^g7j-RDlhuyeY^{>^M(wW6psiSI)|XY{Wl&Lc2BJX9gS{GwXW#?) zBpwGbC9$|Ou|fRCZWM>=fc4T9Vz_h=Cw2v*CVKK_d^SXX9YrqWhO6TOtQS!Dwzf28kfcxaepc%VO{FK=+_Z|deL<&&y2TSu#J(H)3P>cz^-?ai5n&B6|zD>Zi)yc?MRl84LhP1iggxeeB1-4erV(`Cam zdA8U`ik9EV@xmsEPVqw;=-EqoJbk6vwbwM9&8CrBw04jlpr5p(+7&v9Vb+JH&|)xa z&I5)xksp8vlzKduQSO5s5EHf(;?vT>GF^?jpg+)Tv;u8{m1iKt@|A@MG6%Yf4nk~9 zB{GMMAdf-gZzdiSBcvlzd3lbk%G(uRolf^!!Mek`Y+YmUzRp(c${wY^+(s%Zb&yVq zHH0+00e8XOP%LwT{@skmsGVI?oRgjY&L8$hw%XPhOGnGZf@k@M^7He8^G@bY&ApRz zC}&wN$^V%*G52szRNi!JX}i;U(K^F%PrJex71=C2TW+cwDGdet`?%iEt(Cc-{+?3J zu*PgP&o{2ur|ZiZ9~yS)F3Z#95{gM_C>_ zzwxVlCB$}}f>=d8L?Cv8aT$g$fW+QL>It`mmf}6JzH~?`CeN2o$}w_PrJqt$X`n1t zHY+8Sv+_pyvHZ83Alb#0;ykgL*jcDY&f}S2iOu0tSU7XgYBWo=y5_lzu940?j%0f~ z`*2$`>uSp^%SKBPOM1R559e>pubclzUSwYHf&fdo0xhq5K^ayW% zH|YH}#VXPpK@pCKSU1D4+OS%;7BrFW#^=ThhDQ1#`rG;^`X;&pS+5*Ya^xn`d03BH z2~&j(un%6Kxo9ow0Fh=3_zAv<$Fh-Z9y`Vsux_j?e7wO1^>^_VDT&1n17+5 zsMTfJTu`?l)zZQ~!C`PD*pE87}Oz4ilYZQx5-Qy9O4Y!-`P3hU42vg$0Jda^NW6Xe=sU(!lz_y2+YnSz#Sy4{~;MUUaN<>a=7U z1iaA(^(WCJkW?oQ!CP*t3{!ID9daXOoo;~Mp(~<$sZ;^Ic$xAHJV8a2$#NB`t>`BD zi3P$G;R58lga5%@!P5Q{%|nX;@$SfrfR#Fz7lT>*ie&-yZn7850(8V&RR=uE7XSs~t)Yb*QYzH+V{ zrM%Fc)-~4!=_=@=lxs>~<%xV+PM62YHKb;uAl4TLh_^xO3?$yfg8#rjp|@|)Cx|Ux z#(VJtJer^3)%aVM#v1dA{5sGu5bl%0I8%0;(LzL)m1X5vF($KHbUWP%v6DyXQaYY4 zr*~-}E5%9z-=1Y2d<5SMx*LHtCKa{Bi|{L4j9dcF>@Lg~VuUW@LUA`(1_q$oVrjOt zOj-+{71Dj_vNTL85G`Ujc+HNBwZxKQn7C6&BC|+s;(&54qp!RV4~MpyVKsiCE!Kjy zF6wHSsx_OZdvXOiwwZ#qc1VvP;%g!!8f$QA8oTAX>8vPC;W(MTpsMj52r|uCkgC3A!H8r%2{tJpd7*fR{7@ zN!pF;L6Q=na9!@t9|H&OX2)TM7iR{Lq7|4A`$m&#QQ*$8tRH;e1&Pp-&jV>`=Oxj4 zke0phc!*1`01`8nNJ2B=q9BRxVgqr57$d46@4HAfr7}`0X%*O8J)~SQQ7j`>l77Hy zQ(p`g?+D$12U?K=d>Ud>`@xzM$PwQOenv!BX=Swis_N?HayV}|yE^}L9I}_N_p%SQ zC)(ayCtFWg{cQ)W0GC;d*dE#@+aj$6*1q-}#}p@ZjCO+0o?d~O70Po_dq93UengIn z-9Uz~hn3JOKUF5`{?c{Ur7CZg=dczk$~t+JTv@&&C5kb^1Yw1+Ot=ra+#*1p5FmeT zf9*05&~aXeN5QJG7<4%XIC&r+4UxL(%!~g8k-@!TefQ+!0X-bb-FXT~Mqi!^Zw&>S zo&s4}k0I6`X8Adw^Cqw*tgH(}?H+}kS-dqmi!7)#o`~P$qJW{E0@SpDFj;sac!}l3 z?&47~Q!FV3Ns8nKoVf$|w2_n}y2LtCJ+R;=icQ5LVg}?GPf9?#hK~b(4(IiuwPCCw zy`pV|2(TLJV3)f~ah-M^b}Y2}+lSdZ+dtagSPxitSf5+#S-)C-SoT=E+1lEsTK}}} zwAFSTcf517a6WgrX+OZ9S&N@UdvFJGhujA2xPw$(*{Qsdd&|X@zja0QXLQANR>cE& zbd+*eUI$1+Be{cAN*pT;6V`!L4<{pW6~Ok6f+YF^_?Z=UFz5mCyTJ6k9M?cH9Rlsh z6Fi@swd5N>XRgLQpa*jywcrZ3gFO8XbezE!veh6<8v}pV1H|qUy8$_0GBY0tlrPkT zN(0V!8TsL9_!(A6b8?V`2;;!UJ1zK#%fy}H5iwruFU^x$N+zkkbOKiR36c|N*;HyP zaq+O&RSXehf%e;oM84s}_%nFI8}S^FJY`vL`cNCI6{tb#pDurw-MP%U&vDdV2RO67 z{gKURn`m8SJp+>SFUtkX5o>3gVCxFpy4@D)NOlnC1m_-CGwmouod@w2Xdd}fNGF6` z5(dkjx_!!8xvTt2sSKX~-a4%NskGDu>&7Undu8x7!MZj4*n7-c?K25eerf|!OLKVcLG0Zfv{Til^ROz zV6745j`C2sxNMOs%Bw&}Dk|TSPDwAMRIog+z`l#3@aZUwCLh5o*$t0E-N2uA7;0EX zdumtIt!jYU#I?!k( zHrcV&(aK?Tj#WF;r}R5*1u^;YAVo6qVRA$Y*KO2IR36C3l*W2r!z#U9_fVItd#&rC z+o>3p5cpJ(?J&Qu3mL*bVK3-vXYpWs0tKNk)CO>m;XIywVFp-t{sOuz23k}B@8SdM z1GE{+V(3D8o3@1+91Wg*J8c3Sm=0I3Xl>S$dBJl8cZP#LItb>t2$G@?tUaD+B*bTo z!Qo^HxdnV^5k82+rSp=PyjV^Kl=zThRor#)Al1Js!SKI^@)7jQY`LA>Q`#u@g>^hh zI11WZV;qL7qeo1m>GT{urL|CdyF6Sm&QNCy#~pjPJ=j*(O02%t%a-p2-UZqDs6c@T z=F<5i3a)^zemFla-)bG_sOI=#OSE@Xzfl`R@FQMS7%3$Q7VsxFmecjBf$O}KOeNZ| z(6q#OMqgP!$DkNL={04t(h)4JDvDl8hdES9ydpdY|EPqQqXFO*_z6W1!`j@6&d@GvXK6NVNOx-AwKenz)xetmsYTKRS`YdV1vd3(dXl!ICFvd-27G9x zFI>euSu z>&ECN>sslCDpIxoZkycQc{K~V70k-Z&7D@z(r$88h829fb0jOmFKcCJSJF}0 zB<~^TMDzeHE8ZLcpJ15JUoZceOyPd3(>%3OgsRnr8{7}*L1J+ zkuZ)g4DSuyjETksV=Lnp}IlQms0Yix6)Cmvsj6oK}FDG(6J6`JypGW-qpc5 z$3Dq6+7@9;vy?9I%5Rr{F#mmCjoe;2uABwAJSQXDo*kIiD}QEQ_nd9H6RpP`iao@# z#`cJ|!mHQ{wF+KSMv`TH_4k3FCCwZ$iwaO%siMj1!D8hC%ui#YdSg7nRxwzGMbq3RPK8 z?JxCMu=B1Ilx5oIR#I}R(}}x>-Y>*0P%5HK^0?u>%PmW{-*D9Zn@4NY za>ZY1pdY5s1`MdIuz|G0z49; zy{0XK_@7c>Z)^uCRsgF`M-~9ytEQ+NS_IPR6sm!fAd+GnUPx9#MBFj_hLjbzfYdo4 zZjz464V5hAsqTrsjp43gxUq<7sHv~%glVbygn6||GaNKjGP)c0>z62^93;&bBZbz) z2VJJ^wFEU-{pRqrt+EWT>@66P_c{AWmMyDmcKfWZ8I9ALrnOG*m~lM4WBSRAIhji` z&ZnQxinCm{?=48o8Eg&44a7=xj&qx^!0VP*Q87%ND<=A71sOfpD-lMcPmo_nkK?9V z?x(yic_bU_0BTU$Fj}c25}~rN7+<01T+LnY)lZs_N*vd$&ur(M8`LeXKOO5G26Ym> z1ae@B_K~gxZ(v>I1T=Ri8i@Y}`T7PGgZ1D(o>1uV2LE6p?ApqPh=pb72HVDu5KTA< z@?RP7gVFTEJk>4EeAXQ3rkOvRt{XQQpBWPk9{K>~8|WCL zVANKl5%i7vQq6KbwfkAt=FiMOn`g=ylzAwFXKc+llh!xoQ_`&Da;YoQuBXgQF{d_9 zdzKoWF)gox?Th6}ZqNLi+759FW}26{(8tezv~H5xTsZFkrbtJ>1;#X!r|)&&uO7AB z{_?bXU+_SN>Y$N%=pEu?K#gL-*4Lcz)=yUMh;o&2&a_T0=xJ4)<6Xs_cKapgBCRB= z16IszR-L<}_V{n&CkzI?XD7rvG!?6gpM+_`M4^ND4D7ZFq$2JCvuCWZ6Yxy~sV_7a zt`G-lCw`SK%ihWX<*06;{*8Vi?B1GT;>I~fFH^K>qRGeTX85TOGc3~A)6JDHiV;F7 z;thNMR%xr$ovy)-J(iOBEAvL@UCKF;H9WIIR>RDd>AA@XNySp#Gt`XWG|!aLsR`*N zGWTVU&aGgNu^lNmo1gA#347RL@Drt;XIXbI@>=^-4)qTVy6c&*_cXdZ=XxG@+hn$Q zeD!Q<{-!IY>u)%1=p!!%3wnTbo;;)mZ8!Z0J5DpS#$dBG*Dh#HV0HNF+z1|(mVh$U zcAaNjF&!TuVhTIj3KwPPZvP+&Jx6)NJ z=EB$q8@3oD%%{yyOvOyqOubBXO@A2A8B+8qy5+iq%6Zvc+9&iU?*UC`yawB=_0`_0 zSgqn*Z;!CQvsJJ;U|)@`U~_?I!Mpsb`9JbL# z)>XE*_CAiM4$T>*{so%lV2J+Mgk^G#bQMd;U%(n~qfFB^(wBgZ#Y6SUdI`KVqx6mS zSiee_r_5J~Qc3PB?Et)By%0xAk!j%d=!>2KVzCVP!kxv@3p5gt$!&Bltkr&i`qP!av|IC<)P(gTw{m6)_9!mCxWu{RrCj01>c1(MLQc1c6nx zhO{8DfHAs5TvTO<0_*=vEA?hq=>kA$ZQ3ENkJbnc<4=DaQuv>k>IvC9Mfkvl++-t~Z!7k_+ zhy!s$_0bH73dw@lkw&-=jN)$m1m|H7h{Nbl7L#3I&F&`$03~=pUXyp^6Zs6gC9jgb zWFbTp4u(jtj<9pGCSX)XLUArcI=+VdkMUdl2BgPTkRccG74QpO0;~2IJ^@(R4Y+#@ z;u+S1bv^@+z?~spvmExq1%P;*g5A>NAd;>s>@K&#?(I`xNsb0>z8F}-NuZ}61Y~Fw z>&VIj{`?Uzj=8iW4X1YPJ?H}KwFz1$Kyo59PoS2fxoN&|T~8aNEdw1Q9^!1f(=DJS zmji7-4x&DH!5;8|2zFpYbj&+kj?4rPST=4!gmR=b& zqfu=6FHG3R!T?jB4K~eB*vH!#O+dTQb7X^E!L494=HtzHKkUN21fz5w#%U+CZVDh9 zwXiqNL66aXz@B@f>M%Z5*mZxK9|7BRF8DPD0DjT|tp65}TJg5LE3|L`;7t>O(^f*{ z-w}QZ;+#GJPG10f{C&Y+Rs-;@{%9gvf;OXlVDH~RkI)PB0qld1@ckCB`#TW*vmg4s z7)^mVpB6Ab{GtD8P|5?)i1+Z-e8#VuJM-qe0qk3^%*z9UTmDz7#H)bK(FA(h1MtW{ zpcSiOv`#_n%X^4{DLmPrB&q{;PG8`+1;BMX&;i&Pd=6@i1fIAKSI5vlQ1?=p9iveX zXlr!@kyqfua)C`93w?jd@4_hqmmr;o)|`d1Pw|Toi*p^k5RuTr7x2bgcrzZ(JIH}J zQwBq8g#G@(kRniNuoP;-+-nZ0CB)8jfYb(dF1G@tst!D<2)IBIIDNqj&Og9#mVymh z9S=T_k5KAE=*1=QE}jNXILr_6gOCpY`aT5sNg-l-4kY;<@IAhOIrJTD;taqSDD>KZ z%s~4PD7y?qeOG}#)d6m7@CzMl2)>khs21F-h{}WCsWeciIP^Ij+8Y4v@P>~MScd^{ zB7_%|5(-bs07uq=R3A!c0`2dNdVvkpA4Y2cq{5RFy1>15(66RYOD!1l%Aji%mKp*1 zeSh`M1%1nh7A8XfqM?69U9TgVmHAYBIk=QZGu>u~oDzX$0qy!8y;e-C{95qwxta5_aC zPl1_|4Ut=gXJjxqXTk`aXNGe(^w1+O7==)%KNM>Bg!;YVo;QqY5R6O!w8l2e zg*g$Ni;)j4vO*gjkly_|r{l{nF3W{@y<*UUiZJFqfu}nIog7dehY^YSRqj{t(+SXe zKRD4N7`&T(!5>UvCdB|vqCrX|gS-%dYGVQUtcChQL~u(q9rz&`qVV&q5@M+M z6L73j;J@EU(n&G#6!>v{pLyt7*XDGMP*a4$ZHZqZh1B|)0n zSOCnjhv07;1N#*AYqe-=T9(zNKiOJ1dE^nu4F?*GhJat`G<*#aIwTW7mS_*KrTVSmqb`H>i zinImAbhCC?8v*it4(rP&BX97mA<$0tqa)xst_-ppq7BJZ@Q(aLw!jG?cR&+)0pC8b zhD8dOg%iRfAxr28k$LywYN_}qp!%uORJj!FW0G~1bX9eqlnqK3HTZI$e! z>~$QKU5&KA=^3yu8sRA6gFHzeW6U%=-4A)L^Y-&O=iS>oz-Oz^P4AyxBfZ~vyLoMN z^EQD|o_H9r0Q_4$v9 z$*prQJNwJ6z4wN$i`ZLYYPpLQN|p=_c@Qutl>9f2t^zEotPS6eDTYQsK6(FIdgjLe`aeAG?t|X&RD%zeC^?Pcn`s?U#Tl%-`J%!&aZd+6LZpBWWX19rtd=dj=LVZjBh+JA`T$z?p zJ0co|uMO!C@WB{l=%|h3opczvM=2|PbKi7rb8+rEp7zpve(e|-FL>Zem(fReIFuS<_mnB&>Gu;;?@sH-+B~bo=h~i#FB}w#fbM zmx^pTd1=m{MB0M%av9gMGYT_HO6-$eancR=NQ&6Mv~PWf1T`(SJ$z*3x~R*Mbt7(s z)1iJroL>{4zWQF;mwZj8D;caBSOkY zb|1@s83zsGG=BDJCmKkHegNkL9&Ayr5uoBfp5-|TM{a>QhcOss=KLstLv#< zEW~rO*zZ8yTQFKaTJXbHdA=2WT|VpTZ*>)%%lMgE4G%soAG(p~(4kJzHB&Xgw0Gt%upQ{W>Up=PWLe?;oZu|a?=z{lQu_QTpB$T*A8-9y z@ALdm8^2WkE~jw?o!l;Qf2mRB`&4dKvq`;6HLcO1ei1%*eL5Q|^JkI$(i&+xlvA>- zG1bnsW%kdUl)J)orX<(3n%tndYHS>^C+K8IY{=1|@PN{O6^zvlb98&fEnF!&No^|C za&57lwtNM$deU0TL3k#pRoVWUH2o1HHhQuYAAeu$D}H*1|>%e`{drtYL@XZZQd_? zYT?gM$$8)3CcKPa@~!E&Q%MyvYZncainL<5ye=m)Wgd#q_IP9+?i=S@5z6 z)FyS7L?E-JhrQVP!D_UBbXZ*Dz0H+pGW?eJG1LIoXH$I>B?G597rWxKM zY2=CKgQlH0oTqtFD2eq`aZcq(vZZt@qu4IB}_}LkU!PgNa!0{t^AqF3#$6p-d|%t z>2U1g|8h-)&*~|+pLeKoN1E(Rv>q=GExeZVEB9pa16Q=-%S_bW2qZ(-hxQK14e|s$ z_nmCGuZz&>G=2CEEKMI)cDrZV>5{kR#-=Ui!In5%ZC8+Vi>S$t6t0L(@mV6Yq^^~o zGmLX`O8t?SR0$u|>6CALUd^d;b1uOC0M zXIVL>R!D^kx2vR7H`i%WPl|pa?v)BinSV$S&aw6`o~fRh_EgK(qT_{=^OhAv+O{ZK z_KL8~up_up>5pOag0}nZf}j0>W}&c_@5K(Fo}=P5D7D;uZ5v9OTYK7;+iE-DSCuEi zxfDnjGyU0#Y%sr4jMiSzmeD=aUDO@Yei7FSfr5-Gq6*)QA0gO8R$EK+1gLv8p)o&} z3*~DFQ-oH~LZl1+{B8QUx=(80u{tL@209yhmPym(%FxuDlPr%jVMK4HhSZmRqpi)J z^CWtHDD9Llj{TPQ#S2WE^CsjgCArd5YA3%{&j-#fHLH{^sGPsa_nNT-R@ik-Qvu3u z;$Jz=-O^rIEEdHUUo9!L9dbrV(U7ee_$oq?pcT{jhFk=R zci;2K(lx~eox=z)!E@v)$Vk|1UXdG|c`E&T`ljDKk+f4S#r)%L^7910q>;Za%7?=_i1Fkiydp-+)l)FJTx?sC<3jI=$mwy{02pK{)G zkM-_?>(A&3ba*WHOq=oovg>88P1mPY{%K3OlMeE2t|nIB-PpiyuK%!r zDFKB48L0JlYcm9_dRj|8AvUYMaVmd=20`O~=B(nZ<-F}|?54fbq5!&#t{?E0k zLOyEbOEoie zz4dzCRq-;{1s+_3+|V25iH6GYxyS11=I!lG^vv-b@YMAhr9<*PaLgy@smyoa##+`1 zg}8+d2gmKt6>yLE%TVH6fxe{|JB(RIf1yXR$=q6g7ylN{l31ackR?>s)YV?m`sfbo z;*e;>Yy5>;+(IS?2zy23EN;c!^oX)oI`6sSD(7_CTiUPL>f3tRR@=td)RNMcnnjaL z9|{`gZ_ZngH!tr=Uhn({1*rvl3hEYGOkFK2Y^7ZZ-ZO-jttdR!xU>)8MCc23&!D_abc8&L>NoCYi~(_c?C&X+Rj>0UO(m8~rxmIA?*|j8X&DE6PlzrP5WI zqkK~u11I?h3cpmcIev?t-c2`QelvU6rra~G7ypf)Cn&;5akqF^bc?k$-8B_7&%_vU z6SDI9@bBR#5ZE7d1{F#*B6~q?`d$84I^gy7UiLKcoOEZp8oIVQ!<{=FHl$QkvNgBP zD*0}Su}m*cDjHBE7F{M#^4PVN%>5Zd8NjD=o^%DNBrjvP&f zf=?R?;lK0T1x%^bunu?Z@}`^+$C9(QnWph|xY1-*^a@&>?PBouQE z`K92Q*Yaig|G1e@&U}Qr^bW9)zVtTg6>=!GgrXG55pqvBU&FkEpg>vR8se9Wlk`M7o9BnS)5qX*Z$R+=04~>EKetT z(>vJm+&$E)v z0yF3u)MXOzy@tTlUtvUEz(xBI*!o>4qV_;3_D-n=1AtXNH&VA+m#I6b_c!PaWA$xxW3=ZqwKQwQ z^HBG<=cYmBwhSuk`t)B^2KmR;UZ2cbVsf+uz;8wb6Om@yve1cG!BSq{vdwvZ?rUQI(>*=9T6#<{IWe zbELVS`9E`P(Uqd6#iS*o@L2XSV!|*6RUls z?V!7*d#>A{3)OAXmernxx?`SrRJg#KxYpcdmSAI<=`OmR5Qd&tgxI=U;buATTXlan4@OBF7%b zUl@sbLLMBd; zT_`^|zD8lctpe5W6V`$!Ta~NK`Ee#Tp52b~u>dNFip)JQ-A?KvMlF*12nMeYG*5}d zL1G!O^G?9^YXb8fg1hNT;yOm?H8@2Qy1W+PuvWld{S&N~n-qboRz=!rGq7plQ~(uC z2~fOxaH4!5-;gr?{RCeZ$+K9;GoXX5Ojg7084RVQ39tAWEYV)L#=HKXMW_cXUIugU z2B_?HFfRXr3)!u%20}XytWO=NcqOPx-$4<12;A2wX#1LjBl{`8lyAysqNyN<$)WhFg_CxaJVo9Bo;O?8U_SIwCMl--=bMPn zJ&D*uJcP$dOU8gfZHL`w99GjNs05cnF}oBugK5yQb|hPom7r5>j5@~v{doay1Iffo zd|d_KbOx%Eeb~)5fEQeiRl0~+44!QP#&Q7^b8FxT+5mU;L}Cn1k+I+@rehBF2G=qe z->UVZ2LDGC zk%r6y^8bnD0pM_|gN?ANoxqH=z)%0-(8`0!DGQd%58Sf&|M^-8XnZbM1_AGZfv&Ya zvb>{_QQizJUl;t=K%xZiI0bx6$N#^hvS3s6c(wB2I6UfK_@{{XzZ8noKkuS4UZV)f z-}|7Z$pJ^w2zkR7!A$+aE2OD0_{7cN;iyT(sr87@$SHmg?j;%gMgh{?uVJJWFhI$0 zf?09Cxz(yjT+@KdS)}fQJ3k+z*bVQnG;thUiWz)ne`FAkAw+z_rs^nSF7k}mg5f)b zJoQN8U%a{x@jz{i_d|gv8i(BDnn;*ggYlKY#U8~>VH7a0?hN0s9llR_$xT0>r=@y9*zK@ZsjMv?Od2S1ji0>9Osh*v%mTDVKoWCvLR`RjX?Hsn|3A5u^=G3Gz8P98yJ5~CIp zUZoQ`R5g%`mD%|BT;#&N#`hYNlQ56BgOj|2-zp+|I*b^gMo_brT9hi!L3&aXGC_HQ z=gT2I-j}!uhV2p7kAZ~ihgk;22gZyIj~*F$hOJ~@`_TA*sGQW zi!>NdaE1DUxT^S2zQ{Z-lD7ao&Q`rdRm=q%pRf;*ybQS|*$b;Xg7~crAUi52$OY;O z;wfrm2|GY%(0vcdC}jzqAl0C&D!a%;Azvzf*gY4h zQ;D}=a5d_9a<=l6)T$#%0_O*Zbb_gBKAu%Y(idZLP#HvqDhU{DK!&nxGeHFJRbg3s{EU@ zOXcX+@@uM!(g*J)8)wQBwH!G}nM6v;c(oR>4jJ}KF1$=fh1lp_C! zH2nRT=T@mAecZd58ZU3dyr;>k;B-SU*tVIH`JLW#556 zZWEm-okV8JOtA1@!D*T3`Q8GmjhwAWbL# z$0Up&PaKgqsvD_L~u zhHJdD`WF0oP3&*$kTNxwET@dZoIFP~rXt8r^e4F`RRvYa(m%>x;vL>+V>r=iXjO(P zu|y|$X=dU7{!UCL%Rt4_2sJ>8d_q}Dyq2evA~<~`@ffM>Q=zU}Le*C)lX<8tw7@36 zV%5D?mI9+}f?Dmmf}}+yiufc|$2=dZ#*nEvEhZul=LEicL7lF!)Kc8!N6@!$1};!X zkw=t0II~RZf66>mGy`yUOa)sV2z=zSIuLusQY8VO*iW5~Bug!xz-Dmme-Xpzrts2C zReaP!thE?oDZJ!%asknrEL1&GCE~qu0ae~x(jrG9ohkt?Ethg%^;4e0LtUa6h#)GS zm_!aBlH`ZDEl!26d?|U5IE@=~GG)cMo>gB$y5I**!3^R6s+M_VD>zs*$imqMC0IX# zM+(j$;xX#W{?Gv*Qv~b=cBMO69jDYI^$wI>i{dCj`eeh(wI9(^9bHXC{r1ryoA`;E8S3ZOvJ{ITaYoa;1 z1bU+l#1XQhIt%sEE$p}}i5RjF3JE{52QqphRhL(<43XzT;~oaJmKI$9Wi?jyAf?GE zSB3s+8}wz-$ScvKUXG;>k=rSfY=rkZ0Df;HSqHnyd))s_IQv(TH{m$10t^!N2Ha!M z%O176@(sN*CSxSqL%Cxj{^-0esCASAH4yH|dpKRjs(py6WJOd}>xfn4Pw2GHLK~Zj zs!dg_7zYzh`#JdJkK_h$C57RH`HVWOCNWX{t=xnAqX3mqUF=H^JnysU6Y`CGi_do)co zLrF9hPvk1@);;0ce1}>70ZO_=RP+@21i1(8@Km2e?UR93vtB8SeS3@Qz|VKX&j(>2 zn}^@D8RzLrwIx)Af1Y=Ln;THDd0F1+2jAT)rWReEVOlB7|k$DUJKb6g6_1ti- zE0FRz@V~{f`xqO20)EjPYAwkU)0GF(2hS1L3`c~`WU&>kF^@A{E9_HPwXh5R`B&kG zLaiy@w5h0NNpE|QYrVIE>LstzZ_7Y!R^I7LI{$Q z>ZTeczZt>XOKl0F{9gHv2xPcunlCS*i)v-2A^w?3~bT1Ahl8fn9yuiy0IrJ+ZAaKgxfR zzaUS|nU{Shw_M>3b7avz^U~s$wukPuav`yri4fc97yHf-(;0$SWmKIpSUDyjD`%9Fn&yqf6?|I21si(+5T+Mn~_W0BL5Z$ z=N`tN?n2!~T{^~_?RZfVX5OFE?{|F4?Bu)O+k89ox#8#IU%MvQ5>gXFlLnLH!~fn?`j!&ny0g?hjX*DmrHVeao_MxKu5Ql)PHmZjuD${ zYXc{*qwA^PZ+Nc%Tl1TXVJ9(G@`l{st=Q+4Bp1%iUitf5s{2RC_ex)?er)l{`qi1R zFyU?d;v{`~d|qGk3#&mnuF3H07RZKHD7Pi%NwxA(8w2-+>@0h}!qxEA#(KJ2hO>sM zLW(lURn9)$(yFj+?z-IU{38WD^55tEEIeJZ&NUD$`g@gO`fHG4=BovF9v|2|_+(Jo zz)Asw{7d@|(k~LTxoWITtx;=w?T%~MjV}~S=KR72g|g{s@%56=)+Bp~+bG?ZN2?2| zb=(%Qqc%nN!qCq6(`fXK^o=(THr6(FGiLaFFbu-Zxlw$_Ens5khSYxI336QKBL|`? zk{_br2<(DPs&7<1<{q2NZQw`opSUy&U7b7U^V|Pi$m*yUl?;`hm0spw zE1*?`x7^mKenC%tl9AINqTNS&-CG@(Y+Ec3Op6QWo2Hv5n>rW#%uhG%u(ox3!P>qh zM{!HFPYunH_IS|f`@$zKk2y_~;F^x(ei05F+Xu*hH}W|tpz-7^>OMW19l-SlTdQmxQGMac)Z@KGyL#KtSPLy7MSBaL<(|%-lri_0VRo9Q<-i;jV|q1JF~jCGiGzBR@A%Qn^Fan5xIdI@lKz}FMNH!i^l7z}yu|z4o$PFG?`0iP5^HHt+_gBM zB-Fmhwcm5eJ3{V3MAJLjWWI%l)|Jyo8jR?Pbl12Oy(FRxVY-@{5V0!GWCPouvf&x8 zl5Tl?-SN&Cr^Z{kebysL=ir`OBoXM=xq)a2K6DRR3W<-?;l!5c zX-r$NbqqTeJYF@ViS^e|}cz4TyaGu@VYh)$h-;gCCx4Co*l zhEeJOZVE5qFYW+eoC4NMOZ6j$_`QIYOF?X53el*%bv3gf1o0UeIx5kgwBzo59|_WBplTTh)_w+%mUAJxtBIcb?X6pTUv>b_}IynION0bcVcu%kU-ROhQrkd32JH%arsW+YKf$-`J9 zy?}R0@(}p9(}B3Hg-#)baL9{+W&4p~j6hCNc1tuoBFo5T>QIFun=^Xg(GTT7B+bX+ z#H>%pQ5A``@@Qo=5QmDyE1>uHkoO%XYh;`H6#mvDNaEj${tF(`K%A7IuvceOk_9=8NW_YK4W6f>x*wT_ zyOcUoWhI&(15~aGW=0ZnNL#GkrMTQI4?y)DNzfn^l$l^5(^h>G&q{4QWKzvd$7l>hW364wHEH*)5>=wf*t{G ztOeGPP52?pd%66XtcPs3^2#px3uZzi;*OGqS>@%W$OR+5N^WU5+Pc>;$17_FyffOEK{z9;L#(R&Kc zqA2pX!jKmAlN3tKR1QGLwTakC-yoLAE4?9dHs*B|By(gar|2O}3$>KD4D#2jA@jIB zcFzQ2F*vCGNNYN-j%KP8oA62s5cLH4DKUsPk%8(ed8~R1sN`63!@tZK<&|fz zT!w55AN&sWf}AdkP_yk+N6K4~DB6>Jr5=^5f(IBzxrnK9L)i!25B{YRm22?Y$1BaH zaOE7bC4AKtU_9EYje)H1SHHoNU4?8Qk5w|sK57Sas$GXYD_rR;31mYm0y(PZu!0sK zt86zIs#(fLHIfM=HcGV8lS~6|S(V<290CffZ3{`Mht)S^6zx$r%AJ6i?8Yt-O#P`& zIucu!NC+N8IRI?WY*XZTKAnl*aNKvY4(ztd`D7DMT?djM^?Om5z{+ z)NlA!ooXNIG0DqYrNhX-3Z~uaeaQlTFc`Z{Ig+B*$iZq8>aHAw@&8V>RhLQ0L@v}6 z{eg=QRgMx{(Ul{E2%zc`59GFlKy6n)NcoD0B$S%OEV!kAs}HeO^5qQT7a^0wmCkVS zXDSPUl}Aw*rRz#L@O>S~@6tGQewmHc@D@F8b%YgIRdrd9oi-az-=9iPN)Prp4l_2M zm`KMG@8Ea-p#DvrR=$AU(vy=ZEAd^{$-~emSOoGpfT{<5rAKDLgp8BplmhAuWy0v^ z$n|jo-j&ybKPyLWMxMw$;*oqzDwD^l z3FJIr_+P**lqJ5%X-Zk7ob83%O^;Py4VnIC0jui{7czEb)i;ykITWtZu$Z7NQolv0g3jPPGRjIAQRP@R2#LFGFl#`OeKAo zpJbr?L@GsALN|i~bTjxsR3;+`t9)M>M+76o@hFhLv*69=sMp|rTuM(w_WD+76BL^T z@Q3TwS7ao!nz|)#@`}j+TL=Vm7nDpD$l1WHW99qmVoIQWh##2A7r+3egN;I8X|i+hpF^9ARj9O#~RA*JeR!vjxpx60V>IzX#?Wi=w9P0vo#YA!_$wRvl ztn|kG+N|tAZpvC{1x(1oY>edNl~7%TAUAUe(vF^j!7Bru*HU;}=3thu2a?+!?AtH$ zIM}b+@U?zJPE9hD#0$U+B`VXwhSx;B8woC}J@uCS0{(8E`XBfvGZY_*=u-0@DDi7( zN+yA^7>}MDRVnZ`>RLSeai}o2Vx@HfYP}x`Nvd*5kud&QP%M2`?YN)J0bX*A7)jiQ zKBFt}=Pa-c@1dPQo*L@YuIOp99?6xU5xg4pYyz}TGsyK&u=XWhf<5^M=iluAD?9#V`A)>^90Rivr7l(;$;09FYAv-x zYQti0F|sWddRlvKdVYA`c=X3XXy$4nYa@cW zO!q^_p+?jKk|e*vBgNv0^u|1^BY%~~NgnS{Zz*Y~R09c_`Eo5(7IV}naLlnteYk=y z!?&1N^u!}MfqTv_Woxm|pyFK%2k$-P#GfEl;Pr#lhRS@om%JA>ZZ}kA^QA`eNbn>V zz%}F%y^+2~vd7rENIPyW#G)G_t9gV}uCAI2+S1w~n$=>4a7^eWtU!0%%`{K7BexMg z>NF|HvlS{xw|%1Zbg`i*!TjD_(^NM9V$QXkS$PBUXXLHUt)H8gyDr~tI%L^k9bjAJ zxaVy^?m!BS!Y}X{7;xHmp(c-;rMd046ee1sJ)=L}J`8a{^5f%dbI#QBLv)!2LOg7Vxg;JKf zgk+DCP|$9`iMmg|BgaAqABgTydENuw1e|{ssOti7`fNwXlXW;T8dIsXkzm4 zy6a}fL^q@#A{p}pc>@*WL{#!!lsQssIDP+dTJ0&weOX}JSu(naF?B~Kj=iv!sRwk* ztqNA(Z-)T1#}b2^ggj^xD}%uA*R+XZQ%Z{fN4g1pARn89FSek12}2E7_L zzrN_e69ug~$<$$@m`=TT3YV<27&dDoq5fTgDOYXxc5jqi8u^imGzwL_L$#pu;tc8%70HZd7sK~37QE9jWY3zJ ziI~B^sSn7ke1^Jr04mr|YNoOne)y5nZmhvCUVks^z3lBF&6P$V?IjDh*6v{9P9T>c z49d*UsNQ?vo>)S?rz=9o{Q{nq&Pd|f$@D;yZD;HpG_xOB%N?1s%mjvIf-&Zupw88^ zrEtG*4Tr>gq_z$~GG+>#d%rLvr!abEDE%*1#2Csz-2z$@s$}EVn<{PbcJ$P9$GSE< zKG@D%4_e1sE0>syTAH7l@=YU5XA0Fqt+};1*wmu1uW3YaFKa8?XX_#RZnsIQDmPcY zQqzQc@T^!_H`hkAYD)}};Hcheotg`}83sSYEA1!IUrZ5B@SA`xRi=B109&cMKr_}-)sfiK2iZM0!QVE8 zqAm)m!=<=sjKsQrBoC77qNme7>~t0=Vvix`v5is&S&k9dvr}=tb|$`{ei%kBCV!Gm zkpWzj>I`i?gS|Hisg4ck7W5KiZPUy(`W?LlIk!c~Kbpy=v)Rb3N47q<3A}~OE#;E2 zTT1wTU-l$3gXzs&qNh=Ra&H!*8|5x_gfdHhDpf_#oDrTI?l5#W$+i!)h1s^+TH1b> z)VDM$4lK48g%xc!H!K=jyuNrx(PjMCAWOD2*>=}z%#*nRjNu%r<0MF|C!A~ zdU+|KNE>1B=r(D5HLtb3^%M2|bQ&$Ec_%g%^ZB9N6S!;_f*XsX_TkLCjr;vbaJzx( zC51o|5uv6i8^EB~#~m~Rtn+@TCH6u)vmESl5){3shz~>|j2E-Pcb@`c^(P^tEpm}p z;TF08X>(7I$YX{Ac{LD{GdTYx89nQeeK<@>#m%EF#+Su8`4T5_8=RoY#5dv`*&R8{ z!>MUh95n(u?eFw!Ivg7O3E*5Sv#l^Erz35&6UTB5xCdMjQhnFqYXNp586J!huz(Yo zblO8ns7rjv6~G~W!*#P!{!cpXedp=!$wPX0q)X?N?N#h)wkL2~jkE48DYopftg@W5 z^tWg%J1vt-)|70v^t52%WQI{M6 zm;R@^=mDNjg>oVkW1SA2)I%gEm4aSjlo|%*%WvdvJw&Qef}ADamnR_SFj+b%9g^1I zPd!QT){{87qWl(5otmW|&gg2U3{U$i1D8 z`B=!dL~>bct^ya!?c$ztSGiE`Gdi0*;I?8n^+%p~clZa&Fmvfhbc7pD9VF*NZ#x>Q z=eOwVHB`#;e)2Z)*7meS?uXnKhO z;x4hj=*F27$6&Lija9&+x4(>&R2f{>j+2E ziod!L=$Bdf3-|mja2KpZrI`TVLl*o|$5r5Jg<(?{5XCZx&e;|64{sehe^Qh+8=q@ z0aOGz7K#@R>A2U_#!$6gRZc#<;e}-d|cd3|u-%?kmrg-^!1WU;08ymBM6~ zbO32~Q*ll`m(ECg&_^!{qq;!8BsamG<+IZM|26Stq7_+-($eF>n{+_`o+rpF7|s3Q zI`cD;DxJt9&WumsAM$JXNqi?>;g-P1#d5dVK(;MIAPIRC-HF-)PAU(#7k_m!62Ic` zn|~ou7)cAB^X{Lnj;pt5FyJEX#U1-xd z&8|kS-azjObXrK4Z_CHjKx#d0q}Nk>=oMVDkS`2}vy2uqHJ>$eMVl~L6g5}HMZz8Q z4^#NQe19$&uAjs3rX8k_0{?D~74jR3qbtxzU4vd_rCLRu1vkZ8IFlm4ZU>;VoK3b$ zt)#J12(r2BN>_k04@G8Ml=Qdvws$e|1qVxAr5Dm#taUB$|19MoZXU0QPGmN@lB!Dw zF`tp7K8LLjhxrvKM-urm!ZP7HeC8{J!9swLhRpq?V0?#jdhR+>tp_uEadwuY*WyOl z5UT1pxNCOFWpVqMBK7z7LSp?TcNuq0*EFyOy&Ol8x9qk(wgubzTdP`^S#Me+tOX_i zS~G0#Y?rLb)-~uYHP#jFT;!TB-NfnHONJkXe#yjP4Nhjt3J=A0LI!u3udi9I9ih>R z1I06%WX*B0CsM7KgRx)EtE>;3jokeZ#*ZEi>~ss2Dq{W0eZv1VWHUzu42>{nd5Xp6UrAZ(%aYNS zW|n%^8DP}5T3jXf93k$_&J25!bD(U1I%uA%nrkMk*Im<- z+9Q}*5xS$gw_-3~nlCR_5_x_pHZ7Uqb>5t-Qa!(OLgQG zs0^QBOv>Sgw%L2a`xrUJP0>Meva}ExfV-u=(k{6p+&nt$GPzKe{c+e_A{qey8%W2~ zU+Eg~c@}bgd5NpamlwK=JH)lesFeiUb0iRAJ#_LwU(ExvXr(|hW}J!IavIu$Y|M9 z@(~Q}`Qn$hFRrRC!k%gGE=?tmsTygzlFT*NM6e4~6V+JP*w|S6g1yQQHLNyn(;XA? z#Uj1QkfMp_lDKmsp%HkQ4x!iMHqab;*bH=Y=>R@kk=sfgrEPF8pOO5$?Ywcw3f_tY z&rEMqX_mK_Hyjy>tH9;#My~Kd$>}vqtx>D^;smGwz4!_^l}5m~b(XqEuVYM1ZDgA- z;zwfEJQ7xj(=`^2Kl(P_MHjRkIPG&Z55;AoEFMKh@H%b;&e4W!A7md~BTY!)f216e zDm*l$}mTjDIIN@|vLEuI7)uFHI<=&kvOsk^yp@hVG?;)muK zi|8ore&A?i+wZ!J{`LgCm*tqJsD&SsorqY`VI1XCLm>Gjx+}(^hV$qYUs3J%&tH;Q+@S^j! z*Wf+p354f;2{L#I5FSLY(LjhiYhTJMA!SUEL7<5`Aag6>U4+ zI9(%ckY+5hlGBBroCYY%BK8xFvBXG3siOSD)6Ub|)6>1t(ZY7ey4iZel5HMfZd4Rp z)Uq%qFD0*K!TN%X{K)*+f({s$n8I+8;)a2ZF++Gm(rXqWo%%W$V8IM zwF85y1RO#qzJH7*{_lK#Ygv6;qseEsw!UzKuY(!0m$^Z4)IxHpdI)DtqBKk?C%5vX zx_-Eg=xNXq{Wkh~P2M`*nI4Ddv@{&K+smYmNPP>&?K1*6)F2=@7vY=vM2So@^h!9v zHis6nH5VpS&?IVFqOa3CWE`2bRdp}*zYMG)5y?vp^lNn;w7)cr_L1o3e9^_C0lS2L zN>qZPc%9tYTgL5h?Qyk6-dd{Vm1S;mcau=quaGq@%7306o-O3Y=S|Jc$hPGi&6}BD zA-`6ke~HGv!nUqtkc*_Q(Pw}S#%WIYH}eSswo=BgOISeQcHKpNv%pb78s9kmU?0|R zrcWi!Af6IpfDYY*zwSD*Nws*kI#0Pmq_)x-*C+d1$2|9DPc8RsS2}WZKOv|2BRbp; z2g^QI8AN!o>n>8OknN$ixy~Mw@Y(P46}h);3$`zPmw2drmv2jlJc+Iu&Pt96R?_mTsB=+m z)0+JByxaL#^VVmxnWzmRXqG-wf6{+RV63lJAL%m%`DL7V1|2#+vC)(rZUZAxMIPv)9Q|FL zy_Y<1oT6it^SrygM?~83L#YHe-}hif%|tkITXLyp%wxJQ`e(Fdp0k7Djvc|KBWvp$ zx0&C7ersdJ@|sFweW9uNPCHf~u6JrzYn|Guy2-lP@NzfQm1xR{Bl*!>B`ysW$Z4{x z8h~`dz1|l<3*I}r+E!XV79BRXH1#V8!wmnFJ3RY(2AkPF$2a$Fc1)%v>qXv={8I)0 zn4Xm^uy?b4bdFG3G7)rB>WFr+|2V%NTwQjTaY1OckS{*IhC;s;0hzwl3{MSPedg;* z2|4Umt^qSfO_Z7d6*%mz=(uM~cDg(*JQJLy9S-MS&l>OFUcHnqFH#2+K2SU)P@U*n z%r{oc@8im|BHNh%D&7_+^KP~U-%q?Mold~tY zW=26q=WID^A`(x2XFkvI%PXI!nig87*(h6~Yc4^do*csV^H~jul;lA#$JLbE`dYYlz-BnjFkH2@H z*H^9vomW*n+hCew{n&fVZT1TPS*RqmL<;@|ai->hI6$ng@zuW5wAW15bkXj>Cwrx7 zrcKli(AL*vLcvl~+Z{Vu7JmSJDjKnFWC2~K9K`(r{e-A1%2`}8uh+A{NCZbTj$f)Cr|fSIEL(kW9%79P&?y3a!W4ooJ0Dx zpXZUMn}@|L?&D4I=15U$JW&N5uJ=)i%s;rvenvNhW=JOAjXraCHM{W4?rGcTUh0_?i;ZTV(P5MaEW$$d1C%3eylXv1x7Bgm z&f8a7OIuRSSxEVBh79+;xyy0_v%h2>%^H^dD!WQnOqL}(B5!bh^@2O*)g}41e;k+H z^}$58V(Rlhw6ea7#>U^$mh(&WziYf@c;>Ui*xu)q{-^$neyjE^U&yLJ;BJ7^ya!KL znA!}t!wb?Xc`#CRV&zH7W2jjI2`j=)-AHPmh5D^3?n<`>Q8P$WQS(bvMVF3Vq?7f{ z4A%{F40-yc`lkBNx~96_T9YOlSroi5ho8W`WX90F5OmrK{V(gvouxOPUheL$70wvP zecMUvk&;@LaYZra1*X-7`T}d-(!BiK!kqItb#s^J=H{Hp`I_4%Uti!T7-`P1G_mcq z2fAiRJ%}094knA=D^|vN!)vA(rWgsIPKI!w_dc}GUj_xrs#IORcvd(g{6zoVc)AIF z5nU2L!#BMWuE1esm?M#9oFDEs4J>R6<{kHrl1S`ubD) zT84N-AD<3Bspv}mQQzx-?Va_16leGMcVu_7k_0L4E`ee#6n9D~7Tn!#f;+|CLveR2 zTBH;!6t_~KlmfwuOPt8=tjz55zOpy3`}-d}za;Zo$?ojTCFeTV(a)hC^GnAE`&-+y zkTcYwRm>;Q6E~Wkf<1KHf5A81+ZfBwBiGvW5orUdR2Y$bKJiAvBcgWu#;*Jr_o4iU zv+vapwLd5yHoUifDD*K)?4JU4KC#88Ua1|^zt9f(<{MV&ALWwev9*-7i1m!k9=axM zaM-{wUs%QP^sun-yW#7?KZaf*Ca#8kye%|jgr$>tF4ZXW$qVrGW|4A$VmBXu+h#H( zvVf54z~)t7Uay={XMp_D*4iz^X4`FBY(MQd=ByFAJTx)1Mp#Ya6W4@(6T05H&#}RN z*p>hW%uLHeqTVk{4e=*$(P#Nv`*L|5o;q5jyNK&W8sVxbr@`ddoOC#GQ^KtHH*u@u zO2zGrjfkxjTQ@czk3VC_$Nd#IBwk7!LmX+Nv_N`St(NbVKEYH;$q7P3adSS)uOXcs z6TvOI>Z}|(KlEbgg0NiSo5BLlD90hBz5`S#GF#Kk7PG20QC?$Vy+@wadi07n*h(Lo za$$Y@Rr*eDkN#58ywzNtU8r=34@v2WJ(@VeUe4>z&Y@d~yS(R|;j9Uo+F|+@6LQx& z89C`sDuZ<+(xR>b=7qnN?^~*o)X;R->h!^BLsOfixRPfi)k&mj-o@gFxSsaqXF^Ad& zhV#47E1^ZhR)w7ps~Yyw`GaGnJ=GRrdxRwY9BX3>b*%CR8**-WHdR|g!Dpxf+C@C| zagWHgsdna3|21#7^s+ia=7p59$zW$bbaZu|bXr3zgk}x>&DqfThr{Zy+g%|^ARKwX zp&6;YrgF+${0C=11<7lDZrkRtIwfZk z9PaDT^R=qTp)NrSo6kCoTGbt>dTmyJ!2aA7tE-iWwKVA~d`=_e5AuHH zu)5G(7+Y3Js|$qF1lv>Q%+Ah!-`O&BK&X#;2CEzadrf-~ zpp(CXucddD=c;zl-QJZey#qCg8l`@nvOf7^;tYCqFaBBll=yjZ3uC9m=7>v)TNNK2 zUnu@oT;urpiBmuMQv0NrcbT-O-YCN*O;&50hpH=-KUFoPgyR?IOy|FjpQ%J16S_3K zb`~XkrL#90SV2}>PumvjBlB4Gtor@ zmu0p!CZrM>6HC|$@_?K&Jai0{_!5mS01{N&kQUZA=HY5LWsUq6jGnTAaeA!p74;HF zdirWE*9vN&x>Dz+9!hEQX-v|_gz53$#czq<9)CP;du;aD8L{i)j>NY~cpRTZKESSo zJmf=^b{%#taXay8oqB2& zZLe*MZAwU9OJ8-gvQ8k`aq+Qg-0QfT@q-c;CS*fE*pKY*&Ou6A``@Ezq${*D!WqBTc>AB z88hQS2n(4!o7s|^eip@NqnxvE6Ep9C#IWRJ6yxHHNFCY zmhw1ti8@^QOP;E}wjQ!S0SPP4zSHh-40NW34ht&~ddr^Gwl3sO$b*o^A;qjSk&JRF zm9TA2P!`F(r9F7&vykDt4|`N8e7onBi|S!>H_NZoXI9jeLJ;wGkSzqK|Pu-u_9!-mLzjBpx?MZ)=b}+SQ z%D&_|N#_!KB{oQOB@|D{8ow;g9d|6gVZy+KdI?GRi7OUpsB7LlDwtI%Bjem1s zi#$WUtRA6q;4kW7YcKma$JdVe;4WRZ7j@1I{U!8UXJPwZtYjy#F1oG9v2I92yWhm- z{RS`Wf8;Omsa=-4;}4#o?pNc~A?Cc6;~;EDW0SNXS_<__>ywPc zQHkz^z6smoljAnTosY{FUpu}T-a?M+kddnvln&LA%?wjXoPb=*K*_@O%gI+#2kWd8zgKx6)q;$A6Rq z?DS-1JTU>K*fY}EHJ(~>Tbo$BVKrZAO|?!Ac>~Y?j%q54Y*XMFn?v4%Cce`mS-N0P zKcxI3C$a~g#UmjH5{c#PL*2l+@Q`qCVNY#sx!dpR>>85ZD6L9r`;_CK+I=#T*CwmU z9g-d=UP#mvTP2N78k*E0X-ras? zaS_WD*4LkwbC&DWi@9z2o$8H!s72V&(i`8!0Akd$TauB!I%4y3`ToU(J_5GMrBB;7#V=K{Z=y9%OE4Zi>u249j>F2vdESwbguc36G&4x~yht zj1{=0r850_Yd($7y*_&0DeBc!CAwg#Qcig+uaY|unY&&3T8bf?^*c~g7G`9~j5DfX zAvE+S_=BeF9rf1ww^XYsgBAa#e+w4siT*bJ68;aqi_|Dv?OW*^kDaj`7L`1{!eGqF z)PKI~eMtQp!y5)lpQv3k+jrCF^w;-~#ini2`{}>wl2HdVvn%9%cO(DRO!UooFdIUM z#N3Y8IS+gD96V0s7_#yzQf;+4+Sf?p8>aF+9?L{ur5k?eN=gnzBYNOCQTWT`=}<{k z_P-*;(ORj~drK0PXr_TrHI=xF_E?n7%%aTmM{MCLK?Sd+5iMB`+Q`pHlxN7l z|C<=Pd-$gJ;V(Tz)Yf`1K}M0M-HW{9y5KqGBGcJRK6nyG3e_a;k^g-fjI7(l)Sdzz zW-Zz7y8}l-WBQqVp52w*l%Al~hLZ-2$Rmx05SB zjkB8(kJpYoj;df3*}>e&M(lng#=0au*J-y4@0d)U_-iuzAAtt+k&O7?x&QHu-00tF z-wxWokG{q5tq;vG7tw%)$@?~QwcOB5YckC9lWCuq*V0gMHFD5J^^-h&T8?LsaPRt%2@bhaNVi_gT5a4d&(sI*^!wF?f7> zkwIRa42|~K*k%*o*O~arSYs_12n+CejgV@YHcJguRjn!a3RKY3{6z!hiI#Y0)Id*c z%S;ys@x8v`VE#6dGjI$nrOAx(IJ~q|kdD4U_S1;ZS|d*(2BbSS@j*!Q1whVxOue7U zU;w@*n&BArEV4@b!JfQMMtVB9RXxaCUkg6fL$KBw(|13;o{bMQ+~@%=NI@_%%Amm+ zWUB|5tvmSIPmsI+BmTVw0Vn7F`GF8D|H!ky;8;?qaU%^*#ajxU!&G- zQGBT*13%%_TMiDkDGu>1^p{3W;#qfC>~ig$yxdcy# zSszRcaRbndRvA`m53dE;sT91pKDqdLL1tLS{CogkYX}+M9%C#h67x-qsPH^JP(^A? ztg2TZWGpvLL#z3Lk$g%%1sT7lm&B$H22Uaf5uY8g^;TvTtY-DqB7#3FT&SmMyz!-> zf{t-jP9n$RguXK1r(zx$c!6K>zAYdE^;^~eI7;LbouNjhldDyc=VK2mM-=p}zL=YW6_BFo<5t$g7|AIY01s)Dv0fS`cQze18X@&>61pcndu^OB6_Kw?Z5hEj0k5g5 zyr0@he;Qp)NknOenMU9X*ejJ&7E7V}IRA;jZDO)g0#E#TjE$z+nj!x z*GL)z!b@Rta_T@=gUB=6LX>wUB+^l)&3ZWTXbVg+(kkf!6xD@QBxoTDT-#6JTU9sh zG~STIP>6`%dql3xBKziNICdmFZwOjeagc+afIZTM*?l6FkROwWw87|ZDkoPm&8J%X zR507d3zRwHhZn)U-2v6O36@QN^yvhmo@(f|OzY&rpm3Zc18565QLO?kjIM?+uos+& ze~j{`DcHJxP{PT5NC0tl67;*)C~TA<+IJHpmPn4*TKLUrQ&VE5;~1|z0o^2#sn-~U zwj^-%RuWe{2b!57*9?rNKJwwfV$(D5{6;VX!{C!mjOFn6$BbS&IUC;w>PtT{+J^#d z@zb<~{!frGLG}xnFOkI5lz>xuSnpQTf1|hHc~kvFGJMscFcX{Z=ZI!RyD9rIp*%Bd{6TFA}(AObj%X zdV+b?U-}&sLePT23Q@VYDtU=*Jpr2FKxrYn=L)P!;ZoqHzXfKH^N~I9 zklcc-L?5j*T_OAT7y9un@%QbKXU~wAGDlh*$PaSuGOk)g3N^JOufPX_*)Fd8q`!yh&j#rulsOTOa*r&t z_MqpCC!Xg%hwSQm{ZJE z0W|RjQp>;)V)`Mt5s&(n)Q5U<)fs`jZs8Ak#akQ9o7`U9>F z*$_IhTe(528VVmO!pJ@d^fK9?5b$E)O@AP__9JH?HgJ$Ej5K=Gmu#VTj7Bx2jz`$E z@?mX#kNj>mwFk$`5jbEtk;lp+VLpe$E+jJUAe`<2ISfldw#`TWzzfrFe0u{-pxofn zRHrAMpy`fST(S`B;5L@B0>;3TD}%Z8iB@IIS;dHDu4e-1TN4FH%(}&R&MRG#iAjdLZq!Voi;M$`U~3 zOhfj}l@TkL1#Yq#uCf(6o5Jdrk=mM5D>)izP?EMYn-v1nOznsoZ;ga<9yGLL>|CqhlA^9%3N;?LfH}B~ET4Yhe^zE4%n4LLu54>+Pt<5_qHGs)wOaJm9Y`~d z1!g0!mj-{bJ`tja`Tb+?lQz=ttRPb9#z(Sg`f;s~P|S6*37ZiQJA?UN3dJrX`|%-J zG?Ju}x4M^Ay&Aqe26W5{wDnK)kV%a6X4*Lz8B$_i-?0-$bI0wbK7kVStelh$PB4|$ z>|xH1vO4#Jo5<+3 zY3F~S>pwtrI?nah!NF^=OADN(?p%2Z6f_^CrR>xp{=^j{Xls75RC8va<(5KHQjxXK zQ@yb&tx(`BkI(*7#0ZI)nB4p0TX~ ze+5&OaVQQJqp0xsBYS2~_{vhAx4;#e1lqxezhaJ8GtO0z)IIFoGU(A}_J;)Hg>f6L zwJr67O=RLsGwg;-&qDm^3S$BYYn!RSIhyxYw8mMC|G)6i9?;6yw7iN`i`?a9$OBj4 z+b3C>#J130ofzT^%z|Dx*ZqIj<W|CpIUV<!0+k z*cI=k^+*d%JC(XU^|dA6Fk+5Nc7o_1S*{WLZn+cT?Mas zB^m3hj4&wN3dUq88SpVuHu^Z6zOSZYfteT&JN}q&ks3Rqj}<1Xt9c+Rt5O3W`VpFW zESl3sxY{-J*@?t?_CtOgz?cq_*OSfEfynDf5b6`Dc)LO_jg7&sbdzhy7m0WEGv58E z8{0;ytGuG#UK7yebE!9#nZ#k;RNg2ju|`x|_!y(yB|)32p1vflZdy#Lp7Kpf`;^wH*@$o5ow7Q`pL#nzr`x18^TZN~Qrc*N zR!~lZ<#QeZI+_BDi+FmbYs}3EN((DCM(ECpL73GFiS$bWKe>iP3rk zzvi9meTqeChyT96JMnTubPFr=0vY8wV$CUI>%Ti)e|4QqV-p^H6%i--g$Zfw=-X6z_Epm1G>!d1;lrl$@qiwGq~~d&H|wv_x5oSZ(kA$(p?&jD8X z80tG;HR_TJc$3jiF^!WFrMl4nUAYx?jQ>$WsrQgY&8n8gqWeUdg}v;Ze2f~A<>ZTa zTm#s;_JMh~9=SxwdClO2zp_U{3BdJTP<{)zmDOZp@12G&4pI8$+UiTdoZYq4%UGj#+hpq^Y$?j)a->nJOft;$fP z3fWpGsNJzbG2wAqiEr^8+~Xk_Bg?55Fb7ow1^9zXWjuP>h)L^J%R3LZ%B$242 zdDnmnAa-Q)!PH>?kMT1#8KT)`XR^zV#j1LhUDrmWbPX&~8@bkQq_a|Rktx_yj!>bY zo%A=ntqHc@k@ByySt(CWXFx8jbmjOUPlJOWV#n+ZZ|k0c;olKVyt~8%uV5#BA#@aE z#3(X*HY07U$M)lt3P=X?l1u8uFDgpO?Ab%GT4uxcb(;*|yR@w&+2Bqx_(l5hDsl6i~)vQzoT1?NNmgpsUx!+ ztkXVJ@qQo`X06Yn_C$WF&X*ugu^0I+ui2MsD3$TQNy=huu7L;c}{n?Zf)K@Q~G-JnHuCxZb?Sj0Vnd$jkKl$?VYYnAyuFFKgoin$I&d*1PQeKVlIV8utXGqq;nD zv8o?J4cn0DBLiiana-d_oFaR(6BRK__y_vZy}i8$JZ(I2+7hj~_J#J7d%AnSdy{*; zyO?J8JoeP{Zu3U_?D{v1aJxWVsW^2!nvqQs3cjM5Sl;56e3sefXXIn;Rhz13l~!an z#bf`Nhs@mvG~+%-K1OIX`8C;$vPgh$iQ@Sd=`{-#l!n1kb1I$ji{@6RvQ9RU*ZD%Z z2#(=AB@*7$51HW|vR6^GwKGr{xXx62xIo0rBy7aPkOvQ|g&d2NX$dncNjmB%91=py_q53!)#p+$d?M|@Nt zpic#LCeF9gd)BkV)76uty>$&@)}d-8Hp>o{yd($TG3M(onn1t~E|B z&Z_BxM{lp%*_>$p&eDk({c}V?_?7JH7$rik2FI*s+Jbgn!T3X8t4Hfsb+ZxBZF$`XO z85>1sq~u2E!Aa&g={vTZ~rzhE@_l2jXA3o$R+#899H8SdD|QCZ5Gs z`Ym3bZ0Nokt7<7A@tK(Xu=102n&P+N>~iG?2A;#X^od684pc&xOQc!5>~KLc)Tv5 zjlP7c_CQCk^zwQO|54&xN8w)`>D}u2Rm-BCahK30Y16a`+V|Q{_XKw~?W7j!dExoS zm+t%CuTbx%q|t`zfKB8m{HUSIpJelHqS9ED`M&C+g7^iZHJT#D9FP~npTCg?pq+cM z*!6-s#zOHM*nt}}9{aFcM4P(9KMqm#=L;lSksoYDTlxoWsxUcW!!$x%(m%Q*$R*9)p-&rufmq)(Fqy8BCA}El z_Z2eL_tJl)JyI-trb~JSA1H(WyEa(JEkRdXhvYRDiTDRvTVL{EVTfie-p8`go1Lu~ zE2Sz@$9yD(?O08Po#6;O)=uo5!iHKyWK6J@7Q(6f!nM87lN%g~4SGd=x4$!Wox1oA zcw2aVo~NGuo?M=N+7m6iCs8}A9pznjPn@Tn_nP+)-%2uDr|V1cE$ASWnB+;&xtExe zFV!Q|mf8vb>!yaQ#ZhiD`bIM(kl{vq_PadjoFZptm@xy%t_N%QhH(`8$4dC!VfMme$Oe@_E-!&S`zZcH zY=qcx`qI|j?Cp_w`tLIfd7+sy)QPGN?$k9|C*$A(E2tBDQ6KCXy@|R>#*aS|skk%q zR}tCy5mH(#bMpi3s|-5If7oF3F$2o<7Vt*U%?5^(t45e z*qum*IY@5p$>HkiUFT`yF?)_`J+&{j2k!GoZ0YWtWSKr-2iopw>#gtW?Qf}n&=24> zYA%%_KJtz1!4jY=JJc*>cidMyQW3BtSQsVMU)k3qP-bhAkS&u`|bt@A|^^)HAkaOb2i>Ajp*@yN)cT`P5U(N&9 ziZRY3LDx1y$%wOKEr|o=?Fi_I?=o`F(^)e)k)x*?$KkANj3dTJ^7@A`i(9aP8myQ4 zNCNl4Xh({nCRaEJhO^QBKEVqLK?9UeM@kDIN2j7+u93%LNt(_%h4CYcT3#M@q<_I| zy2k3?h);PV+${n;n7mSU=?l<=-od?pMq{kc{{M^>+7J2V1`=~)BMXQ)UG#_kQGW1A zeZ73|$iKPkiSjr-C$v6V8O`H9>E7nP?Dn9!G}6XsFSLoCZ@f02?6>O=KyM`?-EOkp%YB!@6=Q=qwyvEt*<`UE_mb;^c(th9yiFyoQ8jT1grf%8sjOB=Xy43U#_9Pp^X)J0E=@ow2OOqQo4g( z=0x6_CjTt|EvJI3U}wzBptaZJ$i?XUWxs5LKU>K_zr{Jv{+lI?G z@E%QPO?*QQxrglaorqw$!w%jTTlh6k$(@EP9-Uw+?eZ=$CiJZH65 zN3&{o-7CmktmN+C-s1k#o#L*j&DUCbdU!|qdiZOBT#!QTpn3R}yCbd7#&%eO`gN)5 z6-Ij;89~j>#XvQ^jucf?DXTcClAIF+mmW~VD0Z!;&_W8 z3QhG!#;QZ4P8L>5H26fd=|u$E$rb7r2n+Au$Wv3;!zFw-Gl`_>gp_@itm;VUXS6;M zB%#{q>n)KY&+311yaM5=191WgMn&Z2-`JmfWBc{O@uS$G-Z9hvp-$^*te$V=JMfsl zz*Tz-U%idKcob>sHGB6fUQh6d!$+JOq>D$`|E_ZGCb_3Si^g zfh|3h7=X@5w72x#SPjbSXUW@rgyrTt-$yWDo_qQu+5W1nBe&hI9e1xq>v-la4Q+SR zR%t4Al|OhTtaKCgzQj$Si%Rq4iSWFW@^q!8ng~TtN9tKg{8t&XN9{zWZb#yvsw!V7 zXOPg(Nn4@hOK5IEHog67tY8d9J_}gtyHBQ@9T_ zH31yK-{dnqk3yCm43CLGA3BGWG*RkBt-WyR2KM^e*sRXsyNSS3xC(i#h~b4BM1wlK z4s@IQzR6_b?)2tH0&48Z?U6i>wRuo?39XtoSlg!E);?$s&j!z2@6W!g{*8Ja13XL9 zSfZnsbI)o}#Ym-|x3ht{fi0!cd25WE)j$C*yS0e3rvFq=E4@cnTTTArD zNa_`qGM?!h8Q&q`g+!wjb_6gw8SyJ-i?q#TNW_rSV8zVD@sOwM}O} z4XFZS{XMq+UW{gY+Rz5QtsT+CwXj|{;Jdn5$!lYy>VltOlYD?t3fT7 z;ot4x-mf!k9HsG$M6pjkV1KD^m_Qkr1TNZrtk_OCNJHNpZ-3;M&7Mx4vScwn(XMJ+ zwe{K`n$1(kGstt?6G298L4O`vegNO$2BKUBGV?p+jqE1(LD$`?j)kHl)%oB)?EuYa zDfS7CwYU*W;|`?WoJhKls9`Y?uUbR&`*zr6CL<*;M^cO@UZ)A%WdJ;V9AiJ25pIAq zPz38K{silnv+$@3rN z#e(>uI>9rBajyj#k40#$>+rv9qsGcfYR24T$9xV(qD{)fK2i=}PCe{(ZJ>hb(jqwV zdDfg6tRSnb;*H3Tmh&&@X!|p0xgEdIkrd}3BU+KsW`Hq~YV2aIl`#I&Cxh*C6ZA5t z{{&H#R^KV_bZ>iaS>k4`PzApW01#V zpwjEe=2wh6yn98Y;}`gmnqe1Ohj;yNYyvsZIL9!WG0frsBnM5Z3U@lmu9jPAqD)5< zKZpMPOi2JE>?slBTkvaq&#rQT-L9Ja0ffC$$U#4{jvm3S@&zs#eX)K-W2a5JJx=zw(gDrXr@7zHm zzeba}Be80tK~TsG!d!o3vE^WIO~v!joL$+Z+-3bl!bx9YEBOiuXE(Y_8RF)IR4^W$ zs5O#79il%fBkx8)ef7{~`rrkci!OQ#-CDvwSs9uhiaap~y4s6Gw+AWdH}s!9{I?q| za19i^5UN{>hOva#*~m~67&EHeL7T0yKYqt^Bjl=zSc$$wf6tG;6N1z);@;k4e|rlz z{sT{{sOBkZ%j}|cYlt3LOWfFIyuEASqI1#mC!x>wMK0@%1*0n#ruNu0+kgnz60ccz zo|_`AH)i&}<$WY)b>-aQ{AwO6W))Z3#g1_nKk)-R=5csyRoao0J+Ul)&RWn@V`QfG z$obvaVfwHt`_O}-NabU&LXBlT&qO+(&#@3&%xqTMZ2Ys6`BucD^rf$Du^TmGMb<&G zuZG6(HDgzSqY^!jfKE%{k1m8vos;{9Va*gi4N7$pz3Zkmsd$i+Gma#5!B|=tm+|}& zo%Jmv^^WJ4#4x_Ys`G|tVf%Q?yElCIn&VZ*<6mB15H;|c$5U3pBfQ%&JpTh1zt1?w za6IOCf{$06^@hhgt`N^XQ)!2XicJA*R%TW_&`7j13pDTrhp@=y%~)x9=tFLfJbd;A zui1DG=R8q^)K0I=^h-hRH{t&lhmSr6GT!mRd-1vGx%f<+C1pGUd`606#(y%Oh$|>u z%fzQ@#ub5-$+)_baUKx=d>8z6Amchz{o+qtU0h4tN&I0%%Xt0#B>p#u6ZP@%^ZxVU z{qHB@7s2a^t1H}D+({gwZNLC#^iT9qv`7B$Yw$mo9G{8yS!rpoo#L#|X9lk#+Wq;8 zlz;m_f8vg!M`A?8HyJPgeHG&-zWaQ-30@~=%1?X6A^IW4Gx#fUw&;ntl4yDGj-vIV zec~`@JO|q$dLa(c*Wmf$o%lqIWbhL)3*t)u8}(p|#Q&mAJ|3b)Vq`^o#HV7s{JazQ z6ys*$2)@0jz^G&#F&Ze2EP^aDd?EN`s>lq{Gk8g671T!C!ywTktxc?jNovV*i4ypljCv+}9NB=ERx_u2j+Y;5)HG#JkTk^}pYX>jhgFZ29N^L~lbf z+9Y_iGh@xzd3DlC@fuu5VXPy;#YM|48SliJvhm+%o)nw~F}nY|XK+l!Z-R3eoV#F8 z#5&P3){2*X!rJC3yy*}<5%K+u;0OUdNaNcj+VGy@Cf!o zv{l?8*pL6a4n^C8Ttj>pq$JTU@o8|JgP)2O5j^iRwTZP9TruKoDP!KnZ0i}^%>uOq zX;tE#pm8fBB0jZou0mv?mT^Bb*A??1##G!R*a~sa%)iVL$Q*&p5y%{Y%n`^Ofy@!e z9D&Rc$Q*&p5y%{Y%n`^Ofy@!e9D&Rc$Q*&p5y%{Y%n`^Ofy@!e9D&Rc$Q*&p5%~W- G0{;(ecE51| diff --git a/tts.py b/tts.py deleted file mode 100644 index 119e24a..0000000 --- a/tts.py +++ /dev/null @@ -1,93 +0,0 @@ -"""Support for Baidu TTS.""" -import logging -from typing import Any - -from aip import AipSpeech -from homeassistant.components.tts import ( - TextToSpeechEntity, - PLATFORM_SCHEMA, -) -from homeassistant.config_entries import ConfigEntry -from homeassistant.core import HomeAssistant -from homeassistant.helpers.entity_platform import AddEntitiesCallback - -from .const import ( - DOMAIN, - DEFAULT_SPEED, - DEFAULT_PITCH, - DEFAULT_VOLUME, - DEFAULT_PERSON, -) - -_LOGGER = logging.getLogger(__name__) - -SUPPORT_LANGUAGES = ["zh", "en"] -DEFAULT_LANG = "zh" - -async def async_setup_entry( - hass: HomeAssistant, - config_entry: ConfigEntry, - async_add_entities: AddEntitiesCallback, -) -> bool: - """Set up Baidu TTS from a config entry.""" - async_add_entities([BaiduTTSEntity(hass, config_entry)]) - return True - -class BaiduTTSEntity(TextToSpeechEntity): - """Baidu TTS Entity.""" - - def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry) -> None: - """Initialize Baidu TTS entity.""" - self.hass = hass - self._config_entry = config_entry - self._attr_name = "Baidu TTS" - self._attr_unique_id = f"{DOMAIN}_tts" - - # 初始化百度语音合成客户端 - self._client = AipSpeech( - config_entry.data["app_id"], - config_entry.data["api_key"], - config_entry.data["secret_key"] - ) - - @property - def default_language(self) -> str: - """Return the default language.""" - return DEFAULT_LANG - - @property - def supported_languages(self) -> list[str]: - """Return list of supported languages.""" - return SUPPORT_LANGUAGES - - async def async_get_tts_audio(self, message: str, language: str, options: dict = None) -> tuple[str, bytes]: - """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) - - try: - result = await self.hass.async_add_executor_job( - 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 - - 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 deleted file mode 100644 index fb6641961cdfa39da42a5695a69cbd5f2043d62a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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