将多个检查脚本中的tts_providers.json路径改为tts_providers-local.json 升级next和eslint-config-next到15.5.9版本
108 lines
4.5 KiB
Python
108 lines
4.5 KiB
Python
import json
|
|
import requests
|
|
import time
|
|
import base64
|
|
import os
|
|
import json
|
|
|
|
def check_doubao_tts_voices():
|
|
config_file_path = "../config/doubao-tts.json"
|
|
tts_providers_path = "../config/tts_providers-local.json"
|
|
test_text = "你好" # 测试文本
|
|
|
|
try:
|
|
with open(config_file_path, 'r', encoding='utf-8') as f:
|
|
config_data = json.load(f)
|
|
except FileNotFoundError:
|
|
print(f"错误: 配置文件未找到,请检查路径: {config_file_path}")
|
|
return
|
|
except json.JSONDecodeError:
|
|
print(f"错误: 无法解析 JSON 文件: {config_file_path}")
|
|
return
|
|
|
|
url = config_data.get("apiUrl", "")
|
|
headers = config_data.get("headers", {})
|
|
request_payload = config_data.get("request_payload", {})
|
|
voices = config_data.get('voices', [])
|
|
|
|
try:
|
|
with open(tts_providers_path, 'r', encoding='utf-8') as f:
|
|
tts_providers_data = json.load(f)
|
|
doubao_config = tts_providers_data.get('doubao', {})
|
|
doubao_app_id = doubao_config.get('X-Api-App-Id')
|
|
doubao_access_key = doubao_config.get('X-Api-Access-Key')
|
|
|
|
if doubao_app_id and doubao_access_key:
|
|
headers['X-Api-App-Id'] = doubao_app_id
|
|
headers['X-Api-Access-Key'] = doubao_access_key
|
|
else:
|
|
print(f"警告: 未在 {tts_providers_path} 中找到豆包的 X-Api-App-Id 或 X-Api-Access-Key。")
|
|
except FileNotFoundError:
|
|
print(f"错误: TTS 提供商配置文件未找到,请检查路径: {tts_providers_path}")
|
|
return
|
|
except json.JSONDecodeError:
|
|
print(f"错误: 无法解析 TTS 提供商 JSON 文件: {tts_providers_path}")
|
|
return
|
|
|
|
print(f"开始验证 {len(voices)} 个豆包 TTS 语音...")
|
|
|
|
for voice in voices:
|
|
voice_code = voice.get('code')
|
|
voice_name = voice.get('alias', voice.get('name', '未知')) # 优先使用 alias, 否则使用 name
|
|
|
|
if voice_code:
|
|
print(f"正在测试语音: {voice_name} (Code: {voice_code})")
|
|
session = requests.Session()
|
|
try:
|
|
payload = request_payload.copy()
|
|
payload['req_params']['text'] = test_text
|
|
payload['req_params']['speaker'] = voice_code
|
|
|
|
response = session.post(url, headers=headers, json=payload, stream=True, timeout=30)
|
|
|
|
logid = response.headers.get('X-Tt-Logid')
|
|
if logid:
|
|
print(f" X-Tt-Logid: {logid}")
|
|
|
|
audio_data = bytearray()
|
|
if response.status_code == 200:
|
|
for chunk in response.iter_lines(decode_unicode=True):
|
|
if not chunk:
|
|
continue
|
|
data = json.loads(chunk)
|
|
|
|
if data.get("code", 0) == 0 and "data" in data and data["data"]:
|
|
chunk_audio = base64.b64decode(data["data"])
|
|
audio_data.extend(chunk_audio)
|
|
continue
|
|
if data.get("code", 0) == 0 and "sentence" in data and data["sentence"]:
|
|
continue
|
|
if data.get("code", 0) == 20000000:
|
|
break
|
|
if data.get("code", 0) > 0:
|
|
print(f" ❌ {voice_name} (Code: {voice_code}): 接口返回错误: {data}")
|
|
audio_data = bytearray()
|
|
break
|
|
|
|
if audio_data:
|
|
print(f" ✅ {voice_name} (Code: {voice_code}): 可用")
|
|
with open(f"test_{voice_code}.mp3", "wb") as f:
|
|
f.write(audio_data)
|
|
elif not audio_data and response.status_code == 200:
|
|
print(f" ❌ {voice_name} (Code: {voice_code}): 接口返回成功但未收到音频数据。")
|
|
else:
|
|
print(f" ❌ {voice_name} (Code: {voice_code}): 不可用, HTTP状态码: {response.status_code}, 响应: {response.text}")
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
print(f" ❌ {voice_name} (Code: {voice_code}): 请求失败, 错误: {e}")
|
|
finally:
|
|
session.close()
|
|
time.sleep(0.5)
|
|
else:
|
|
print(f"跳过一个缺少 'code' 字段的语音条目: {voice}")
|
|
|
|
print("豆包 TTS 语音验证完成。")
|
|
|
|
if __name__ == "__main__":
|
|
check_doubao_tts_voices()
|