diff --git a/main/manager-api/src/main/resources/db/changelog/202508131557.sql b/main/manager-api/src/main/resources/db/changelog/202508131557.sql new file mode 100644 index 00000000..decfd0db --- /dev/null +++ b/main/manager-api/src/main/resources/db/changelog/202508131557.sql @@ -0,0 +1,26 @@ +-- 添加 paddle_speech 流式 TTS 供应器 +DELETE FROM `ai_model_provider` WHERE id = 'SYSTEM_TTS_PaddleSpeechTTS'; +INSERT INTO `ai_model_provider` (`id`, `model_type`, `provider_code`, `name`, `fields`, `sort`, `creator`, `create_date`, `updater`, `update_date`) +VALUES ('SYSTEM_TTS_PaddleSpeechTTS', 'TTS', 'paddle_speech', 'PaddleSpeechTTS', +'[{"key":"protocol","label":"协议类型","type":"string","options":["websocket","http"]},{"key":"url","label":"服务地址","type":"string"},{"key":"spk_id","label":"音色","type":"int"},{"key":"sample_rate","label":"采样率","type":"float"},{"key":"speed","label":"语速","type":"float"},{"key":"volume","label":"音量","type":"float"},{"key":"save_path","label":"保存路径","type":"string"}]', +17, 1, NOW(), 1, NOW()); + +-- 添加 paddle_speech 流式 TTS 模型配置 +DELETE FROM `ai_model_config` WHERE id = 'TTS_PaddleSpeechTTS'; +INSERT INTO `ai_model_config` VALUES ('TTS_PaddleSpeechTTS', 'TTS', 'PaddleSpeechTTS', 'PaddleSpeechTTS', 0, 1, +'{"type": "paddle_speech", "protocol": "websocket", "url": "ws://127.0.0.1:8092/paddlespeech/tts/streaming", "spk_id": "0", "sample_rate": 24000, "speed": 1.0, "volume": 1.0, "save_path": "./streaming_tts.wav"}', +NULL, NULL, 20, NULL, NULL, NULL, NULL); + +-- 更新 PaddleSpeechTTS 配置说明 +UPDATE `ai_model_config` SET +`doc_link` = 'https://github.com/PaddlePaddle/PaddleSpeech', +`remark` = 'PaddleSpeechTTS 配置说明: +1. PaddleSpeech 是百度飞桨开源的语音合成工具,支持本地离线部署和模型训练。paddlepaddle百度飞浆框架地址:https://www.paddlepaddle.org.cn/ +2. 支持 WebSocket 和 HTTP 协议,默认使用 WebSocket 进行流式传输(参考部署文档:https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/docs/paddlespeech-deploy.md)。 +3. 使用前要在本地部署 paddlespeech 服务,服务默认运行在 ws://127.0.0.1:8092/paddlespeech/tts/streaming +4. 支持自定义发音人、语速、音量和采样率。 +' WHERE `id` = 'TTS_PaddleSpeechTTS'; + +-- 删除旧音色并添加默认音色 +DELETE FROM `ai_tts_voice` WHERE tts_model_id = 'TTS_PaddleSpeechTTS'; +INSERT INTO `ai_tts_voice` VALUES ('TTS_PaddleSpeechTTS_0000', 'TTS_PaddleSpeechTTS', '默认', '0', '中文', NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL); \ No newline at end of file diff --git a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml index cd4b26cf..0e8d3dc3 100755 --- a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml @@ -296,3 +296,10 @@ databaseChangeLog: - sqlFile: encoding: utf8 path: classpath:db/changelog/202508111734.sql + - changeSet: + id: 202508131557 + author: RanChen + changes: + - sqlFile: + encoding: utf8 + path: classpath:db/changelog/202508131557.sql diff --git a/main/xiaozhi-server/core/providers/tts/paddle_speech.py b/main/xiaozhi-server/core/providers/tts/paddle_speech.py index a52a27b1..7f1c6a23 100644 --- a/main/xiaozhi-server/core/providers/tts/paddle_speech.py +++ b/main/xiaozhi-server/core/providers/tts/paddle_speech.py @@ -18,10 +18,20 @@ class TTSProvider(TTSProviderBase): super().__init__(config, delete_audio_file) self.url = config.get("url", "ws://192.168.1.10:8092/paddlespeech/tts/streaming") self.protocol = config.get("protocol", "websocket") - self.spk_id = config.get("spk_id", 0) - self.sample_rate = config.get("sample_rate", 24000) - self.speed = config.get("speed", 1.0) - self.volume = config.get("volume", 1.0) + if config.get("private_voice"): + self.spk_id = int(config.get("private_voice")) + else: + self.spk_id = int(config.get("spk_id", "0")) + + sample_rate = config.get("sample_rate", 24000) + self.sample_rate = float(sample_rate) if sample_rate else 24000 + + speed = config.get("speed", 1.0) + self.speed = float(speed) if speed else 1.0 + + volume = config.get("volume", 1.0) + self.volume = float(volume) if volume else 1.0 + self.save_path = config.get("save_path", "./streaming_tts.wav") async def pcm_to_wav(self, pcm_data: bytes, sample_rate: int = 24000, num_channels: int = 1,