mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-29 18:23:59 +08:00
update:TTS_ACGNTTS 海豚配音截止5月7日未找到token入口,先暂时下架这个供应器
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
-- 删除provider_code为ttson的供应器
|
||||||
|
DELETE FROM `ai_model_provider` WHERE `provider_code` = 'ttson';
|
||||||
|
|
||||||
|
-- 删除model_code为ACGNTTS的配置
|
||||||
|
DELETE FROM `ai_model_config` WHERE `model_code` = 'ACGNTTS';
|
||||||
@@ -641,3 +641,10 @@ databaseChangeLog:
|
|||||||
- sqlFile:
|
- sqlFile:
|
||||||
encoding: utf8
|
encoding: utf8
|
||||||
path: classpath:db/changelog/202604300930.sql
|
path: classpath:db/changelog/202604300930.sql
|
||||||
|
- changeSet:
|
||||||
|
id: 202605071037
|
||||||
|
author: fyb
|
||||||
|
changes:
|
||||||
|
- sqlFile:
|
||||||
|
encoding: utf8
|
||||||
|
path: classpath:db/changelog/202605071037.sql
|
||||||
|
|||||||
@@ -1065,24 +1065,6 @@ TTS:
|
|||||||
output_dir: tmp/
|
output_dir: tmp/
|
||||||
access_token: "你的机智云API key"
|
access_token: "你的机智云API key"
|
||||||
# language: "中文" # 指定输出语种,如:中文、英语、日语、韩语等,请根据所选音色支持的语言进行设置,不填则默认为中文
|
# language: "中文" # 指定输出语种,如:中文、英语、日语、韩语等,请根据所选音色支持的语言进行设置,不填则默认为中文
|
||||||
ACGNTTS:
|
|
||||||
#在线网址:https://acgn.ttson.cn/
|
|
||||||
#token购买:www.ttson.cn
|
|
||||||
#开发相关疑问请提交至网站上的qq
|
|
||||||
#角色id获取地址:ctrl+f快速检索角色——网站管理者不允许发布,可询问网站管理者
|
|
||||||
#各参数意义见开发文档:https://www.yuque.com/alexuh/skmti9/wm6taqislegb02gd?singleDoc#
|
|
||||||
type: ttson
|
|
||||||
token: your_token
|
|
||||||
voice_id: 1695
|
|
||||||
speed_factor: 1
|
|
||||||
pitch_factor: 0
|
|
||||||
volume_change_dB: 0
|
|
||||||
to_lang: ZH
|
|
||||||
url: https://u95167-bd74-2aef8085.westx.seetacloud.com:8443/flashsummary/tts?token=
|
|
||||||
format: mp3
|
|
||||||
output_dir: tmp/
|
|
||||||
emotion: 1
|
|
||||||
# language: "中文" # 指定输出语种,如:中文、英语、日语、韩语等,请根据所选音色支持的语言进行设置,不填则默认为中文
|
|
||||||
OpenAITTS:
|
OpenAITTS:
|
||||||
# openai官方文本转语音服务,可支持全球大多数语种
|
# openai官方文本转语音服务,可支持全球大多数语种
|
||||||
type: openai
|
type: openai
|
||||||
|
|||||||
@@ -1,96 +0,0 @@
|
|||||||
import os
|
|
||||||
import uuid
|
|
||||||
import json
|
|
||||||
import requests
|
|
||||||
import shutil
|
|
||||||
from datetime import datetime
|
|
||||||
from core.providers.tts.base import TTSProviderBase
|
|
||||||
from config.logger import setup_logging
|
|
||||||
|
|
||||||
TAG = __name__
|
|
||||||
logger = setup_logging()
|
|
||||||
|
|
||||||
|
|
||||||
class TTSProvider(TTSProviderBase):
|
|
||||||
TTS_PARAM_CONFIG = [
|
|
||||||
("ttsVolume", "volume_change_dB", -10, 10, 0, int),
|
|
||||||
("ttsRate", "speed_factor", 0.5, 2, 0, lambda v: round(float(v), 1)),
|
|
||||||
("ttsPitch", "pitch_factor", -8, 8, 0, lambda v: round(float(v), 1)),
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, config, delete_audio_file):
|
|
||||||
super().__init__(config, delete_audio_file)
|
|
||||||
self.url = config.get(
|
|
||||||
"url",
|
|
||||||
"https://u95167-bd74-2aef8085.westx.seetacloud.com:8443/flashsummary/tts?token=",
|
|
||||||
)
|
|
||||||
if config.get("private_voice"):
|
|
||||||
self.voice = int(config.get("private_voice"))
|
|
||||||
else:
|
|
||||||
self.voice = int(config.get("voice_id", 1695))
|
|
||||||
self.token = config.get("token")
|
|
||||||
self.to_lang = config.get("to_lang")
|
|
||||||
self.volume_change_dB = int(config.get("volume_change_dB", 0))
|
|
||||||
self.speed_factor = int(config.get("speed_factor", 1))
|
|
||||||
self.stream = str(config.get("stream", False)).lower() in ("true", "1", "yes")
|
|
||||||
self.output_file = config.get("output_dir")
|
|
||||||
self.pitch_factor = int(config.get("pitch_factor", 0))
|
|
||||||
self.audio_file_type = config.get("format", "mp3")
|
|
||||||
self.emotion = int(config.get("emotion", 1))
|
|
||||||
self.header = {"Content-Type": "application/json"}
|
|
||||||
|
|
||||||
# 应用百分比调整(如果存在),否则使用公有化配置
|
|
||||||
self._apply_percentage_params(config)
|
|
||||||
|
|
||||||
def generate_filename(self, extension=".mp3"):
|
|
||||||
return os.path.join(
|
|
||||||
self.output_file,
|
|
||||||
f"tts-{datetime.now().date()}@{uuid.uuid4().hex}{extension}",
|
|
||||||
)
|
|
||||||
|
|
||||||
async def text_to_speak(self, text, output_file):
|
|
||||||
url = f"{self.url}{self.token}"
|
|
||||||
result = "firefly"
|
|
||||||
payload = json.dumps(
|
|
||||||
{
|
|
||||||
"to_lang": self.to_lang,
|
|
||||||
"text": text,
|
|
||||||
"emotion": self.emotion,
|
|
||||||
"format": self.audio_file_type,
|
|
||||||
"volume_change_dB": self.volume_change_dB,
|
|
||||||
"voice_id": self.voice,
|
|
||||||
"pitch_factor": self.pitch_factor,
|
|
||||||
"speed_factor": self.speed_factor,
|
|
||||||
"token": self.token,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
resp = requests.request("POST", url, data=payload)
|
|
||||||
if resp.status_code != 200:
|
|
||||||
logger.bind(tag=TAG).error(f"TTSON 请求失败: {resp.text}")
|
|
||||||
raise Exception(f"{__name__}: TTS请求失败")
|
|
||||||
resp_json = resp.json()
|
|
||||||
try:
|
|
||||||
result = (
|
|
||||||
resp_json["url"]
|
|
||||||
+ ":"
|
|
||||||
+ str(resp_json["port"])
|
|
||||||
+ "/flashsummary/retrieveFileData?stream=True&token="
|
|
||||||
+ self.token
|
|
||||||
+ "&voice_audio_path="
|
|
||||||
+ resp_json["voice_path"]
|
|
||||||
)
|
|
||||||
|
|
||||||
audio_content = requests.get(result)
|
|
||||||
if output_file:
|
|
||||||
with open(output_file, "wb") as f:
|
|
||||||
f.write(audio_content.content)
|
|
||||||
else:
|
|
||||||
return audio_content.content
|
|
||||||
voice_path = resp_json.get("voice_path")
|
|
||||||
des_path = output_file
|
|
||||||
shutil.move(voice_path, des_path)
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print("error:", e)
|
|
||||||
raise Exception(f"{__name__}: TTS请求失败")
|
|
||||||
Reference in New Issue
Block a user