diff --git a/.gitignore b/.gitignore index 417d4a0..3434147 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # 忽略 Python 缓存目录 __pycache__/ output/ -excalidraw.log \ No newline at end of file +excalidraw.log +config/tts_providers-local.json diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..cf3eae3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,48 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## 常用命令 + +* **生成播客**: + ```bash + python podcast_generator.py [可选参数] + ``` + 可选参数包括: + * `--api-key `: OpenAI API 密钥。 + * `--base-url `: OpenAI API 代理地址。 + * `--model `: 使用的 OpenAI 模型,默认为 `gpt-3.5-turbo`。 + * `--threads `: 生成音频的并行线程数,默认为 `1`。 + + **示例**: + ```bash + python podcast_generator.py --api-key sk-xxxxxx --model gpt-4o --threads 4 + ``` + +## 高层代码架构 + +本项目是一个简易播客生成器,核心功能是利用 AI 生成播客脚本并将其转换为音频。 + +* **`podcast_generator.py`**: 主运行脚本,负责协调整个播客生成流程,包括: + * 读取配置文件 (`config/*.json`)。 + * 读取输入文件 (`input.txt`) 和 AI 提示词文件 (`prompt/*.txt`)。 + * 调用 OpenAI API 生成播客大纲和详细脚本。 + * 调用配置的 TTS 服务生成音频。 + * 使用 FFmpeg 合并生成的音频文件。 + * 支持命令行参数配置 OpenAI API 和线程数。 + +* **`config/`**: 存放 TTS 服务和播客角色配置的 JSON 文件。例如 `edge-tts.json`。这些文件定义了 `podUsers` (播客角色)、`voices` (可用语音) 和 `apiUrl` (TTS 服务接口)。 + +* **`prompt/`**: 包含用于指导 AI 生成内容的提示词文件。 + * `prompt-overview.txt`: 用于生成播客整体大纲。 + * `prompt-podscript.txt`: 用于生成详细对话脚本,包含占位符 (`{{numSpeakers}}`, `{{turnPattern}}`)。 + +* **`input.txt`**: 用户输入播客主题或核心观点,也支持嵌入 `custom` 代码块来提供额外的 AI 指令。 + +* **`openai_cli.py`**: 负责与 OpenAI API 进行交互的模块。 + +* **`output/`**: 生成的播客音频文件 (`.wav`) 存放目录。 + +* **TTS 服务集成**: 项目设计为高度灵活,支持多种 TTS 服务,通过 `config/*.json` 中的 `apiUrl` 进行配置。目前支持本地部署的 `index-tts` 和 `edge-tts`,以及理论上可集成的网络 TTS 服务(如 OpenAI TTS, Azure TTS 等)。 + +* **音频合并**: 使用 FFmpeg 工具将各个角色的语音片段拼接成一个完整的播客音频文件。FFmpeg 必须安装并配置在系统环境变量中。 diff --git a/README.md b/README.md index 87f7c2c..4e8e0ec 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ * **🤖 AI 驱动脚本**:借助强大的 OpenAI 模型,自动创作高质量、有深度的播客对话脚本。 * **👥 多角色支持**:自由定义多个播客角色(如主持、嘉宾),并为每个角色指定独一无二的 TTS 语音。 * **🔌 灵活的 TTS 集成**:通过简单的 API URL 配置,无缝对接您自建的或第三方的 TTS 服务。 -* **🔊 智能音频合并**:自动将各个角色的语音片段精准拼接,合成一个完整的、流畅的播客音频文件 (`.wav` 格式)。 +* **🔊 智能音频合并**:自动将各个角色的语音片段精准拼接,并支持**音量与语速调整**,合成一个完整的、流畅的播客音频文件 (`.wav` 格式)。 * **⌨️ 便捷的命令行接口**:提供清晰的命令行参数,让您对播客生成过程的每一个环节都了如指掌。 --- @@ -144,8 +144,9 @@ python podcast_generator.py --api-key sk-xxxxxx --model gpt-4o --threads 4 } ``` +* `tts_max_retries` (可选): TTS API 调用失败时的最大重试次数(默认为 `3`)。 * `podUsers`: 定义播客中的**角色**。每个角色的 `code` 必须对应 `voices` 列表中的一个有效语音。 -* `voices`: 定义所有可用的 TTS **语音**。 +* `voices`: 定义所有可用的 TTS **语音**,可包含 `volume_adjustment` (音量调整,单位 dB,例如 `6.0` 增加 6dB,`-3.0` 减少 3dB) 和 `speed_adjustment` (语速调整,单位百分比,例如 `10.0` 增加 10% 语速,`-10.0` 减少 10% 语速) 参数。 * `apiUrl`: 您的 TTS 服务 API 端点。`{{text}}` 将被替换为对话文本,`{{voiceCode}}` 将被替换为角色的语音代码。 * `turnPattern`: 定义角色对话的**轮流模式**,例如 `random` (随机) 或 `sequential` (顺序)。 @@ -165,17 +166,16 @@ python podcast_generator.py --api-key sk-xxxxxx --model gpt-4o --threads 4 * **edge-tts**: [https://github.com/zuoban/tts](https://github.com/zuoban/tts) * 这是一个通用的 TTS 库,您可以通过自定义适配器将其集成。 -### 🌐 网络 TTS 接口支持(未完成) +### 🌐 网络 TTS 接口支持 本项目也可以轻松配置集成各种网络 TTS 服务,只需确保您的 `apiUrl` 配置符合服务提供商的要求。常见的支持服务包括: - -* **OpenAI TTS** -* **Azure TTS** -* **Google Cloud Text-to-Speech (Vertex AI)** * **Minimax TTS** -* **Gemini TTS** (可能需要通过自定义 API 适配器集成) * **Fish Audio TTS** - +* **豆包 TTS (Doubao TTS)** +* **Gemini TTS** +* **OpenAI TTS**(计划中) +* **Azure TTS**(计划中) +* **Google Cloud Text-to-Speech (Vertex AI)**(计划中) --- ## 🎉 输出成果 @@ -189,11 +189,27 @@ python podcast_generator.py --api-key sk-xxxxxx --model gpt-4o --threads 4 * **Edge TTS 生成示例**: -[edgeTTS](https://github.com/user-attachments/assets/3891cf4c-f47f-4c9b-aef6-30ffb3fcefc4) +[edgeTTS](example/edgeTTS.wav) * **Index TTS 生成示例**: -[indexTTS](https://github.com/user-attachments/assets/a1d2ebee-3e9a-43cb-bc94-67e3c9b3c45a) +[indexTTS](example/indexTTS.wav) + +* **豆包 TTS 生成示例**: + +[doubaoTTS](example/doubaoTTS.wav) + +* **Minimax 生成示例**: + +[minimax](example/minimax.wav) + +* **Fish Audio 生成示例**: + +[fish](example/fish.wav) + +* **Gemini TTS 生成示例**: + +[geminiTTS](example/geminiTTS.wav) 这些音频文件展示了本工具在实际应用中的效果。 @@ -205,15 +221,29 @@ python podcast_generator.py --api-key sk-xxxxxx --model gpt-4o --threads 4 ``` . ├── config/ # ⚙️ 配置文件目录 +│ ├── doubao-tts.json │ ├── edge-tts.json -│ └── index-tts.json +│ ├── fish-audio.json +│ ├── gemini-tts.json +│ ├── index-tts.json +│ ├── minimax.json +│ └── tts_providers.json ├── prompt/ # 🧠 AI 提示词目录 │ ├── prompt-overview.txt │ └── prompt-podscript.txt +├── example/ # 🎧 示例音频目录 +│ ├── doubaoTTS.wav +│ ├── edgeTTS.wav +│ ├── fish.wav +│ ├── geminiTTS.wav +│ ├── indexTTS.wav +│ └── minimax.wav ├── output/ # 🎉 输出音频目录 ├── input.txt # 🎙️ 播客主题输入文件 ├── openai_cli.py # OpenAI 命令行工具 ├── podcast_generator.py # 🚀 主运行脚本 -└── README.md # 📄 项目说明文档 +├── README.md # 📄 项目说明文档 +├── README_EN.md # 📄 英文说明文档 +└── tts_adapters.py # TTS 适配器文件 ``` diff --git a/README_EN.md b/README_EN.md index 2d3a432..4162853 100644 --- a/README_EN.md +++ b/README_EN.md @@ -14,7 +14,7 @@ This is a powerful script tool that leverages the intelligence of **OpenAI API** * **🤖 AI-Driven Scripting**: Automatically generate high-quality, in-depth podcast dialogue scripts with the powerful OpenAI model. * **👥 Multi-Role Support**: Freely define multiple podcast roles (e.g., host, guest) and assign a unique TTS voice to each role. * **🔌 Flexible TTS Integration**: Seamlessly connect with your self-built or third-party TTS services through simple API URL configuration. -* **🔊 Smart Audio Merging**: Automatically and precisely stitch together voice segments from various roles to synthesize a complete, smooth podcast audio file (`.wav` format). +* **🔊 Smart Audio Merging**: Automatically and precisely stitch together voice segments from various roles, and support volume and speed adjustment, to synthesize a complete, smooth podcast audio file (`.wav` format). * **⌨️ Convenient Command-Line Interface**: Provides clear command-line parameters, giving you full control over every aspect of the podcast generation process. --- @@ -145,6 +145,8 @@ The configuration file is the "brain" of the entire project, telling the script ``` * `podUsers`: Defines the **roles** in the podcast. The `code` for each role must correspond to a valid voice in the `voices` list. +* `tts_max_retries` (optional): The maximum number of retries when a TTS API call fails (default is `3`). +* `voices`: Defines all available TTS **voices**, which can include `volume_adjustment` (volume adjustment in dB, e.g., `6.0` to increase by 6dB, `-3.0` to decrease by 3dB) and `speed_adjustment` (speed adjustment in percentage, e.g., `10.0` to increase speed by 10%, `-10.0` to decrease speed by 10%) parameters. * `voices`: Defines all available TTS **voices**. * `apiUrl`: Your TTS service API endpoint. `{{text}}` will be replaced with the dialogue text, and `{{voiceCode}}` will be replaced with the character's voice code. * `turnPattern`: Defines the **turn-taking pattern** for character dialogue, such as `random` or `sequential`. @@ -165,16 +167,17 @@ You can deploy the following open-source projects as local TTS services and inte * **edge-tts**: [https://github.com/zuoban/tts](https://github.com/zuoban/tts) * This is a general TTS library that you can integrate by customizing an adapter. -### 🌐 Web TTS Interface Support (Pending) +### 🌐 Web TTS Interface Support This project can also be easily configured to integrate various web TTS services. Just ensure your `apiUrl` configuration meets the service provider's requirements. Commonly supported services include: -* **OpenAI TTS** -* **Azure TTS** -* **Google Cloud Text-to-Speech (Vertex AI)** * **Minimax TTS** -* **Gemini TTS** (may require integration via custom API adapter) * **Fish Audio TTS** +* **Doubao TTS** +* **Gemini TTS** +* **OpenAI TTS** (Planned) +* **Azure TTS** (Planned) +* **Google Cloud Text-to-Speech (Vertex AI)** (Planned) --- @@ -188,12 +191,27 @@ You can find sample podcast audio generated using different TTS services in the * **Edge TTS Sample**: -[edgeTTS](https://github.com/user-attachments/assets/3891cf4c-f47f-4c9b-aef6-30ffb3fcefc4) +[edgeTTS](example/edgeTTS.wav) * **Index TTS Sample**: -[indexTTS](https://github.com/user-attachments/assets/a1d2ebee-3e9a-43cb-bc94-67e3c9b3c45a) +[indexTTS](example/indexTTS.wav) +* **Doubao TTS Sample**: + +[doubaoTTS](example/doubaoTTS.wav) + +* **Minimax Sample**: + +[minimax](example/minimax.wav) + +* **Fish Audio Sample**: + +[fish](example/fish.wav) + +* **Gemini TTS Sample**: + +[geminiTTS](example/geminiTTS.wav) These audio files demonstrate the actual effect of this tool in practical applications. @@ -204,13 +222,27 @@ These audio files demonstrate the actual effect of this tool in practical applic ``` . ├── config/ # ⚙️ Configuration Files Directory +│ ├── doubao-tts.json │ ├── edge-tts.json -│ └── index-tts.json +│ ├── fish-audio.json +│ ├── gemini-tts.json +│ ├── index-tts.json +│ ├── minimax.json +│ └── tts_providers.json ├── prompt/ # 🧠 AI Prompt Files Directory │ ├── prompt-overview.txt │ └── prompt-podscript.txt +├── example/ # 🎧 Sample Audio Directory +│ ├── doubaoTTS.wav +│ ├── edgeTTS.wav +│ ├── fish.wav +│ ├── geminiTTS.wav +│ ├── indexTTS.wav +│ └── minimax.wav ├── output/ # 🎉 Output Audio Directory ├── input.txt # 🎙️ Podcast Topic Input File ├── openai_cli.py # OpenAI Command Line Tool ├── podcast_generator.py # 🚀 Main Running Script -└── README.md # 📄 Project Documentation \ No newline at end of file +├── README.md # 📄 Project Documentation +├── README_EN.md # 📄 English Documentation +└── tts_adapters.py # TTS Adapter File \ No newline at end of file diff --git a/check/check_doubao_voices.py b/check/check_doubao_voices.py new file mode 100644 index 0000000..e33ad30 --- /dev/null +++ b/check/check_doubao_voices.py @@ -0,0 +1,107 @@ +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.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() diff --git a/check/check_fishaudio_voices.py b/check/check_fishaudio_voices.py new file mode 100644 index 0000000..ec9ae57 --- /dev/null +++ b/check/check_fishaudio_voices.py @@ -0,0 +1,80 @@ +import json +import requests +import time +import msgpack +import json + +def check_fishaudio_voices(): + config_file_path = "config/fish-audio.json" + tts_providers_path = "config/tts_providers.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 + + voices = config_data.get('voices', []) + request_payload = config_data.get('request_payload', {}) + headers = config_data.get('headers', {}) + url = config_data.get('apiUrl','') + + try: + with open(tts_providers_path, 'r', encoding='utf-8') as f: + tts_providers_data = json.load(f) + fish_api_key = tts_providers_data.get('fish', {}).get('api_key') + if fish_api_key: + headers['Authorization'] = f"Bearer {fish_api_key}" + else: + print(f"警告: 未在 {tts_providers_path} 中找到 Fish Audio 的 API 密钥。") + except FileNotFoundError: + print(f"错误: TTS 提供商配置文件未找到,请检查路径: {tts_providers_path}") + return + except json.JSONDecodeError: + print(f"错误: 无法解析 TTS 提供商 JSON 文件: {tts_providers_path}") + return + + if not voices: + print("未在配置文件中找到任何声音(voices)。") + return + + print(f"开始验证 {len(voices)} 个 Fish Audio 语音...") + 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})") + try: + # 准备请求数据 + payload = request_payload.copy() + payload['text'] = test_text + payload['reference_id'] = voice_code + + # 编码请求数据 + encoded_payload = msgpack.packb(payload) + + # 发送请求 + response = requests.post(url, data=encoded_payload, headers=headers, timeout=30) + + if response.status_code == 200: + print(f" ✅ {voice_name} (Code: {voice_code}): 可用") + with open(f"test_{voice_code}.mp3", "wb") as f: + f.write(response.content) + else: + print(f" ❌ {voice_name} (Code: {voice_code}): 不可用, 状态码: {response.status_code}") + except requests.exceptions.RequestException as e: + print(f" ❌ {voice_name} (Code: {voice_code}): 请求失败, 错误: {e}") + time.sleep(0.5) # 短暂延迟,避免请求过快 + else: + print(f"跳过一个缺少 'code' 字段的语音条目: {voice}") + + print("Fish Audio 语音验证完成。") + +if __name__ == "__main__": + check_fishaudio_voices() \ No newline at end of file diff --git a/check/check_gemini_voices.py b/check/check_gemini_voices.py new file mode 100644 index 0000000..d75b7e6 --- /dev/null +++ b/check/check_gemini_voices.py @@ -0,0 +1,87 @@ +import json +import wave +import time +import os +import requests +import base64 +import json + +def check_gemini_voices(): + config_file_path = "config/gemini-tts.json" + tts_providers_path = "config/tts_providers.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 + + voices = config_data.get('voices', []) + request_payload = config_data.get('request_payload', {}) + headers = config_data.get('headers', {}) + url = config_data.get('apiUrl','') + + try: + with open(tts_providers_path, 'r', encoding='utf-8') as f: + tts_providers_data = json.load(f) + gemini_api_key = tts_providers_data.get('gemini', {}).get('api_key') + if gemini_api_key: + headers['x-goog-api-key'] = gemini_api_key + else: + print(f"警告: 未在 {tts_providers_path} 中找到 Gemini 的 API 密钥。") + except FileNotFoundError: + print(f"错误: TTS 提供商配置文件未找到,请检查路径: {tts_providers_path}") + return + except json.JSONDecodeError: + print(f"错误: 无法解析 TTS 提供商 JSON 文件: {tts_providers_path}") + return + + if not voices: + print("未在配置文件中找到任何声音(voices)。") + return + + print(f"开始验证 {len(voices)} 个 Gemini 语音...") + 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})") + try: + url = url.replace('{{model}}', request_payload['model']) + request_payload['contents'][0]['parts'][0]['text'] = test_text + request_payload['generationConfig']['speechConfig']['voiceConfig']['prebuiltVoiceConfig']['voiceName'] = voice_code + + + response = requests.post(url, headers=headers, json=request_payload, timeout=60) + + if response.status_code == 200: + response_data = response.json() + audio_data_base64 = response_data['candidates'][0]['content']['parts'][0]['inlineData']['data'] + audio_data_pcm = base64.b64decode(audio_data_base64) + + print(f" ✅ {voice_name} (Code: {voice_code}): 可用") + with wave.open(f"test_{voice_code}.mp3", "wb") as f: + f.setnchannels(1) + f.setsampwidth(2) + f.setframerate(24000) + f.writeframes(audio_data_pcm) + else: + print(f" ❌ {voice_name} (Code: {voice_code}): 不可用, 状态码: {response.status_code}, 响应: {response.text}") + except requests.exceptions.RequestException as e: + print(f" ❌ {voice_name} (Code: {voice_code}): 请求失败, 错误: {e}") + except Exception as e: + print(f" ❌ {voice_name} (Code: {voice_code}): 处理响应失败, 错误: {e}") + time.sleep(0.5) # 短暂延迟,避免请求过快 + else: + print(f"跳过一个缺少 'code' 字段的语音条目: {voice}") + + print("Gemini 语音验证完成。") + +if __name__ == "__main__": + check_gemini_voices() \ No newline at end of file diff --git a/check/check_minimax_voices.py b/check/check_minimax_voices.py new file mode 100644 index 0000000..104e8d0 --- /dev/null +++ b/check/check_minimax_voices.py @@ -0,0 +1,100 @@ +import json +import requests +import time +import os +import json + +def check_minimax_voices(): + config_file_path = "config/minimax.json" + tts_providers_path = "config/tts_providers.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 + + voices = config_data.get('voices', []) + request_payload = config_data.get('request_payload', {}) + headers = config_data.get('headers', {}) + url = config_data.get('apiUrl', '') + + try: + with open(tts_providers_path, 'r', encoding='utf-8') as f: + tts_providers_data = json.load(f) + minimax_config = tts_providers_data.get('minimax', {}) + minimax_api_key = minimax_config.get('api_key') + minimax_group_id = minimax_config.get('group_id') + + if minimax_api_key and minimax_group_id: + headers['Authorization'] = f"Bearer {minimax_api_key}" + url = url.replace('{{group_id}}', minimax_group_id) + else: + print(f"警告: 未在 {tts_providers_path} 中找到 Minimax 的 group_id 或 api_key。") + except FileNotFoundError: + print(f"错误: TTS 提供商配置文件未找到,请检查路径: {tts_providers_path}") + return + except json.JSONDecodeError: + print(f"错误: 无法解析 TTS 提供商 JSON 文件: {tts_providers_path}") + return + + if not voices: + print("未在配置文件中找到任何声音(voices)。") + return + + + print(f"开始验证 {len(voices)} 个 Minimax 语音...") + 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})") + try: + # 准备请求数据 + payload = request_payload.copy() + payload['text'] = test_text + payload['voice_setting']['voice_id'] = voice_code + + # 发送请求 + response = requests.post(url, json=payload, headers=headers, timeout=30) + + if response.status_code == 200: + # 检查响应体中的状态 + try: + response_data = response.json() + status = response_data.get('data', {}).get('status', 0) + if status == 2: + print(f" ✅ {voice_name} (Code: {voice_code}): 可用") + # 解析并保存音频数据 + audio_hex = response_data.get('data', {}).get('audio') + if audio_hex: + try: + audio_bytes = bytes.fromhex(audio_hex) + with open(f"test_{voice_code}.mp3", "wb") as audio_file: + audio_file.write(audio_bytes) + except (ValueError, Exception) as e: # 捕获ValueError for invalid hex, Exception for other file errors + print(f" ❌ 保存音频文件时发生错误: {e}") + else: + print(f" ⚠️ 响应中未找到音频数据。") + else: + print(f" ❌ {voice_name} (Code: {voice_code}): 不可用, 状态: {status}") + except json.JSONDecodeError: + print(f" ❌ {voice_name} (Code: {voice_code}): 无法解析响应 JSON") + else: + print(f" ❌ {voice_name} (Code: {voice_code}): 不可用, 状态码: {response.status_code}") + except requests.exceptions.RequestException as e: + print(f" ❌ {voice_name} (Code: {voice_code}): 请求失败, 错误: {e}") + time.sleep(0.5) # 短暂延迟,避免请求过快 + else: + print(f"跳过一个缺少 'code' 字段的语音条目: {voice}") + + print("Minimax 语音验证完成。") + +if __name__ == "__main__": + check_minimax_voices() \ No newline at end of file diff --git a/config/doubao-tts.json b/config/doubao-tts.json new file mode 100644 index 0000000..ce121f4 --- /dev/null +++ b/config/doubao-tts.json @@ -0,0 +1,3024 @@ +{ + "voices": [ + { + "name": "TianMeiTaoZi", + "alias": "甜美桃子", + "usedname": "甜美桃子", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_tianmeitaozi_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/甜美桃子.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NuanYangNvSheng", + "alias": "暖阳女声", + "usedname": "暖阳女声", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_kefunvsheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/暖阳女声.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TinaLaoShi", + "alias": "Tina老师", + "usedname": "Tina老师", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_yingyujiaoyu_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/zh_female_yingyujiaoyu_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Vivi", + "alias": "Vivi", + "usedname": "Vivi", + "gender": "Female", + "locale": "en", + "code": "zh_female_vv_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/zh_female_vv1_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AnRenQinZhu", + "alias": "黯刃秦主", + "usedname": "黯刃秦主", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_anrenqinzhu_cd62e63dcdab_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_anrenqinzhu_cd62e63dcdab_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouNvShen", + "alias": "温柔女神", + "usedname": "温柔女神", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_wenrounvshen_239eff5e8ffa_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_female_wenrounvshen_239eff5e8ffa_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NeiLianCaiJun", + "alias": "内敛才俊", + "usedname": "内敛才俊", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_neiliancaijun_e991be511569_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_neiliancaijun_e991be511569_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChunZhenShaoNv", + "alias": "纯真少女", + "usedname": "纯真少女", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_chunzhenshaonv_e588402fb8ad_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_female_chunzhenshaonv_e588402fb8ad_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NaiQiXiaoSheng", + "alias": "奶气小生", + "usedname": "奶气小生", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_xiaonaigou_edf58cf28b8b_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_xiaonaigou_edf58cf28b8b_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JingLingXiangDao", + "alias": "精灵向导", + "usedname": "精灵向导", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_jinglingxiangdao_1beb294a9e3e_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_female_jinglingxiangdao_1beb294a9e3e_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MenYouPingXiaoGe", + "alias": "闷油瓶小哥", + "usedname": "闷油瓶小哥", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_menyoupingxiaoge_ffed9fc2fee7_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_menyoupingxiaoge_ffed9fc2fee7_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BaDaoZongCai", + "alias": "霸道总裁", + "usedname": "霸道总裁", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_badaozongcai_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_badaozongcai_v1_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengKuGeGe", + "alias": "冷酷哥哥(多情感)", + "usedname": "冷酷哥哥", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_lengkugege_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/zh_male_lengkugege_emo_v2_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WuMeiKeRen", + "alias": "妩媚可人", + "usedname": "妩媚可人", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_ganli_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/妩媚可人.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RuYaGongZi", + "alias": "儒雅公子", + "usedname": "儒雅公子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_flc_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/儒雅公子.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QinQieNvSheng", + "alias": "亲切女声", + "usedname": "亲切女声", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_qinqienvsheng_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/亲切女声.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XieMeiYuJie", + "alias": "邪魅御姐", + "usedname": "邪魅御姐", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_xiangliangya_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/邪魅御姐.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TianCaiTongZhuo", + "alias": "天才同桌", + "usedname": "天才同桌", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_tiancaitongzhuo_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_tiancaitongzhuo_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JiLingXiaoHuo", + "alias": "机灵小伙", + "usedname": "机灵小伙", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_shenmi_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/机灵小伙.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingXinShaoNv", + "alias": "倾心少女", + "usedname": "倾心少女", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_qiuling_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/倾心少女.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TieXinMeiMei", + "alias": "贴心妹妹", + "usedname": "贴心妹妹", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_yilin_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/贴心妹妹.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YuanQiTianMei", + "alias": "元气甜妹", + "usedname": "元气甜妹", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_wuxi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/元气甜妹.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TianXinXiaoMei", + "alias": "甜心小美(多情感)", + "usedname": "甜心小美", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_tianxinxiaomei_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/甜心小美.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhiXinJieJie", + "alias": "知心姐姐", + "usedname": "知心姐姐", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_wenyinvsheng_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/知心姐姐.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MeiLiSuFei", + "alias": "魅力苏菲", + "usedname": "魅力苏菲", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_sophie_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/魅力苏菲.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Sophie", + "alias": "Sophie", + "usedname": "Sophie", + "gender": "Female", + "locale": "en", + "code": "zh_female_sophie_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Sophie.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YangGuangAChen", + "alias": "阳光阿辰", + "usedname": "阳光阿辰", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_qingyiyuxuan_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/阳光阿辰.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenJingMaoMao", + "alias": "文静毛毛", + "usedname": "文静毛毛", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_maomao_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/文静毛毛.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KuaiLeXiaoDong", + "alias": "快乐小东", + "usedname": "快乐小东", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_xudong_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/快乐小东.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YouYouJunZi", + "alias": "悠悠君子", + "usedname": "悠悠君子", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_M100_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/悠悠君子.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "PaoXiaoXiaoGe", + "alias": "咆哮小哥", + "usedname": "咆哮小哥", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_BV144_paoxiaoge_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/咆哮小哥.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XingGanMeiHuo", + "alias": "性感魅惑", + "usedname": "性感魅惑", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_luoqing_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/性感魅惑.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengKuGeGe", + "alias": "冷酷哥哥", + "usedname": "冷酷哥哥", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lengkugege_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/冷酷哥哥.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuAoGongZi", + "alias": "孤傲公子", + "usedname": "孤傲公子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_guaogongzi_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/孤傲公子.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Daisy", + "alias": "Daisy", + "usedname": "Daisy", + "gender": "Female", + "locale": "en", + "code": "en_female_dacey_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Daisy.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChunCheNvSheng", + "alias": "纯澈女生", + "usedname": "纯澈女生", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_feicui_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/纯澈女生.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChunHouDiYin", + "alias": "醇厚低音", + "usedname": "醇厚低音", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_buyan_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/醇厚低音.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HuZiShuShu", + "alias": "胡子叔叔", + "usedname": "胡子叔叔", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_huzi_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/胡子叔叔.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChuLianNvYou", + "alias": "初恋女友", + "usedname": "初恋女友", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_yuxin_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/初恋女友.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TieXinGuiMi", + "alias": "贴心闺蜜", + "usedname": "贴心闺蜜", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_xnx_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/贴心闺蜜.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouBaiYueGuang", + "alias": "温柔白月光", + "usedname": "温柔白月光", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_yry_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/温柔白月光.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XiaoZhangXiaoGe", + "alias": "嚣张小哥", + "usedname": "嚣张小哥", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_ms_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/嚣张小哥.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YouNiDaShu", + "alias": "油腻大叔", + "usedname": "油腻大叔", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_you_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/油腻大叔.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GaoLengYuJie", + "alias": "高冷御姐(多情感)", + "usedname": "高冷御姐", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_gaolengyujie_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/高冷御姐.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AoJiaoBaZong", + "alias": "傲娇霸总(多情感)", + "usedname": "傲娇霸总", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_aojiaobazong_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/傲娇霸总.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuangZhouDeGe", + "alias": "广州德哥(多情感)", + "usedname": "广州德哥", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_guangzhoudege_emo_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/广州德哥.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JingQiangKanYe", + "alias": "京腔侃爷(多情感)", + "usedname": "京腔侃爷", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_jingqiangkanye_emo_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/京腔侃爷.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LinJuAYi", + "alias": "邻居阿姨(多情感)", + "usedname": "邻居阿姨", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_linjuayi_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/邻居阿姨.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YouRouGongZi", + "alias": "优柔公子(多情感)", + "usedname": "优柔公子", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_yourougongzi_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/优柔公子.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShuangJieGunXiaoGe", + "alias": "双节棍小哥", + "usedname": "双节棍小哥", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_zhoujielun_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/双节棍小哥.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Luna", + "alias": "Luna", + "usedname": "Luna", + "gender": "Female", + "locale": "en", + "code": "en_female_sarah_new_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Luna.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Owen", + "alias": "Owen", + "usedname": "Owen", + "gender": "Male", + "locale": "en", + "code": "en_male_charlie_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Owen.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KaiLangXueZhang", + "alias": "开朗学长", + "usedname": "开朗学长", + "gender": "Male", + "locale": "zh-CN", + "code": "en_male_jason_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Gavin.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KevinMcCallister", + "alias": "Kevin McCallister", + "usedname": "Kevin McCallister", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_kevin2_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_en_male_kevin2_tob_2db1c07b-f33e-472e-8264-b8ab16d275b1.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingRuoGongZi", + "alias": "病弱公子", + "usedname": "病弱公子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_bingruogongzi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/病弱公子.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Michael", + "alias": "Michael", + "usedname": "Michael", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_michael_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Michael.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BigBoogie", + "alias": "Big Boogie", + "usedname": "Big Boogie", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_oogie2_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_en_male_oogie2_tob_e699cdb8-47b4-439a-803c-82c7d18e9bf0.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "FrostyMan", + "alias": "Frosty Man", + "usedname": "Frosty Man", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_frosty1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_en_male_frosty1_tob_fb4bd11a-4f15-4a1e-b8b1-a34d339236bb.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TheGrinch", + "alias": "The Grinch", + "usedname": "The Grinch", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_grinch2_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_en_male_grinch2_tob_5d60fdc3-d842-4c99-8105-1e68743554e1.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Zayne", + "alias": "Zayne", + "usedname": "Zayne", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_zayne_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Zayne.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jigsaw", + "alias": "Jigsaw", + "usedname": "Jigsaw", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_cc_jigsaw_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Jigsaw.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ethan", + "alias": "Ethan", + "usedname": "Ethan", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_aussie_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Ethan.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Chucky", + "alias": "Chucky", + "usedname": "Chucky", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_cc_chucky_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Chucky.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ClownMan", + "alias": "Clown Man", + "usedname": "Clown Man", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_cc_penny_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_en_male_cc_penny_v1_tob_82d9f07d-9b2e-4796-8fd0-6159ef6c7324.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xavier", + "alias": "Xavier", + "usedname": "Xavier", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_xavier1_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Xavier.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Noah", + "alias": "Noah", + "usedname": "Noah", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_cc_dracula_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Noah.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Charlie", + "alias": "Charlie", + "usedname": "Charlie", + "gender": "Female", + "locale": "en", + "code": "ICL_en_female_cc_cm_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Charlie.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Alastor", + "alias": "Alastor", + "usedname": "Alastor", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_cc_alastor_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Alastor.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RuYaNanYou", + "alias": "儒雅男友(多情感)", + "usedname": "儒雅男友", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_ruyayichen_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/儒雅男友.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JunLangNanYou", + "alias": "俊朗男友(多情感)", + "usedname": "俊朗男友", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_junlangnanyou_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/俊朗男友.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenNuanShaoNian", + "alias": "温暖少年", + "usedname": "温暖少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_yangyang_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/温暖少年.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CartoonChef", + "alias": "Cartoon Chef", + "usedname": "Cartoon Chef", + "gender": "Male", + "locale": "en", + "code": "ICL_en_male_cc_sha_v1_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_en_male_cc_sha_v1_tob_eb4a14df-284f-4287-a77d-26432cd0ba63.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HikaruGuang", + "alias": "ひかる(光)", + "usedname": "ひかる(光)", + "gender": "Male", + "locale": "zh-CN", + "code": "multi_zh_male_youyoujunzi_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ひかる.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Emily", + "alias": "Emily", + "usedname": "Emily", + "gender": "Female", + "locale": "en", + "code": "en_female_emily_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Emily.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XieMeiNvWang", + "alias": "邪魅女王", + "usedname": "邪魅女王", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_bingjiao3_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/邪魅女王.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Daniel", + "alias": "Daniel", + "usedname": "Daniel", + "gender": "Male", + "locale": "en", + "code": "zh_male_xudong_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Daniel.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Lucas", + "alias": "Lucas", + "usedname": "Lucas", + "gender": "Male", + "locale": "en", + "code": "zh_male_M100_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Lucas.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Diana", + "alias": "Diana", + "usedname": "Diana", + "gender": "Female", + "locale": "en", + "code": "multi_female_maomao_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Diana.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Lucia", + "alias": "Lucía", + "usedname": "Lucía", + "gender": "Male", + "locale": "en", + "code": "multi_male_M100_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Lucía.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Sofia", + "alias": "Sofía", + "usedname": "Sofía", + "gender": "Female", + "locale": "en", + "code": "multi_female_sophie_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Sofía.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Daniel", + "alias": "Daníel", + "usedname": "Daníel", + "gender": "Male", + "locale": "en", + "code": "multi_male_xudong_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Daníel.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SatomiZhiMei", + "alias": "さとみ(智美)", + "usedname": "さとみ(智美)", + "gender": "Female", + "locale": "zh-CN", + "code": "multi_female_sophie_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/さとみ.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MasaoZhengNan", + "alias": "まさお(正男)", + "usedname": "まさお(正男)", + "gender": "Male", + "locale": "zh-CN", + "code": "multi_male_xudong_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/まさお.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TsukiYue", + "alias": "つき(月)", + "usedname": "つき(月)", + "gender": "Female", + "locale": "zh-CN", + "code": "multi_female_maomao_conversation_wvae_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/つき.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhenBianDiYu", + "alias": "枕边低语", + "usedname": "枕边低语", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_asmryexiu_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/枕边低语.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AoManQingNian", + "alias": "傲慢青年", + "usedname": "傲慢青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_aomanqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_aomanqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CuJingNanYou", + "alias": "醋精男友", + "usedname": "醋精男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_cujingnanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_cujingnanyou_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CuJingNanSheng", + "alias": "醋精男生", + "usedname": "醋精男生", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_cujingnansheng_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_cujingnansheng_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShuangLangShaoNian", + "alias": "爽朗少年", + "usedname": "爽朗少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_shuanglangshaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_shuanglangshaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SaJiaoNanYou", + "alias": "撒娇男友", + "usedname": "撒娇男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_sajiaonanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_sajiaonanyou_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouNanYou", + "alias": "温柔男友", + "usedname": "温柔男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_wenrounanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_wenrounanyou_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenShunShaoNian", + "alias": "温顺少年", + "usedname": "温顺少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_wenshunshaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_wenshunshaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NianRenNanYou", + "alias": "粘人男友", + "usedname": "粘人男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_naigounanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_naigounanyou_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SaJiaoNanSheng", + "alias": "撒娇男生", + "usedname": "撒娇男生", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_sajiaonansheng_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_sajiaonansheng_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HuoPoNanYou", + "alias": "活泼男友", + "usedname": "活泼男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_huoponanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_huoponanyou_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TianXiNanYou", + "alias": "甜系男友", + "usedname": "甜系男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_tianxinanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_tianxinanyou_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HuoLiQingNian", + "alias": "活力青年", + "usedname": "活力青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_huoliqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_huoliqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KaiLangQingNian", + "alias": "开朗青年", + "usedname": "开朗青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_kailangqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_kailangqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengMoXiongZhang", + "alias": "冷漠兄长", + "usedname": "冷漠兄长", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lengmoxiongzhang_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_lengmoxiongzhang_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AoJiaoJingYing", + "alias": "傲娇精英", + "usedname": "傲娇精英", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_aojiaojingying_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_aojiaojingying_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "PianPianGongZi", + "alias": "翩翩公子", + "usedname": "翩翩公子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_pianpiangongzi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_pianpiangongzi_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MengDongQingNian", + "alias": "懵懂青年", + "usedname": "懵懂青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_mengdongqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_mengdongqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengLianXiongZhang", + "alias": "冷脸兄长", + "usedname": "冷脸兄长", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lenglianxiongzhang_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_lenglianxiongzhang_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingJiaoShaoNian", + "alias": "病娇少年", + "usedname": "病娇少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_bingjiaoshaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_bingjiaoshaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingJiaoNanYou", + "alias": "病娇男友", + "usedname": "病娇男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_bingjiaonanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_bingjiaonanyou_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingRuoShaoNian", + "alias": "病弱少年", + "usedname": "病弱少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_bingruoshaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_bingruoshaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YiQiShaoNian", + "alias": "意气少年", + "usedname": "意气少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_yiqishaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_yiqishaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GanJingShaoNian", + "alias": "干净少年", + "usedname": "干净少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_ganjingshaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_ganjingshaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengMoNanYou", + "alias": "冷漠男友", + "usedname": "冷漠男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lengmonanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_lengmonanyou_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JingYingQingNian", + "alias": "精英青年", + "usedname": "精英青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_jingyingqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_jingyingqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "FengFaShaoNian", + "alias": "风发少年", + "usedname": "风发少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_fengfashaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_fengfashaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ReXueShaoNian", + "alias": "热血少年", + "usedname": "热血少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_rexueshaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_rexueshaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingShuangShaoNian", + "alias": "清爽少年", + "usedname": "清爽少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_qingshuangshaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_qingshuangshaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhongErQingNian", + "alias": "中二青年", + "usedname": "中二青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_zhongerqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_zhongerqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LingYunQingNian", + "alias": "凌云青年", + "usedname": "凌云青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lingyunqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_lingyunqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZiFuQingNian", + "alias": "自负青年", + "usedname": "自负青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_zifuqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_zifuqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BuJiQingNian", + "alias": "不羁青年", + "usedname": "不羁青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_bujiqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_bujiqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RuYaJunZi", + "alias": "儒雅君子", + "usedname": "儒雅君子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_ruyajunzi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_ruyajunzi_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "DiYinChenYu", + "alias": "低音沉郁", + "usedname": "低音沉郁", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_diyinchenyu_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_diyinchenyu_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengLianXueBa", + "alias": "冷脸学霸", + "usedname": "冷脸学霸", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lenglianxueba_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_lenglianxueba_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RuYaZongCai", + "alias": "儒雅总裁", + "usedname": "儒雅总裁", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_ruyazongcai_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_ruyazongcai_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShenChenZongCai", + "alias": "深沉总裁", + "usedname": "深沉总裁", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_shenchenzongcai_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_shenchenzongcai_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XiaoHouYe", + "alias": "小侯爷", + "usedname": "小侯爷", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_xiaohouye_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_xiaohouye_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuGaoGongZi", + "alias": "孤高公子", + "usedname": "孤高公子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_gugaogongzi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_gugaogongzi_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhangJianJunZi", + "alias": "仗剑君子", + "usedname": "仗剑君子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_zhangjianjunzi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_zhangjianjunzi_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRunXueZhe", + "alias": "温润学者", + "usedname": "温润学者", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_wenrunxuezhe_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_wenrunxuezhe_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QinQieQingNian", + "alias": "亲切青年", + "usedname": "亲切青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_qinqieqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_qinqieqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouXueZhang", + "alias": "温柔学长", + "usedname": "温柔学长", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_wenrouxuezhang_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_wenrouxuezhang_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CiXingNanSang", + "alias": "磁性男嗓", + "usedname": "磁性男嗓", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_cixingnansang_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_cixingnansang_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GaoLengZongCai", + "alias": "高冷总裁", + "usedname": "高冷总裁", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_gaolengzongcai_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_gaolengzongcai_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengJunGaoZhi", + "alias": "冷峻高智", + "usedname": "冷峻高智", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lengjungaozhi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_lengjungaozhi_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChanRuoShaoYe", + "alias": "孱弱少爷", + "usedname": "孱弱少爷", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_chanruoshaoye_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_chanruoshaoye_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZiXinQingNian", + "alias": "自信青年", + "usedname": "自信青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_zixinqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_zixinqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingSeQingNian", + "alias": "青涩青年", + "usedname": "青涩青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_qingseqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_qingseqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XueBaTongZhuo", + "alias": "学霸同桌", + "usedname": "学霸同桌", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_xuebatongzhuo_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_xuebatongzhuo_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengAoZongCai", + "alias": "冷傲总裁", + "usedname": "冷傲总裁", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lengaozongcai_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_lengaozongcai_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BaDaoShaoYe", + "alias": "霸道少爷", + "usedname": "霸道少爷", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_badaoshaoye_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_badaoshaoye_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YuanQiShaoNian", + "alias": "元气少年", + "usedname": "元气少年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_yuanqishaonian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_yuanqishaonian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SaTuoQingNian", + "alias": "洒脱青年", + "usedname": "洒脱青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_satuoqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_satuoqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhiShuaiQingNian", + "alias": "直率青年", + "usedname": "直率青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_zhishuaiqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_zhishuaiqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SiWenQingNian", + "alias": "斯文青年", + "usedname": "斯文青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_siwenqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_siwenqingnian_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChengShuZongCai", + "alias": "成熟总裁", + "usedname": "成熟总裁", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_chengshuzongcai_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_chengshuzongcai_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JunYiGongZi", + "alias": "俊逸公子", + "usedname": "俊逸公子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_junyigongzi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_junyigongzi_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AoJiaoGongZi", + "alias": "傲娇公子", + "usedname": "傲娇公子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_aojiaogongzi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_aojiaogongzi_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhangJianXiaKe", + "alias": "仗剑侠客", + "usedname": "仗剑侠客", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_zhangjianxiake_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_zhangjianxiake_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JiJiaZhiNeng", + "alias": "机甲智能", + "usedname": "机甲智能", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_jijiaozhineng_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/ICL_zh_male_jijiaozhineng_tob.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShuangKuaiSiSi", + "alias": "爽快思思(多情感)", + "usedname": "爽快思思", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_shuangkuaisisi_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/爽快思思.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenNuanAHu", + "alias": "温暖阿虎", + "usedname": "温暖阿虎", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_wennuanahu_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/温暖阿虎.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LinJiaNvHai", + "alias": "邻家女孩", + "usedname": "邻家女孩", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_linjianvhai_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/邻家女孩.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShaoNianZiXin", + "alias": "少年梓辛", + "usedname": "少年梓辛", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_shaonianzixin_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/少年梓辛.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YuanBoXiaoShu", + "alias": "渊博小叔", + "usedname": "渊博小叔", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_yuanboxiaoshu_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/渊博小叔.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YangGuangQingNian", + "alias": "阳光青年(多情感)", + "usedname": "阳光青年", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_yangguangqingnian_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/阳光青年.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WanWanXiaoHe", + "alias": "湾湾小何", + "usedname": "湾湾小何", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_wanwanxiaohe_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/湾湾小何.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WanQuDaShu", + "alias": "湾区大叔", + "usedname": "湾区大叔", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_female_wanqudashu_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/湾区大叔.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "DaiMengChuanMei", + "alias": "呆萌川妹", + "usedname": "呆萌川妹", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_daimengchuanmei_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/呆萌川妹.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BeiJingXiaoYe", + "alias": "北京小爷(多情感)", + "usedname": "北京小爷", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_beijingxiaoye_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/北京小爷.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HaoYuXiaoGe", + "alias": "浩宇小哥", + "usedname": "浩宇小哥", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_haoyuxiaoge_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/浩宇小哥.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuangXiYuanZhou", + "alias": "广西远舟", + "usedname": "广西远舟", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_guangxiyuanzhou_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/广西远舟.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MeiTuoJieEr", + "alias": "妹坨洁儿", + "usedname": "妹坨洁儿", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_meituojieer_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/妹坨洁儿.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YuZhouZiXuan", + "alias": "豫州子轩", + "usedname": "豫州子轩", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_yuzhouzixuan_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/豫州子轩.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MeiLiNvYou", + "alias": "魅力女友(多情感)", + "usedname": "魅力女友", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_meilinvyou_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/魅力女友.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShenYeBoKe", + "alias": "深夜播客", + "usedname": "深夜播客", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_shenyeboke_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/深夜播客.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RouMeiNvYou", + "alias": "柔美女友(多情感)", + "usedname": "柔美女友", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_roumeinvyou_emo_v2_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/柔美女友.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SaJiaoXueMei", + "alias": "撒娇学妹", + "usedname": "撒娇学妹", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_yuanqinvyou_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/撒娇学妹.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Harmony", + "alias": "Harmony", + "usedname": "Harmony", + "gender": "Male", + "locale": "en", + "code": "zh_male_jingqiangkanye_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Harmony.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Skye", + "alias": "Skye", + "usedname": "Skye", + "gender": "Female", + "locale": "en", + "code": "zh_female_shuangkuaisisi_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Skye.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Alvin", + "alias": "Alvin", + "usedname": "Alvin", + "gender": "Male", + "locale": "en", + "code": "zh_male_wennuanahu_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Alvin.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Brayan", + "alias": "Brayan", + "usedname": "Brayan", + "gender": "Male", + "locale": "en", + "code": "zh_male_shaonianzixin_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Brayan.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KazuneHeYin", + "alias": "かずね(和音)", + "usedname": "かずね(和音)", + "gender": "Male", + "locale": "zh-CN", + "code": "multi_male_jingqiangkanye_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/和音.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HarukoQingZi", + "alias": "はるこ(晴子)", + "usedname": "はるこ(晴子)", + "gender": "Female", + "locale": "zh-CN", + "code": "multi_female_shuangkuaisisi_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/晴子.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AkemiZhuMei", + "alias": "あけみ(朱美)", + "usedname": "あけみ(朱美)", + "gender": "Female", + "locale": "zh-CN", + "code": "multi_female_gaolengyujie_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/朱美.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HiroshiGuangZhi", + "alias": "ひろし(広志)", + "usedname": "ひろし(広志)", + "gender": "Male", + "locale": "zh-CN", + "code": "multi_male_wanqudashu_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/広志.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JavierorAlvaro", + "alias": "Javier or Álvaro", + "usedname": "Javier or Álvaro", + "gender": "Male", + "locale": "en", + "code": "multi_male_jingqiangkanye_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Javier.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Esmeralda", + "alias": "Esmeralda", + "usedname": "Esmeralda", + "gender": "Female", + "locale": "en", + "code": "multi_female_shuangkuaisisi_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Esmeralda.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Roberto", + "alias": "Roberto", + "usedname": "Roberto", + "gender": "Male", + "locale": "en", + "code": "multi_male_wanqudashu_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/Roberto.wav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingRuoShaoNv", + "alias": "病弱少女", + "usedname": "病弱少女", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_bingruoshaonv_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/病弱少女.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HuoPoNvHai", + "alias": "活泼女孩", + "usedname": "活泼女孩", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_huoponvhai_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/活泼女孩.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HeAiNaiNai", + "alias": "和蔼奶奶", + "usedname": "和蔼奶奶", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_heainainai_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/和蔼奶奶.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouXiaoYa", + "alias": "温柔小雅", + "usedname": "温柔小雅", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_wenrouxiaoya_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/温柔小雅.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TianMeiXiaoYuan", + "alias": "甜美小源", + "usedname": "甜美小源", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_tianmeixiaoyuan_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/甜美小源.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingCheZiZi", + "alias": "清澈梓梓", + "usedname": "清澈梓梓", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_qingchezizi_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/清澈梓梓.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "DongFangHaoRan", + "alias": "东方浩然", + "usedname": "东方浩然", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_dongfanghaoran_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/东方浩然.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JieShuoXiaoMing", + "alias": "解说小明", + "usedname": "解说小明", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_jieshuoxiaoming_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/解说小明.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KaiLangJieJie", + "alias": "开朗姐姐", + "usedname": "开朗姐姐", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_kailangjiejie_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/开朗姐姐.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LinJiaNanHai", + "alias": "邻家男孩", + "usedname": "邻家男孩", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_linjiananhai_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/邻家男孩.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TianMeiYueYue", + "alias": "甜美悦悦", + "usedname": "甜美悦悦", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_tianmeiyueyue_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/甜美悦悦.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XinLingJiTang", + "alias": "心灵鸡汤", + "usedname": "心灵鸡汤", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_xinlingjitang_moon_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/心灵鸡汤.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CanCan", + "alias": "灿灿", + "usedname": "灿灿", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_cancan_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_cancan_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TianCaiTongSheng", + "alias": "天才童声", + "usedname": "天才童声", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_tiancaitongsheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_tiancaitongsheng_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NaiQiMengWa", + "alias": "奶气萌娃", + "usedname": "奶气萌娃", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_naiqimengwa_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_naiqimengwa_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HouGe", + "alias": "猴哥", + "usedname": "猴哥", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_sunwukong_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_sunwukong_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XiongEr", + "alias": "熊二", + "usedname": "熊二", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_xionger_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_xionger_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "PeiQiZhu", + "alias": "佩奇猪", + "usedname": "佩奇猪", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_peiqi_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_peiqi_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhiXingNvSheng", + "alias": "知性女声", + "usedname": "知性女声", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_zhixingnvsheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_zhixingnvsheng_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingXinNvSheng", + "alias": "清新女声", + "usedname": "清新女声", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_qingxinnvsheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_qingxinnvsheng_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XuanYiJieShuo", + "alias": "悬疑解说", + "usedname": "悬疑解说", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_changtianyi_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_changtianyi_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "PoPo", + "alias": "婆婆", + "usedname": "婆婆", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_popo_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_popo_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WuZeTian", + "alias": "武则天", + "usedname": "武则天", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_wuzetian_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_wuzetian_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShaoErGuShi", + "alias": "少儿故事", + "usedname": "少儿故事", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_shaoergushi_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_shaoergushi_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SiLang", + "alias": "四郎", + "usedname": "四郎", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_silang_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_silang_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuJie", + "alias": "顾姐", + "usedname": "顾姐", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_gujie_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_gujie_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YingTaoWanZi", + "alias": "樱桃丸子", + "usedname": "樱桃丸子", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_yingtaowanzi_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_yingtaowanzi_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CiXingJieShuoNanSheng", + "alias": "磁性解说男声", + "usedname": "磁性解说男声", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_jieshuonansheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_jieshuonansheng_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JiTangMeiMei", + "alias": "鸡汤妹妹", + "usedname": "鸡汤妹妹", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_jitangmeimei_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_jitangmeimei_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuangGaoJieShuo", + "alias": "广告解说", + "usedname": "广告解说", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_chunhui_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_chunhui_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingShuangNanDa", + "alias": "清爽男大", + "usedname": "清爽男大", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_qingshuangnanda_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_qingshuangnanda_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TieXinNvSheng", + "alias": "贴心女声", + "usedname": "贴心女声", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_tiexinnvsheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_tiexinnvsheng_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QiaoPiNvSheng", + "alias": "俏皮女声", + "usedname": "俏皮女声", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_qiaopinvsheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_qiaopinvsheng_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MengYaTou", + "alias": "萌丫头", + "usedname": "萌丫头", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_mengyatou_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_mengyatou_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RuYaQingNian", + "alias": "儒雅青年", + "usedname": "儒雅青年", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_ruyaqingnian_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_ruyaqingnian_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BaQiQingShu", + "alias": "霸气青叔", + "usedname": "霸气青叔", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_baqiqingshu_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_baqiqingshu_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingCang", + "alias": "擎苍", + "usedname": "擎苍", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_qingcang_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_qingcang_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HuoLiXiaoGe", + "alias": "活力小哥", + "usedname": "活力小哥", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_yangguangqingnian_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_yangguangqingnian_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuFengShaoYu", + "alias": "古风少御", + "usedname": "古风少御", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_gufengshaoyu_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_gufengshaoyu_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouShuNv", + "alias": "温柔淑女", + "usedname": "温柔淑女", + "gender": "Female", + "locale": "zh-CN", + "code": "zh_female_wenroushunv_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_female_wenroushunv_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Shiny", + "alias": "Shiny", + "usedname": "Shiny", + "gender": "Female", + "locale": "en", + "code": "zh_female_cancan_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/shiny.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Morgan", + "alias": "Morgan", + "usedname": "Morgan", + "gender": "Male", + "locale": "en", + "code": "zh_male_jieshuonansheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/Morgan.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Hope", + "alias": "Hope", + "usedname": "Hope", + "gender": "Female", + "locale": "en", + "code": "zh_female_jitangmeimei_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/Hope.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Candy", + "alias": "Candy", + "usedname": "Candy", + "gender": "Female", + "locale": "en", + "code": "zh_female_tiexinnvsheng_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/Candy.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Cutey", + "alias": "Cutey", + "usedname": "Cutey", + "gender": "Female", + "locale": "en", + "code": "zh_female_mengyatou_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/Cutey.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LvChaXiaoGe", + "alias": "绿茶小哥", + "usedname": "绿茶小哥", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lvchaxiaoge_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_lvchaxiaoge_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhiXingWenWan", + "alias": "知性温婉", + "usedname": "知性温婉", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_zhixingwenwan_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_zhixingwenwan_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JiaoRuoLuoLi", + "alias": "娇弱萝莉", + "usedname": "娇弱萝莉", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_jiaoruoluoli_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_jiaoruoluoli_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengDanShuLi", + "alias": "冷淡疏离", + "usedname": "冷淡疏离", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lengdanshuli_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_lengdanshuli_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NuanXinTiTie", + "alias": "暖心体贴", + "usedname": "暖心体贴", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_nuanxintitie_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_nuanxintitie_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HanHouDunShi", + "alias": "憨厚敦实", + "usedname": "憨厚敦实", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_hanhoudunshi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_hanhoudunshi_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouWenYa", + "alias": "温柔文雅", + "usedname": "温柔文雅", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_wenrouwenya_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_wenrouwenya_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AoQiLingRen", + "alias": "傲气凌人", + "usedname": "傲气凌人", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_aiqilingren_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_aiqilingren_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KaiLangQingKuai", + "alias": "开朗轻快", + "usedname": "开朗轻快", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_kailangqingkuai_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_kailangqingkuai_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HuoPoDiaoMan", + "alias": "活泼刁蛮", + "usedname": "活泼刁蛮", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_huopodiaoman_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_huopodiaoman_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuZhiBingJiao", + "alias": "固执病娇", + "usedname": "固执病娇", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_guzhibingjiao_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_guzhibingjiao_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HuoPoShuangLang", + "alias": "活泼爽朗", + "usedname": "活泼爽朗", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_huoposhuanglang_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_huoposhuanglang_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SaJiaoNianRen", + "alias": "撒娇粘人", + "usedname": "撒娇粘人", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_sajiaonianren_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_sajiaonianren_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AoManJiaoSheng", + "alias": "傲慢娇声", + "usedname": "傲慢娇声", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_aomanjiaosheng_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_aomanjiaosheng_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XiaoSaSuiXing", + "alias": "潇洒随性", + "usedname": "潇洒随性", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_xiaosasuixing_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_xiaosasuixing_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "FuHeiGongZi", + "alias": "腹黑公子", + "usedname": "腹黑公子", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_fuheigongzi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_fuheigongzi_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuiYiShenMi", + "alias": "诡异神秘", + "usedname": "诡异神秘", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_guiyishenmi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_guiyishenmi_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RuYaCaiJun", + "alias": "儒雅才俊", + "usedname": "儒雅才俊", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_ruyacaijun_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_ruyacaijun_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingJiaoBaiLian", + "alias": "病娇白莲", + "usedname": "病娇白莲", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_bingjiaobailian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_bingjiaobailian_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhengZhiQingNian", + "alias": "正直青年", + "usedname": "正直青年", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_zhengzhiqingnian_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_zhengzhiqingnian_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShuaiZhenXiaoHuo", + "alias": "率真小伙", + "usedname": "率真小伙", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_shuaizhenxiaohuo_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_shuaizhenxiaohuo_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JiaoHanNvWang", + "alias": "娇憨女王", + "usedname": "娇憨女王", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_jiaohannvwang_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_jiaohannvwang_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingJiaoMengMei", + "alias": "病娇萌妹", + "usedname": "病娇萌妹", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_bingjiaomengmei_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_bingjiaomengmei_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingSeXiaoSheng", + "alias": "青涩小生", + "usedname": "青涩小生", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_qingsenaigou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_qingsenaigou_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChunZhenXueDi", + "alias": "纯真学弟", + "usedname": "纯真学弟", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_chunzhenxuedi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_chunzhenxuedi_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NuanXinXueJie", + "alias": "暖心学姐", + "usedname": "暖心学姐", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_nuanxinxuejie_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_nuanxinxuejie_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KeAiNvSheng", + "alias": "可爱女生", + "usedname": "可爱女生", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_keainvsheng_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_keainvsheng_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChengShuJieJie", + "alias": "成熟姐姐", + "usedname": "成熟姐姐", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_chengshujiejie_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_chengshujiejie_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingJiaoJieJie", + "alias": "病娇姐姐", + "usedname": "病娇姐姐", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_bingjiaojiejie_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_bingjiaojiejie_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YouRouBangZhu", + "alias": "优柔帮主", + "usedname": "优柔帮主", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_youroubangzhu_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_youroubangzhu_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WuMeiYuJie", + "alias": "妩媚御姐", + "usedname": "妩媚御姐", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_wumeiyujie_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_wumeiyujie_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TiaoPiGongZhu", + "alias": "调皮公主", + "usedname": "调皮公主", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_tiaopigongzhu_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_tiaopigongzhu_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AoJiaoNvYou", + "alias": "傲娇女友", + "usedname": "傲娇女友", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_aojiaonvyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_aojiaonvyou_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TieXinNanYou", + "alias": "贴心男友", + "usedname": "贴心男友", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_tiexinnanyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_tiexinnanyou_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShaoNianJiangJun", + "alias": "少年将军", + "usedname": "少年将军", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_shaonianjiangjun_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_shaonianjiangjun_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TieXinNvYou", + "alias": "贴心女友", + "usedname": "贴心女友", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_tiexinnvyou_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_tiexinnvyou_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingJiaoGeGe", + "alias": "病娇哥哥", + "usedname": "病娇哥哥", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_bingjiaogege_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_bingjiaogege_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XueBaNanTongZhuo", + "alias": "学霸男同桌", + "usedname": "学霸男同桌", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_xuebanantongzhuo_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_xuebanantongzhuo_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YouMoShuShu", + "alias": "幽默叔叔", + "usedname": "幽默叔叔", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_youmoshushu_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_youmoshushu_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XingGanYuJie", + "alias": "性感御姐", + "usedname": "性感御姐", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_xingganyujie_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_xingganyujie_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JiaXiaoZi", + "alias": "假小子", + "usedname": "假小子", + "gender": "Female", + "locale": "zh-CN", + "code": "ICL_zh_female_jiaxiaozi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_female_jiaxiaozi_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LengJunShangSi", + "alias": "冷峻上司", + "usedname": "冷峻上司", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_lengjunshangsi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_lengjunshangsi_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouNanTongZhuo", + "alias": "温柔男同桌", + "usedname": "温柔男同桌", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_wenrounantongzhuo_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_wenrounantongzhuo_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BingJiaoDiDi", + "alias": "病娇弟弟", + "usedname": "病娇弟弟", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_bingjiaodidi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_bingjiaodidi_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YouMoDaYe", + "alias": "幽默大爷", + "usedname": "幽默大爷", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_youmodaye_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_youmodaye_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AoManShaoYe", + "alias": "傲慢少爷", + "usedname": "傲慢少爷", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_aomanshaoye_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_aomanshaoye_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShenMiFaShi", + "alias": "神秘法师", + "usedname": "神秘法师", + "gender": "Male", + "locale": "zh-CN", + "code": "ICL_zh_male_shenmifashi_tob", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/ICL_zh_male_shenmifashi_tob.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LanYinMianBao", + "alias": "懒音绵宝", + "usedname": "懒音绵宝", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_lanxiaoyang_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_lanxiaoyang_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "FanJuanQingNian", + "alias": "反卷青年", + "usedname": "反卷青年", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_fanjuanqingnian_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_fanjuanqingnian_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LiangSangMengZai", + "alias": "亮嗓萌仔", + "usedname": "亮嗓萌仔", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_dongmanhaimian_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_dongmanhaimian_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WenRouXiaoGe", + "alias": "温柔小哥", + "usedname": "温柔小哥", + "gender": "Male", + "locale": "zh-CN", + "code": "zh_male_wenrouxiaoge_mars_bigtts", + "audio": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/console/bigtts/zh_male_wenrouxiaoge_mars_bigtts.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + } + ], + "podUsers": [ + { + "code": "zh_male_beijingxiaoye_emo_v2_mars_bigtts", + "role": "北京爷们" + }, + { + "code": "zh_female_meilinvyou_emo_v2_mars_bigtts", + "role": "魅力女神" + } + ], + "turnPattern": "random", + "tts_max_retries": 3, + "apiUrl": "https://openspeech.bytedance.com/api/v3/tts/unidirectional", + "headers": { + "X-Api-App-Id": "{{X-Api-App-Id}}", + "X-Api-Access-Key": "{{X-Api-Access-Key}}", + "X-Api-Resource-Id": "volc.service_type.10029", + "Content-Type": "application/json", + "Connection": "keep-alive" + }, + "request_payload": { + "user": { + "uid": "mTHRfpfDv0Q8H4c9YKIH" + }, + "req_params": { + "model": "seed-tts-1.1", + "text": "{{test_text}}", + "speaker": "{{voice_code}}", + "audio_params": { + "format": "mp3", + "sample_rate": 24000, + "enable_timestamp": true, + "emotion_scale": 5, + "speech_rate": 0, + "loudness_rate": 0 + }, + "additions": "{\"explicit_language\":\"zh\",\"disable_emoji_filter\":\"true\",\"disable_markdown_filter\":true, \"enable_timestamp\":true}\"}" + } + } +} \ No newline at end of file diff --git a/config/edge-tts.json b/config/edge-tts.json index 3c6b62b..46cf92e 100644 --- a/config/edge-tts.json +++ b/config/edge-tts.json @@ -1,443 +1,2241 @@ { "voices": [ - { - "name": "Xiaoxiao", - "alias": "晓晓", - "code": "zh-CN-XiaoxiaoNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓晓" - }, - { - "name": "Yunxi", - "alias": "云希", - "code": "zh-CN-YunxiNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云希" - }, - { - "name": "Yunjian", - "alias": "云健", - "code": "zh-CN-YunjianNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云健" - }, - { - "name": "Xiaoyi", - "alias": "晓伊", - "code": "zh-CN-XiaoyiNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓伊" - }, - { - "name": "Yunyang", - "alias": "云扬", - "code": "zh-CN-YunyangNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云扬" - }, - { - "name": "Xiaochen", - "alias": "晓辰", - "code": "zh-CN-XiaochenNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓辰" - }, - { - "name": "Xiaochen Multilingual", - "alias": "晓辰 多语言", - "code": "zh-CN-XiaochenMultilingualNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓辰" - }, - { - "name": "Xiaohan", - "alias": "晓涵", - "code": "zh-CN-XiaohanNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓涵" - }, - { - "name": "Xiaomeng", - "alias": "晓梦", - "code": "zh-CN-XiaomengNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓梦" - }, - { - "name": "Xiaomo", - "alias": "晓墨", - "code": "zh-CN-XiaomoNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓墨" - }, - { - "name": "Xiaoqiu", - "alias": "晓秋", - "code": "zh-CN-XiaoqiuNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓秋" - }, - { - "name": "Xiaorou", - "alias": "晓柔", - "code": "zh-CN-XiaorouNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓柔" - }, - { - "name": "Xiaorui", - "alias": "晓睿", - "code": "zh-CN-XiaoruiNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓睿" - }, - { - "name": "Xiaoshuang", - "alias": "晓双", - "code": "zh-CN-XiaoshuangNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓双" - }, - { - "name": "Xiaoxiao Dialects", - "alias": "晓晓 方言", - "code": "zh-CN-XiaoxiaoDialectsNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓晓" - }, - { - "name": "Xiaoxiao Multilingual", - "alias": "晓晓 多语言", - "code": "zh-CN-XiaoxiaoMultilingualNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓晓" - }, - { - "name": "Xiaoyan", - "alias": "晓颜", - "code": "zh-CN-XiaoyanNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓颜" - }, - { - "name": "Xiaoyou", - "alias": "晓悠", - "code": "zh-CN-XiaoyouNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓悠" - }, - { - "name": "Xiaoyu Multilingual", - "alias": "晓宇 多语言", - "code": "zh-CN-XiaoyuMultilingualNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓宇" - }, - { - "name": "Xiaozhen", - "alias": "晓甄", - "code": "zh-CN-XiaozhenNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓甄" - }, - { - "name": "Yunfeng", - "alias": "云枫", - "code": "zh-CN-YunfengNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云枫" - }, - { - "name": "Yunhao", - "alias": "云皓", - "code": "zh-CN-YunhaoNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云皓" - }, - { - "name": "Yunjie", - "alias": "云杰", - "code": "zh-CN-YunjieNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云杰" - }, - { - "name": "Yunxia", - "alias": "云夏", - "code": "zh-CN-YunxiaNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云夏" - }, - { - "name": "Yunxiao Multilingual", - "alias": "云晓 多语言", - "code": "zh-CN-YunxiaoMultilingualNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云晓" - }, - { - "name": "Yunye", - "alias": "云野", - "code": "zh-CN-YunyeNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云野" - }, - { - "name": "Yunyi Multilingual", - "alias": "云逸 多语言", - "code": "zh-CN-YunyiMultilingualNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云逸" - }, - { - "name": "Yunze", - "alias": "云泽", - "code": "zh-CN-YunzeNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云泽" - }, - { - "name": "Xiaochen", - "alias": "小陈", - "code": "zh-CN-Xiaochen:DragonHDFlashLatestNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "小陈" - }, - { - "name": "Xiaoxiao", - "alias": "晓晓", - "code": "zh-CN-Xiaoxiao:DragonHDFlashLatestNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓晓" - }, - { - "name": "Xiaoxiao2", - "alias": "晓晓2", - "code": "zh-CN-Xiaoxiao2:DragonHDFlashLatestNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "晓晓2" - }, - { - "name": "Yunfan Multilingual", - "alias": "云帆 多语言", - "code": "zh-CN-YunfanMultilingualNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云帆" - }, - { - "name": "Yunxiao", - "alias": "云晓", - "code": "zh-CN-Yunxiao:DragonHDFlashLatestNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云晓" - }, - { - "name": "Yunye", - "alias": "云野", - "code": "zh-CN-Yunye:DragonHDFlashLatestNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云野" - }, - { - "name": "Yunyi", - "alias": "云逸", - "code": "zh-CN-Yunyi:DragonHDFlashLatestNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云逸" - }, - { - "name": "Xiaochen", - "alias": "小陈", - "code": "zh-CN-Xiaochen:DragonHDLatestNeural", - "locale": "zh-CN", - "gender": "Female", - "usedname": "小陈" - }, - { - "name": "Yunfan Dragon HD Latest", - "alias": "云帆", - "code": "zh-CN-Yunfan:DragonHDLatestNeural", - "locale": "zh-CN", - "gender": "Male", - "usedname": "云帆" - }, - { - "name": "Yunqi", - "alias": "云奇 广西", - "code": "zh-CN-guangxi-YunqiNeural", - "locale": "zh-CN-guangxi", - "gender": "Male", - "usedname": "云奇" - }, - { - "name": "Yundeng", - "alias": "云登", - "code": "zh-CN-henan-YundengNeural", - "locale": "zh-CN-henan", - "gender": "Male", - "usedname": "云登" - }, - { - "name": "Xiaobei", - "alias": "晓北 辽宁", - "code": "zh-CN-liaoning-XiaobeiNeural", - "locale": "zh-CN-liaoning", - "gender": "Female", - "usedname": "晓北" - }, - { - "name": "Yunbiao", - "alias": "云彪 辽宁", - "code": "zh-CN-liaoning-YunbiaoNeural", - "locale": "zh-CN-liaoning", - "gender": "Male", - "usedname": "云彪" - }, - { - "name": "Xiaoni", - "alias": "晓妮", - "code": "zh-CN-shaanxi-XiaoniNeural", - "locale": "zh-CN-shaanxi", - "gender": "Female", - "usedname": "晓妮" - }, - { - "name": "Yunxiang", - "alias": "云翔", - "code": "zh-CN-shandong-YunxiangNeural", - "locale": "zh-CN-shandong", - "gender": "Male", - "usedname": "云翔" - }, - { - "name": "Yunxi", - "alias": "云希 四川", - "code": "zh-CN-sichuan-YunxiNeural", - "locale": "zh-CN-sichuan", - "gender": "Male", - "usedname": "云希" - }, - { - "name": "HiuMaan", - "alias": "曉曼", - "code": "zh-HK-HiuMaanNeural", - "locale": "zh-HK", - "gender": "Female", - "usedname": "曉曼" - }, - { - "name": "WanLung", - "alias": "雲龍", - "code": "zh-HK-WanLungNeural", - "locale": "zh-HK", - "gender": "Male", - "usedname": "雲龍" - }, - { - "name": "HiuGaai", - "alias": "曉佳", - "code": "zh-HK-HiuGaaiNeural", - "locale": "zh-HK", - "gender": "Female", - "usedname": "曉佳" - }, - { - "name": "HsiaoChen", - "alias": "曉臻", - "code": "zh-TW-HsiaoChenNeural", - "locale": "zh-TW", - "gender": "Female", - "usedname": "曉臻" - }, - { - "name": "YunJhe", - "alias": "雲哲", - "code": "zh-TW-YunJheNeural", - "locale": "zh-TW", - "gender": "Male", - "usedname": "雲哲" - }, - { - "name": "HsiaoYu", - "alias": "曉雨", - "code": "zh-TW-HsiaoYuNeural", - "locale": "zh-TW", - "gender": "Female", - "usedname": "曉雨" - }, - { - "name": "Xiaotong", - "alias": "晓彤", - "code": "wuu-CN-XiaotongNeural", - "locale": "wuu-CN", - "gender": "Female", - "usedname": "晓彤" - }, - { - "name": "Yunzhe", - "alias": "云哲", - "code": "wuu-CN-YunzheNeural", - "locale": "wuu-CN", - "gender": "Male", - "usedname": "云哲" - }, - { - "name": "XiaoMin", - "alias": "晓敏", - "code": "yue-CN-XiaoMinNeural", - "locale": "yue-CN", - "gender": "Female", - "usedname": "晓敏" - }, - { - "name": "YunSong", - "alias": "云松", - "code": "yue-CN-YunSongNeural", - "locale": "yue-CN", - "gender": "Male", - "usedname": "云松" - } + { + "name": "Xiaochen", + "alias": "小陈", + "code": "zh-CN-Xiaochen:DragonHDLatestNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "小陈", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YunFan", + "alias": "云帆", + "code": "zh-CN-Yunfan:DragonHDLatestNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云帆", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XiaochenFlash", + "alias": "小陈-flash", + "code": "zh-CN-Xiaochen:DragonHDFlashLatestNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "小陈", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XiaoxiaoFlash", + "alias": "小晓-flash", + "code": "zh-CN-Xiaoxiao:DragonHDFlashLatestNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "小晓", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoxiao2Flash", + "alias": "小晓2-flash", + "code": "zh-CN-Xiaoxiao2:DragonHDFlashLatestNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "小晓2", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YunxiaoFlash", + "alias": "云晓-flash", + "code": "zh-CN-Yunxiao:DragonHDFlashLatestNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云晓", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YunyeFlash", + "alias": "云叶-flash", + "code": "zh-CN-Yunye:DragonHDFlashLatestNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云叶", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YunyiFlash", + "alias": "云翼-flash", + "code": "zh-CN-Yunyi:DragonHDFlashLatestNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云翼", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HiuGaai", + "alias": "曉佳", + "code": "zh-HK-HiuGaaiNeural", + "locale": "zh-HK", + "gender": "Female", + "usedname": "曉佳", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HiuMaan", + "alias": "曉曼", + "code": "zh-HK-HiuMaanNeural", + "locale": "zh-HK", + "gender": "Female", + "usedname": "曉曼", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HsiaoChen", + "alias": "曉臻", + "code": "zh-TW-HsiaoChenNeural", + "locale": "zh-TW", + "gender": "Female", + "usedname": "曉臻", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HsiaoYu", + "alias": "曉雨", + "code": "zh-TW-HsiaoYuNeural", + "locale": "zh-TW", + "gender": "Female", + "usedname": "曉雨", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WanLung", + "alias": "雲龍", + "code": "zh-HK-WanLungNeural", + "locale": "zh-HK", + "gender": "Male", + "usedname": "雲龍", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaobei", + "alias": "晓北 辽宁", + "code": "zh-CN-liaoning-XiaobeiNeural", + "locale": "zh-CN-liaoning", + "gender": "Female", + "usedname": "晓北", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaochen", + "alias": "晓辰", + "code": "zh-CN-XiaochenNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓辰", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaochen Multilingual", + "alias": "晓辰 多语言", + "code": "zh-CN-XiaochenMultilingualNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓辰", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaohan", + "alias": "晓涵", + "code": "zh-CN-XiaohanNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓涵", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XiaoMin", + "alias": "晓敏", + "code": "yue-CN-XiaoMinNeural", + "locale": "yue-CN", + "gender": "Female", + "usedname": "晓敏", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaomeng", + "alias": "晓梦", + "code": "zh-CN-XiaomengNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓梦", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaomo", + "alias": "晓墨", + "code": "zh-CN-XiaomoNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓墨", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoni", + "alias": "晓妮", + "code": "zh-CN-shaanxi-XiaoniNeural", + "locale": "zh-CN-shaanxi", + "gender": "Female", + "usedname": "晓妮", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoqiu", + "alias": "晓秋", + "code": "zh-CN-XiaoqiuNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓秋", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaorou", + "alias": "晓柔", + "code": "zh-CN-XiaorouNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓柔", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaorui", + "alias": "晓睿", + "code": "zh-CN-XiaoruiNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓睿", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoshuang", + "alias": "晓双", + "code": "zh-CN-XiaoshuangNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓双", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaotong", + "alias": "晓彤", + "code": "wuu-CN-XiaotongNeural", + "locale": "wuu-CN", + "gender": "Female", + "usedname": "晓彤", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoxiao", + "alias": "晓晓", + "code": "zh-CN-XiaoxiaoNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓晓", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoxiao Dialects", + "alias": "晓晓 方言", + "code": "zh-CN-XiaoxiaoDialectsNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓晓", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoxiao Multilingual", + "alias": "晓晓 多语言", + "code": "zh-CN-XiaoxiaoMultilingualNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓晓", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoyan", + "alias": "晓颜", + "code": "zh-CN-XiaoyanNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓颜", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoyi", + "alias": "晓伊", + "code": "zh-CN-XiaoyiNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓伊", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoyou", + "alias": "晓悠", + "code": "zh-CN-XiaoyouNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓悠", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaoyu Multilingual", + "alias": "晓宇 多语言", + "code": "zh-CN-XiaoyuMultilingualNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓宇", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Xiaozhen", + "alias": "晓甄", + "code": "zh-CN-XiaozhenNeural", + "locale": "zh-CN", + "gender": "Female", + "usedname": "晓甄", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunbiao", + "alias": "云彪 辽宁", + "code": "zh-CN-liaoning-YunbiaoNeural", + "locale": "zh-CN-liaoning", + "gender": "Male", + "usedname": "云彪", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yundeng", + "alias": "云登", + "code": "zh-CN-henan-YundengNeural", + "locale": "zh-CN-henan", + "gender": "Male", + "usedname": "云登", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunfan Multilingual", + "alias": "Yunfan Multilingual", + "code": "zh-CN-YunfanMultilingualNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "Yunfan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunfeng", + "alias": "云枫", + "code": "zh-CN-YunfengNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云枫", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunhao", + "alias": "云皓", + "code": "zh-CN-YunhaoNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云皓", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunjian", + "alias": "云健", + "code": "zh-CN-YunjianNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云健", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunjie", + "alias": "云杰", + "code": "zh-CN-YunjieNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云杰", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YunJhe", + "alias": "雲哲", + "code": "zh-TW-YunJheNeural", + "locale": "zh-TW", + "gender": "Male", + "usedname": "雲哲", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunqi", + "alias": "云奇 广西", + "code": "zh-CN-guangxi-YunqiNeural", + "locale": "zh-CN-guangxi", + "gender": "Male", + "usedname": "云奇", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YunSong", + "alias": "云松", + "code": "yue-CN-YunSongNeural", + "locale": "yue-CN", + "gender": "Male", + "usedname": "云松", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunxia", + "alias": "云夏", + "code": "zh-CN-YunxiaNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云夏", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunxiang", + "alias": "云翔", + "code": "zh-CN-shandong-YunxiangNeural", + "locale": "zh-CN-shandong", + "gender": "Male", + "usedname": "云翔", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunxiao Multilingual", + "alias": "Yunxiao Multilingual", + "code": "zh-CN-YunxiaoMultilingualNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "Yunxiao", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunxi", + "alias": "云希", + "code": "zh-CN-YunxiNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云希", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunxi", + "alias": "云希 四川", + "code": "zh-CN-sichuan-YunxiNeural", + "locale": "zh-CN-sichuan", + "gender": "Male", + "usedname": "云希", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunyang", + "alias": "云扬", + "code": "zh-CN-YunyangNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云扬", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunye", + "alias": "云野", + "code": "zh-CN-YunyeNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云野", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunyi Multilingual", + "alias": "云逸 多语言", + "code": "zh-CN-YunyiMultilingualNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云逸", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunzhe", + "alias": "云哲", + "code": "wuu-CN-YunzheNeural", + "locale": "wuu-CN", + "gender": "Male", + "usedname": "云哲", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yunze", + "alias": "云泽", + "code": "zh-CN-YunzeNeural", + "locale": "zh-CN", + "gender": "Male", + "usedname": "云泽", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Adam Dragon HD Latest", + "alias": "Adam Dragon HD Latest", + "code": "en-US-Adam:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Adam", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Alloy Dragon HD Latest", + "alias": "Alloy Dragon HD Latest", + "code": "en-US-Alloy:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Alloy", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Andrew Dragon HD Latest", + "alias": "Andrew Dragon HD Latest", + "code": "en-US-Andrew:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Andrew", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Andrew2 Dragon HD Latest", + "alias": "Andrew2 Dragon HD Latest", + "code": "en-US-Andrew2:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Andrew2", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Andrew3 Dragon HD Latest", + "alias": "Andrew3 Dragon HD Latest", + "code": "en-US-Andrew3:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Andrew3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Aria Dragon HD Latest", + "alias": "Aria Dragon HD Latest", + "code": "en-US-Aria:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Aria", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ava & Andrew MultiTalker Dragon HD Latest", + "alias": "Ava & Andrew MultiTalker Dragon HD Latest", + "code": "en-US-MultiTalker-Ava-Andrew:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Neutral", + "usedname": "Ava", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ava & Steffan MultiTalker Dragon HD Latest", + "alias": "Ava & Steffan MultiTalker Dragon HD Latest", + "code": "en-US-MultiTalker-Ava-Steffan:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Neutral", + "usedname": "Ava", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ava Dragon HD Latest", + "alias": "Ava Dragon HD Latest", + "code": "en-US-Ava:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Ava", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ava3 Dragon HD Latest", + "alias": "Ava3 Dragon HD Latest", + "code": "en-US-Ava3:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Ava3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Bree Dragon HD Latest", + "alias": "Bree Dragon HD Latest", + "code": "en-US-Bree:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Bree", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Brian Dragon HD Latest", + "alias": "Brian Dragon HD Latest", + "code": "en-US-Brian:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Brian", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Davis Dragon HD Latest", + "alias": "Davis Dragon HD Latest", + "code": "en-US-Davis:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Davis", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Emma Dragon HD Latest", + "alias": "Emma Dragon HD Latest", + "code": "en-US-Emma:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Emma", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Emma2 Dragon HD Latest", + "alias": "Emma2 Dragon HD Latest", + "code": "en-US-Emma2:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Emma2", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Florian Dragon HD Latest", + "alias": "Florian Dragon HD Latest", + "code": "de-DE-Florian:DragonHDLatestNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Florian", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jane Dragon HD Latest", + "alias": "Jane Dragon HD Latest", + "code": "en-US-Jane:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Jane", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jenny Dragon HD Latest", + "alias": "Jenny Dragon HD Latest", + "code": "en-US-Jenny:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Jenny", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Nova Dragon HD Latest", + "alias": "Nova Dragon HD Latest", + "code": "en-US-Nova:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Nova", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Phoebe Dragon HD Latest", + "alias": "Phoebe Dragon HD Latest", + "code": "en-US-Phoebe:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Phoebe", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Seraphina Dragon HD Latest", + "alias": "Seraphina Dragon HD Latest", + "code": "de-DE-Seraphina:DragonHDLatestNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Seraphina", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Serena Dragon HD Latest", + "alias": "Serena Dragon HD Latest", + "code": "en-US-Serena:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Serena", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Steffan Dragon HD Latest", + "alias": "Steffan Dragon HD Latest", + "code": "en-US-Steffan:DragonHDLatestNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Steffan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Aarav", + "alias": "Aarav", + "code": "en-IN-AaravNeural", + "locale": "en-IN", + "gender": "Male", + "usedname": "Aarav", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Aarti", + "alias": "Aarti", + "code": "en-IN-AartiNeural", + "locale": "en-IN", + "gender": "Female", + "usedname": "Aarti", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Aashi", + "alias": "Aashi", + "code": "en-IN-AashiNeural", + "locale": "en-IN", + "gender": "Female", + "usedname": "Aashi", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Abbi", + "alias": "Abbi", + "code": "en-GB-AbbiNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Abbi", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Abeo", + "alias": "Abeo", + "code": "en-NG-AbeoNeural", + "locale": "en-NG", + "gender": "Male", + "usedname": "Abeo", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ada Multilingual", + "alias": "Ada Multilingual", + "code": "en-GB-AdaMultilingualNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Ada", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Adam Multilingual", + "alias": "Adam Multilingual", + "code": "en-US-AdamMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Adam", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AIGenerate1", + "alias": "AIGenerate1", + "code": "en-US-AIGenerate1Neural", + "locale": "en-US", + "gender": "Male", + "usedname": "AIGenerate1", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AIGenerate2", + "alias": "AIGenerate2", + "code": "en-US-AIGenerate2Neural", + "locale": "en-US", + "gender": "Female", + "usedname": "AIGenerate2", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Alfie", + "alias": "Alfie", + "code": "en-GB-AlfieNeural", + "locale": "en-GB", + "gender": "Male", + "usedname": "Alfie", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Alloy Turbo Multilingual", + "alias": "Alloy Turbo Multilingual", + "code": "en-US-AlloyTurboMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Alloy", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Amala", + "alias": "Amala", + "code": "de-DE-AmalaNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Amala", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Amanda Multilingual", + "alias": "Amanda Multilingual", + "code": "en-US-AmandaMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Amanda", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Amber", + "alias": "Amber", + "code": "en-US-AmberNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Amber", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ana", + "alias": "Ana", + "code": "en-US-AnaNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Ana", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ananya", + "alias": "Ananya", + "code": "en-IN-AnanyaNeural", + "locale": "en-IN", + "gender": "Female", + "usedname": "Ananya", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Andrew", + "alias": "Andrew", + "code": "en-US-AndrewNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Andrew", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Andrew Multilingual", + "alias": "Andrew Multilingual", + "code": "en-US-AndrewMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Andrew", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Annette", + "alias": "Annette", + "code": "en-AU-AnnetteNeural", + "locale": "en-AU", + "gender": "Female", + "usedname": "Annette", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Aria", + "alias": "Aria", + "code": "en-US-AriaNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Aria", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Arjun", + "alias": "Arjun", + "code": "en-IN-ArjunNeural", + "locale": "en-IN", + "gender": "Male", + "usedname": "Arjun", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Arjun Indic", + "alias": "Arjun Indic", + "code": "en-IN-ArjunIndicNeural", + "locale": "en-IN", + "gender": "Male", + "usedname": "Arjun", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ash Turbo Multilingual", + "alias": "Ash Turbo Multilingual", + "code": "en-US-AshTurboMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Ash", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ashley", + "alias": "Ashley", + "code": "en-US-AshleyNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Ashley", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Asilia", + "alias": "Asilia", + "code": "en-KE-AsiliaNeural", + "locale": "en-KE", + "gender": "Female", + "usedname": "Asilia", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ava", + "alias": "Ava", + "code": "en-US-AvaNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Ava", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ava Multilingual", + "alias": "Ava Multilingual", + "code": "en-US-AvaMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Ava", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Bella", + "alias": "Bella", + "code": "en-GB-BellaNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Bella", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Bernd", + "alias": "Bernd", + "code": "de-DE-BerndNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Bernd", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Blue", + "alias": "Blue", + "code": "en-US-BlueNeural", + "locale": "en-US", + "gender": "Neutral", + "usedname": "Blue", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Brandon", + "alias": "Brandon", + "code": "en-US-BrandonNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Brandon", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Brandon Multilingual", + "alias": "Brandon Multilingual", + "code": "en-US-BrandonMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Brandon", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Brian", + "alias": "Brian", + "code": "en-US-BrianNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Brian", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Brian Multilingual", + "alias": "Brian Multilingual", + "code": "en-US-BrianMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Brian", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Carly", + "alias": "Carly", + "code": "en-AU-CarlyNeural", + "locale": "en-AU", + "gender": "Female", + "usedname": "Carly", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Chilemba", + "alias": "Chilemba", + "code": "en-KE-ChilembaNeural", + "locale": "en-KE", + "gender": "Male", + "usedname": "Chilemba", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Christoph", + "alias": "Christoph", + "code": "de-DE-ChristophNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Christoph", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Christopher", + "alias": "Christopher", + "code": "en-US-ChristopherNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Christopher", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Christopher Multilingual", + "alias": "Christopher Multilingual", + "code": "en-US-ChristopherMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Christopher", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Clara", + "alias": "Clara", + "code": "en-CA-ClaraNeural", + "locale": "en-CA", + "gender": "Female", + "usedname": "Clara", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Connor", + "alias": "Connor", + "code": "en-IE-ConnorNeural", + "locale": "en-IE", + "gender": "Male", + "usedname": "Connor", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Conrad", + "alias": "Conrad", + "code": "de-DE-ConradNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Conrad", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Cora", + "alias": "Cora", + "code": "en-US-CoraNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Cora", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Cora Multilingual", + "alias": "Cora Multilingual", + "code": "en-US-CoraMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Cora", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Darren", + "alias": "Darren", + "code": "en-AU-DarrenNeural", + "locale": "en-AU", + "gender": "Male", + "usedname": "Darren", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Davis", + "alias": "Davis", + "code": "en-US-DavisNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Davis", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Davis Multilingual", + "alias": "Davis Multilingual", + "code": "en-US-DavisMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Davis", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Derek Multilingual", + "alias": "Derek Multilingual", + "code": "en-US-DerekMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Derek", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Duncan", + "alias": "Duncan", + "code": "en-AU-DuncanNeural", + "locale": "en-AU", + "gender": "Male", + "usedname": "Duncan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Dustin Multilingual", + "alias": "Dustin Multilingual", + "code": "en-US-DustinMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Dustin", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Echo Turbo Multilingual", + "alias": "Echo Turbo Multilingual", + "code": "en-US-EchoTurboMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Echo", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Elimu", + "alias": "Elimu", + "code": "en-TZ-ElimuNeural", + "locale": "en-TZ", + "gender": "Male", + "usedname": "Elimu", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Elizabeth", + "alias": "Elizabeth", + "code": "en-US-ElizabethNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Elizabeth", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Elke", + "alias": "Elke", + "code": "de-DE-ElkeNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Elke", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Elliot", + "alias": "Elliot", + "code": "en-GB-ElliotNeural", + "locale": "en-GB", + "gender": "Male", + "usedname": "Elliot", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Elsie", + "alias": "Elsie", + "code": "en-AU-ElsieNeural", + "locale": "en-AU", + "gender": "Female", + "usedname": "Elsie", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Emily", + "alias": "Emily", + "code": "en-IE-EmilyNeural", + "locale": "en-IE", + "gender": "Female", + "usedname": "Emily", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Emma", + "alias": "Emma", + "code": "en-US-EmmaNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Emma", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Emma Multilingual", + "alias": "Emma Multilingual", + "code": "en-US-EmmaMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Emma", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Eric", + "alias": "Eric", + "code": "en-US-EricNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Eric", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ethan", + "alias": "Ethan", + "code": "en-GB-EthanNeural", + "locale": "en-GB", + "gender": "Male", + "usedname": "Ethan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Evelyn Multilingual", + "alias": "Evelyn Multilingual", + "code": "en-US-EvelynMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Evelyn", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ezinne", + "alias": "Ezinne", + "code": "en-NG-EzinneNeural", + "locale": "en-NG", + "gender": "Female", + "usedname": "Ezinne", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Fable Turbo Multilingual", + "alias": "Fable Turbo Multilingual", + "code": "en-US-FableTurboMultilingualNeural", + "locale": "en-US", + "gender": "Neutral", + "usedname": "Fable", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Florian Multilingual", + "alias": "Florian Mehrsprachig", + "code": "de-DE-FlorianMultilingualNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Florian", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Freya", + "alias": "Freya", + "code": "en-AU-FreyaNeural", + "locale": "en-AU", + "gender": "Female", + "usedname": "Freya", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Gisela", + "alias": "Gisela", + "code": "de-DE-GiselaNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Gisela", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Guy", + "alias": "Guy", + "code": "en-US-GuyNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Guy", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Hollie", + "alias": "Hollie", + "code": "en-GB-HollieNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Hollie", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Imani", + "alias": "Imani", + "code": "en-TZ-ImaniNeural", + "locale": "en-TZ", + "gender": "Female", + "usedname": "Imani", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ingrid", + "alias": "Ingrid", + "code": "de-AT-IngridNeural", + "locale": "de-AT", + "gender": "Female", + "usedname": "Ingrid", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jacob", + "alias": "Jacob", + "code": "en-US-JacobNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Jacob", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "James", + "alias": "James", + "code": "en-PH-JamesNeural", + "locale": "en-PH", + "gender": "Male", + "usedname": "James", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jan", + "alias": "Jan", + "code": "de-CH-JanNeural", + "locale": "de-CH", + "gender": "Male", + "usedname": "Jan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jane", + "alias": "Jane", + "code": "en-US-JaneNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Jane", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jason", + "alias": "Jason", + "code": "en-US-JasonNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Jason", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jenny", + "alias": "Jenny", + "code": "en-US-JennyNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Jenny", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jenny Multilingual", + "alias": "Jenny Multilingual", + "code": "en-US-JennyMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Jenny", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Joanne", + "alias": "Joanne", + "code": "en-AU-JoanneNeural", + "locale": "en-AU", + "gender": "Female", + "usedname": "Joanne", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Jonas", + "alias": "Jonas", + "code": "de-AT-JonasNeural", + "locale": "de-AT", + "gender": "Male", + "usedname": "Jonas", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Kai", + "alias": "Kai", + "code": "en-US-KaiNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Kai", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Kasper", + "alias": "Kasper", + "code": "de-DE-KasperNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Kasper", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Katja", + "alias": "Katja", + "code": "de-DE-KatjaNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Katja", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Kavya", + "alias": "Kavya", + "code": "en-IN-KavyaNeural", + "locale": "en-IN", + "gender": "Female", + "usedname": "Kavya", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ken", + "alias": "Ken", + "code": "en-AU-KenNeural", + "locale": "en-AU", + "gender": "Male", + "usedname": "Ken", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Killian", + "alias": "Killian", + "code": "de-DE-KillianNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Killian", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Kim", + "alias": "Kim", + "code": "en-AU-KimNeural", + "locale": "en-AU", + "gender": "Female", + "usedname": "Kim", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Klarissa", + "alias": "Klarissa", + "code": "de-DE-KlarissaNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Klarissa", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Klaus", + "alias": "Klaus", + "code": "de-DE-KlausNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Klaus", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Kunal", + "alias": "Kunal", + "code": "en-IN-KunalNeural", + "locale": "en-IN", + "gender": "Male", + "usedname": "Kunal", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Leah", + "alias": "Leah", + "code": "en-ZA-LeahNeural", + "locale": "en-ZA", + "gender": "Female", + "usedname": "Leah", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Leni", + "alias": "Leni", + "code": "de-CH-LeniNeural", + "locale": "de-CH", + "gender": "Female", + "usedname": "Leni", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Lewis Multilingual", + "alias": "Lewis Multilingual", + "code": "en-US-LewisMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Lewis", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Liam", + "alias": "Liam", + "code": "en-CA-LiamNeural", + "locale": "en-CA", + "gender": "Male", + "usedname": "Liam", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Libby", + "alias": "Libby", + "code": "en-GB-LibbyNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Libby", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Lola Multilingual", + "alias": "Lola Multilingual", + "code": "en-US-LolaMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Lola", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Louisa", + "alias": "Louisa", + "code": "de-DE-LouisaNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Louisa", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Luke", + "alias": "Luke", + "code": "en-ZA-LukeNeural", + "locale": "en-ZA", + "gender": "Male", + "usedname": "Luke", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Luna", + "alias": "Luna", + "code": "en-SG-LunaNeural", + "locale": "en-SG", + "gender": "Female", + "usedname": "Luna", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Luna", + "alias": "Luna", + "code": "en-US-LunaNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Luna", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Maisie", + "alias": "Maisie", + "code": "en-GB-MaisieNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Maisie", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Maja", + "alias": "Maja", + "code": "de-DE-MajaNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Maja", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Mia", + "alias": "Mia", + "code": "en-GB-MiaNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Mia", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Michelle", + "alias": "Michelle", + "code": "en-US-MichelleNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Michelle", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Mitchell", + "alias": "Mitchell", + "code": "en-NZ-MitchellNeural", + "locale": "en-NZ", + "gender": "Male", + "usedname": "Mitchell", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Molly", + "alias": "Molly", + "code": "en-NZ-MollyNeural", + "locale": "en-NZ", + "gender": "Female", + "usedname": "Molly", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Monica", + "alias": "Monica", + "code": "en-US-MonicaNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Monica", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Nancy", + "alias": "Nancy", + "code": "en-US-NancyNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Nancy", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Nancy Multilingual", + "alias": "Nancy Multilingual", + "code": "en-US-NancyMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Nancy", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Natasha", + "alias": "Natasha", + "code": "en-AU-NatashaNeural", + "locale": "en-AU", + "gender": "Female", + "usedname": "Natasha", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Neerja", + "alias": "Neerja", + "code": "en-IN-NeerjaNeural", + "locale": "en-IN", + "gender": "Female", + "usedname": "Neerja", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Neerja Indic", + "alias": "Neerja Indic", + "code": "en-IN-NeerjaIndicNeural", + "locale": "en-IN", + "gender": "Female", + "usedname": "Neerja", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Neil", + "alias": "Neil", + "code": "en-AU-NeilNeural", + "locale": "en-AU", + "gender": "Male", + "usedname": "Neil", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Noah", + "alias": "Noah", + "code": "en-GB-NoahNeural", + "locale": "en-GB", + "gender": "Male", + "usedname": "Noah", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Nova Turbo Multilingual", + "alias": "Nova Turbo Multilingual", + "code": "en-US-NovaTurboMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Nova", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ollie Multilingual", + "alias": "Ollie Multilingual", + "code": "en-GB-OllieMultilingualNeural", + "locale": "en-GB", + "gender": "Male", + "usedname": "Ollie", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Oliver", + "alias": "Oliver", + "code": "en-GB-OliverNeural", + "locale": "en-GB", + "gender": "Male", + "usedname": "Oliver", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Olivia", + "alias": "Olivia", + "code": "en-GB-OliviaNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Olivia", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Onyx Turbo Multilingual", + "alias": "Onyx Turbo Multilingual", + "code": "en-US-OnyxTurboMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Onyx", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Phoebe Multilingual", + "alias": "Phoebe Multilingual", + "code": "en-US-PhoebeMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Phoebe", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Prabhat", + "alias": "Prabhat", + "code": "en-IN-PrabhatNeural", + "locale": "en-IN", + "gender": "Male", + "usedname": "Prabhat", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Prabhat Indic", + "alias": "Prabhat Indic", + "code": "en-IN-PrabhatIndicNeural", + "locale": "en-IN", + "gender": "Male", + "usedname": "Prabhat", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ralf", + "alias": "Ralf", + "code": "de-DE-RalfNeural", + "locale": "de-DE", + "gender": "Male", + "usedname": "Ralf", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Rehaan", + "alias": "Rehaan", + "code": "en-IN-RehaanNeural", + "locale": "en-IN", + "gender": "Male", + "usedname": "Rehaan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Roger", + "alias": "Roger", + "code": "en-US-RogerNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Roger", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Rosa", + "alias": "Rosa", + "code": "en-PH-RosaNeural", + "locale": "en-PH", + "gender": "Female", + "usedname": "Rosa", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ryan", + "alias": "Ryan", + "code": "en-GB-RyanNeural", + "locale": "en-GB", + "gender": "Male", + "usedname": "Ryan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ryan Multilingual", + "alias": "Ryan Multilingual", + "code": "en-US-RyanMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Ryan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Sam", + "alias": "Sam", + "code": "en-HK-SamNeural", + "locale": "en-HK", + "gender": "Male", + "usedname": "Sam", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Samuel Multilingual", + "alias": "Samuel Multilingual", + "code": "en-US-SamuelMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Samuel", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Sara", + "alias": "Sara", + "code": "en-US-SaraNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Sara", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Seraphina Multilingual", + "alias": "Seraphina Mehrsprachig", + "code": "de-DE-SeraphinaMultilingualNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Seraphina", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Serena Multilingual", + "alias": "Serena Multilingual", + "code": "en-US-SerenaMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Serena", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Shimmer Turbo Multilingual", + "alias": "Shimmer Turbo Multilingual", + "code": "en-US-ShimmerTurboMultilingualNeural", + "locale": "en-US", + "gender": "Female", + "usedname": "Shimmer", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Sonia", + "alias": "Sonia", + "code": "en-GB-SoniaNeural", + "locale": "en-GB", + "gender": "Female", + "usedname": "Sonia", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Steffan", + "alias": "Steffan", + "code": "en-US-SteffanNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Steffan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Steffan Multilingual", + "alias": "Steffan Multilingual", + "code": "en-US-SteffanMultilingualNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Steffan", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Tanja", + "alias": "Tanja", + "code": "de-DE-TanjaNeural", + "locale": "de-DE", + "gender": "Female", + "usedname": "Tanja", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Thomas", + "alias": "Thomas", + "code": "en-GB-ThomasNeural", + "locale": "en-GB", + "gender": "Male", + "usedname": "Thomas", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Tim", + "alias": "Tim", + "code": "en-AU-TimNeural", + "locale": "en-AU", + "gender": "Male", + "usedname": "Tim", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Tina", + "alias": "Tina", + "code": "en-AU-TinaNeural", + "locale": "en-AU", + "gender": "Female", + "usedname": "Tina", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Tony", + "alias": "Tony", + "code": "en-US-TonyNeural", + "locale": "en-US", + "gender": "Male", + "usedname": "Tony", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Wayne", + "alias": "Wayne", + "code": "en-SG-WayneNeural", + "locale": "en-SG", + "gender": "Male", + "usedname": "Wayne", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "William", + "alias": "William", + "code": "en-AU-WilliamNeural", + "locale": "en-AU", + "gender": "Male", + "usedname": "William", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "William Multilingual", + "alias": "William Multilingual", + "code": "en-AU-WilliamMultilingualNeural", + "locale": "en-AU", + "gender": "Male", + "usedname": "William", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Yan", + "alias": "Yan", + "code": "en-HK-YanNeural", + "locale": "en-HK", + "gender": "Female", + "usedname": "Yan", + "volume_adjustment": 0, + "speed_adjustment": 0 + } ], "apiUrl": "http://192.168.1.178:7899/tts?t={{text}}&v={{voiceCode}}&r=5", "podUsers": [ {"role": "酒馆主理人", "code": "zh-CN-Yunyi:DragonHDFlashLatestNeural"}, - {"role": "科技爱好者", "code": "zh-CN-Xiaochen:DragonHDFlashLatestNeural"}, - {"role": "AI从业人员", "code": "zh-CN-liaoning-YunbiaoNeural"} + {"role": "科技爱好者", "code": "zh-CN-Xiaochen:DragonHDFlashLatestNeural"} ], - "turnPattern": "random" + "turnPattern": "random", + "tts_max_retries": 3 } \ No newline at end of file diff --git a/config/fish-audio.json b/config/fish-audio.json new file mode 100644 index 0000000..1a98d24 --- /dev/null +++ b/config/fish-audio.json @@ -0,0 +1,514 @@ +{ + "voices": [ + { + "name": "DingZhen", + "alias": "丁真", + "code": "54a5170264694bfc8e9ad98df7bd89c3", + "locale": "zh-CN", + "gender": "Male", + "usedname": "丁真", + "audio": "https://platform.r2.fish.audio/task/5f55a97cbbf84d059f8249c489c90fce.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SaiMaNiang", + "alias": "赛马娘", + "code": "0eb38bc974e1459facca38b359e13511", + "locale": "zh-CN", + "gender": "Female", + "usedname": "赛马娘", + "audio": "https://platform.r2.fish.audio/task/0db5556c7b194f629b4489bc2f290b4f.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "HeiShou", + "alias": "黑手", + "code": "f7561ff309bd4040a59f1e600f4f4338", + "locale": "zh-CN", + "gender": "Male", + "usedname": "黑手", + "audio": "https://platform.r2.fish.audio/task/40da92cba22e4fcca734a09bf9042410.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CaiXuKun", + "alias": "蔡徐坤", + "code": "e4642e5edccd4d9ab61a69e82d4f8a14", + "locale": "zh-CN", + "gender": "Male", + "usedname": "蔡徐坤", + "audio": "https://platform.r2.fish.audio/task/a85f0ef9b94d4f8da515d9597985286c.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YangShiPeiYin", + "alias": "央视配音", + "code": "59cb5986671546eaa6ca8ae6f29f6d22", + "locale": "zh-CN", + "gender": "Male", + "usedname": "央视配音", + "audio": "https://platform.r2.fish.audio/task/121e958e29924b01807894e1aeb767c7.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SunXiaoChuan258", + "alias": "孙笑川258", + "code": "e80ea225770f42f79d50aa98be3cedfc", + "locale": "zh-CN", + "gender": "Male", + "usedname": "孙笑川258", + "audio": "https://platform.r2.fish.audio/task/6c0db70dae9344d881b1d58cecc39fbb.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LeiJun", + "alias": "雷军", + "code": "aebaa2305aa2452fbdc8f41eec852a79", + "locale": "zh-CN", + "gender": "Male", + "usedname": "雷军", + "audio": "https://platform.r2.fish.audio/task/86476c07c9164b40bb0a3bd47add9e63.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "DingZhenRuiKeWuDaiBan", + "alias": "丁真(锐刻五代版)", + "code": "332941d1360c48949f1b4e0cabf912cd", + "locale": "zh-CN", + "gender": "Male", + "usedname": "丁真(锐刻五代版)", + "audio": "https://platform.r2.fish.audio/task/eed599aa641f4360a46f84208d183835.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XuanChuanPianDaQiYouYangHunHou", + "alias": "【宣传片】(大气悠扬浑厚)", + "code": "dd43b30d04d9446a94ebe41f301229b5", + "locale": "zh-CN", + "gender": "Male", + "usedname": "【宣传片】(大气悠扬浑厚)", + "audio": "https://platform.r2.fish.audio/task/74b32b61c30e4db99428c66bcfccbbda.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "WangKunShengYinMoXing1017t1", + "alias": "王琨声音模型10.17t1", + "code": "4f201abba2574feeae11e5ebf737859e", + "locale": "zh-CN", + "gender": "Female", + "usedname": "王琨声音模型10.17t1", + "audio": "https://platform.r2.fish.audio/task/b84575f0f0cf47a7aa314656c1677a49.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "DongYuHui", + "alias": "董宇辉", + "code": "c7cbda1c101c4ce8906c046f01eca1a2", + "locale": "zh-CN", + "gender": "Male", + "usedname": "董宇辉", + "audio": "https://platform.r2.fish.audio/task/b1b292a2f99044f0862c3eb41595cfe7.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JiangJieShi", + "alias": "蒋介石", + "code": "918a8277663d476b95e2c4867da0f6a6", + "locale": "zh-CN", + "gender": "Male", + "usedname": "蒋介石", + "audio": "https://platform.r2.fish.audio/task/1310984d9c7f4a5cbf72d873fd5893ff.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GuoDeGang", + "alias": "郭德纲", + "code": "7c66db6e457c4d53b1fe428a8c547953", + "locale": "zh-CN", + "gender": "Male", + "usedname": "郭德纲", + "audio": "https://platform.r2.fish.audio/task/845a1e1389a44f9e804cf64ea68ac7e6.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "XiaoMingJianMo", + "alias": "小明剑魔", + "code": "a9372068ed0740b48326cf9a74d7496a", + "locale": "zh-CN", + "gender": "Male", + "usedname": "小明剑魔", + "audio": "https://platform.r2.fish.audio/task/64048176afa3415a986dee1cfa98c309.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BiYeJiWenQingNvXueSheng", + "alias": "毕业季温情女学生", + "code": "a1417155aa234890aab4a18686d12849", + "locale": "zh-CN", + "gender": "Female", + "usedname": "毕业季温情女学生", + "audio": "https://platform.r2.fish.audio/task/7f77870798e34022b049a783411fec7c.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ZhengXiangZhou", + "alias": "郑翔洲", + "code": "ca8fb681ce2040958c15ede5eef86177", + "locale": "zh-CN", + "gender": "Male", + "usedname": "郑翔洲", + "audio": "https://platform.r2.fish.audio/task/dfb8a41d5bcc419881fed861a121e648.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "LuBenWei", + "alias": "卢本伟", + "code": "24d524b57c5948f598e9b74c4dacc7ab", + "locale": "zh-CN", + "gender": "Male", + "usedname": "卢本伟", + "audio": "https://platform.r2.fish.audio/task/7fc51b3f4ef74f4480425ec0ebb03ffe.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GangBeng", + "alias": "钢镚", + "code": "bbad29edef624b6e964418f12bd8b5b2", + "locale": "zh-CN", + "gender": "Male", + "usedname": "钢镚", + "audio": "https://platform.r2.fish.audio/task/4a585dfc7d134187b6c8ad90db3bfe87.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AiLiSiZhongPei", + "alias": "爱丽丝(中配)", + "code": "e488ebeadd83496b97a3cd472dcd04ab", + "locale": "zh-CN", + "gender": "Female", + "usedname": "爱丽丝(中配)", + "audio": "https://platform.r2.fish.audio/task/92cca533ea944f0ba29b6d4d8d156b75.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ElonMuskNoiseReduction", + "alias": "Elon Musk(Noise reduction)", + "code": "03397b4c4be74759b72533b663fbd001", + "locale": "en", + "gender": "Male", + "usedname": "Elon Musk(Noise reduction)", + "audio": "https://platform.r2.fish.audio/task/e73dd4ca6de6405293a718d28ee92afd.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SpongeBobSquarePants", + "alias": "SpongeBob SquarePants", + "code": "54e3a85ac9594ffa83264b8a494b901b", + "locale": "en", + "gender": "Male", + "usedname": "SpongeBob SquarePants", + "audio": "https://platform.r2.fish.audio/task/921609c646af4ea48e1c5e18cee1e1f3.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "DonaldJTrumpNoiseReduction", + "alias": "Donald J. Trump(Noise reduction)", + "code": "5196af35f6ff4a0dbf541793fc9f2157", + "locale": "en", + "gender": "Male", + "usedname": "Donald J. Trump(Noise reduction)", + "audio": "https://platform.r2.fish.audio/task/2ca761a2708c4aa0b841fd8a4e9333ad.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "POTUS47Trump", + "alias": "POTUS 47 - Trump", + "code": "e58b0d7efca34eb38d5c4985e378abcb", + "locale": "en", + "gender": "Male", + "usedname": "POTUS 47 - Trump", + "audio": "https://platform.r2.fish.audio/task/cb44e574980c463fbdafaf260db311b6.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TaylorSwift", + "alias": "Taylor Swift", + "code": "cfc33da8775c47afacccf4eebabe44dc", + "locale": "en", + "gender": "Female", + "usedname": "Taylor Swift", + "audio": "https://platform.r2.fish.audio/task/c2ca4457eb964a3f811fbfdd63e3c851.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ALLE", + "alias": "ALLE", + "code": "59e9dc1cb20c452584788a2690c80970", + "locale": "en", + "gender": "Female", + "usedname": "ALLE", + "audio": "https://platform.r2.fish.audio/task/5507666747e4405091c9875974fa1579.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RaidenShogun", + "alias": "Raiden Shogun", + "code": "5ac6fb7171ba419190700620738209d8", + "locale": "en", + "gender": "Female", + "usedname": "Raiden Shogun", + "audio": "https://platform.r2.fish.audio/task/f1e720f63bbc4af1ba637a5205846e1b.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Mrbeast", + "alias": "mrbeast", + "code": "cc1d2d26fddf487496c74a7f40c7c871", + "locale": "en", + "gender": "Male", + "usedname": "mrbeast", + "audio": "https://platform.r2.fish.audio/task/a5821aa9dc6446b581f5af14be8a25bd.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Horror", + "alias": "horror", + "code": "ef9c79b62ef34530bf452c0e50e3c260", + "locale": "en", + "gender": "Male", + "usedname": "horror", + "audio": "https://platform.r2.fish.audio/task/20bc0df607cd466180e27001089378a8.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "EGirlSoft", + "alias": "E-Girl (soft)", + "code": "9fad12dc142b429d9396190b0197adb8", + "locale": "en", + "gender": "Female", + "usedname": "E-Girl (soft)", + "audio": "https://platform.r2.fish.audio/task/98fd8981859b43cabb5de9d93b9d3ed7.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "VoiceDL", + "alias": "Voice DL", + "code": "1936333080804be19655c6749b2ae7b2", + "locale": "en", + "gender": "Male", + "usedname": "Voice DL", + "audio": "https://platform.r2.fish.audio/task/1134b26cffe14a13b10e58e0fd8cefd9.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TrapAHolics", + "alias": "Trap-A-Holics", + "code": "0b2e96151d67433d93891f15efc25dbd", + "locale": "en", + "gender": "Male", + "usedname": "Trap-A-Holics", + "audio": "https://platform.r2.fish.audio/task/a1f2fb6632c9423e88c517d4dc57ddea.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Venti", + "alias": "Venti", + "code": "e34c486929524d41b88646b4ac2f382f", + "locale": "en", + "gender": "Male", + "usedname": "Venti", + "audio": "https://platform.r2.fish.audio/task/bfa9edf3128d42f58ad3b84bed31a3bf.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Ton", + "alias": "ton", + "code": "b97618c195814c9fb7558ea34093cd28", + "locale": "en", + "gender": "Male", + "usedname": "ton", + "audio": "https://platform.r2.fish.audio/task/425a00e456a84f3a8f15d22cc4c09236.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CopyrightedVoiceDontUseThis", + "alias": "Copyrighted Voice (Don't use this)", + "code": "28b049a7574f46bc9d7122761363bda0", + "locale": "en", + "gender": "Male", + "usedname": "Copyrighted Voice (Don't use this)", + "audio": "https://platform.r2.fish.audio/task/4c4a0d9887c24d87bb37f21823b40054.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Valentino", + "alias": "Valentino", + "code": "a1fe2e1b6f324e27929d5088f2d09be3", + "locale": "en", + "gender": "Male", + "usedname": "Valentino", + "audio": "https://platform.r2.fish.audio/task/fb28a883f3274eb08526e56925db389b.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BOOKRECORDREGULAR", + "alias": "BOOK RECORD REGULAR", + "code": "f8dfe9c83081432386f143e2fe9767ef", + "locale": "en", + "gender": "Male", + "usedname": "BOOK RECORD REGULAR", + "audio": "https://platform.r2.fish.audio/task/ee671024b37b4b68b84271688c68afad.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Paula", + "alias": "Paula", + "code": "c2623f0c075b4492ac367989aee1576f", + "locale": "en", + "gender": "Female", + "usedname": "Paula", + "audio": "https://platform.r2.fish.audio/task/ed58f201ceca48e3a0c5624b1e115bbc.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "PhatPhapBro", + "alias": "Phat phap(Bro)", + "code": "e0e2468ce2d746c1b20a4414435f6f48", + "locale": "en", + "gender": "Male", + "usedname": "Phat phap(Bro)", + "audio": "https://platform.r2.fish.audio/task/fe080e3ff192463f9d66002b134aceed.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "KouBiBu", + "alias": "扣比不", + "code": "d1f2aabbde274195adaf0710086269d7", + "locale": "en", + "gender": "Female", + "usedname": "扣比不", + "audio": "https://platform.r2.fish.audio/task/ad7e8adeefad4240bd45a3be57f73cfc.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SleeplessHistorian", + "alias": "Sleepless historian", + "code": "beb44e5fac1e4b33a15dfcdcc2a9421d", + "locale": "en", + "gender": "Male", + "usedname": "Sleepless historian", + "audio": "https://platform.r2.fish.audio/task/b12fa8ab18bf4e8ba7d9dffec4f89e38.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GODVOICE", + "alias": "GOD VOICE", + "code": "3d9fca75027f4a86a677dd7044996a87", + "locale": "en", + "gender": "Male", + "usedname": "GOD VOICE", + "audio": "https://platform.r2.fish.audio/task/3de9913ca55f47bca347efb54cd2b726.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BlackStruggles", + "alias": "Black_struggles", + "code": "b99f2c4a0012471cb32ab61152e7e48d", + "locale": "en", + "gender": "Male", + "usedname": "Black_struggles", + "audio": "https://platform.r2.fish.audio/task/93c0304e2a54431d828f1bf06f3ba0ed.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "RONALDO1", + "alias": "RONALDO1", + "code": "86304d8fa1734bd89291acf4060d8a5e", + "locale": "en", + "gender": "Male", + "usedname": "RONALDO1", + "audio": "https://platform.r2.fish.audio/task/01315d0685a240c09aaf6efbe682ab86.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Alhaitham", + "alias": "Alhaitham", + "code": "92a2600282e547f098b4a8de1bc9a44a", + "locale": "en", + "gender": "Male", + "usedname": "Alhaitham", + "audio": "https://platform.r2.fish.audio/task/b59065ebd0cb4525ace68bc9a218513e.mp3", + "volume_adjustment": 0, + "speed_adjustment": 0 + } + ], + "podUsers": [ + {"role": "节目主理人", "code": "aebaa2305aa2452fbdc8f41eec852a79"}, + {"role": "科技爱好者", "code": "5c353fdb312f4888836a9a5680099ef0"} + ], + "turnPattern": "random", + "tts_max_retries": 3, + "apiUrl": "https://api.fish.audio/v1/tts", + "headers": { + "Authorization": "Bearer {{api_key}}", + "Content-Type": "application/msgpack", + "model": "s1" + }, + "request_payload": { + "text": "{{test_text}}", + "chunk_length": 200, + "format": "mp3", + "mp3_bitrate": 128, + "references": [], + "reference_id": "{{voice_code}}", + "normalize": true, + "latency": "normal", + "prosody":{ + "speed": 1.0, + "volume": 0 + } + } +} \ No newline at end of file diff --git a/config/gemini-tts.json b/config/gemini-tts.json new file mode 100644 index 0000000..3cac5d8 --- /dev/null +++ b/config/gemini-tts.json @@ -0,0 +1,363 @@ +{ + "voices": [ + { + "name": "Zephyr", + "alias": "明亮", + "code": "Zephyr", + "locale": "zh-CN", + "usedname": "明亮", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Zephyr.wav" + }, + { + "name": "Puck", + "alias": "欢快", + "code": "Puck", + "locale": "zh-CN", + "usedname": "欢快", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Puck.wav" + }, + { + "name": "Charon", + "alias": "信息丰富", + "code": "Charon", + "locale": "zh-CN", + "usedname": "信息丰富", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Charon.wav" + }, + { + "name": "Kore", + "alias": "坚定", + "code": "Kore", + "locale": "zh-CN", + "usedname": "坚定", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Kore.wav" + }, + { + "name": "Fenrir", + "alias": "Excitable", + "code": "Fenrir", + "locale": "zh-CN", + "usedname": "Excitable", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Fenrir.wav" + }, + { + "name": "Leda", + "alias": "青春", + "code": "Leda", + "locale": "zh-CN", + "usedname": "青春", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Leda.wav" + }, + { + "name": "Orus", + "alias": "公司", + "code": "Orus", + "locale": "zh-CN", + "usedname": "公司", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Orus.wav" + }, + { + "name": "Aoede", + "alias": "Breezy", + "code": "Aoede", + "locale": "zh-CN", + "usedname": "Breezy", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Aoede.wav" + }, + { + "name": "Callirrhoe", + "alias": "随和", + "code": "Callirrhoe", + "locale": "zh-CN", + "usedname": "随和", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Callirrhoe.wav" + }, + { + "name": "Autonoe", + "alias": "明亮", + "code": "Autonoe", + "locale": "zh-CN", + "usedname": "明亮", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Autonoe.wav" + }, + { + "name": "Enceladus", + "alias": "气声", + "code": "Enceladus", + "locale": "zh-CN", + "usedname": "气声", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Enceladus.wav" + }, + { + "name": "Iapetus", + "alias": "清晰", + "code": "Iapetus", + "locale": "zh-CN", + "usedname": "清晰", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Iapetus.wav" + }, + { + "name": "Umbriel", + "alias": "随和", + "code": "Umbriel", + "locale": "zh-CN", + "usedname": "随和", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Umbriel.wav" + }, + { + "name": "Algieba", + "alias": "平滑", + "code": "Algieba", + "locale": "zh-CN", + "usedname": "平滑", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Algieba.wav" + }, + { + "name": "Despina", + "alias": "平滑", + "code": "Despina", + "locale": "zh-CN", + "usedname": "平滑", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Despina.wav" + }, + { + "name": "Erinome", + "alias": "清除", + "code": "Erinome", + "locale": "zh-CN", + "usedname": "清除", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Erinome.wav" + }, + { + "name": "Algenib", + "alias": "Gravelly", + "code": "Algenib", + "locale": "zh-CN", + "usedname": "Gravelly", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Algenib.wav" + }, + { + "name": "Rasalgethi", + "alias": "信息丰富", + "code": "Rasalgethi", + "locale": "zh-CN", + "usedname": "信息丰富", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Rasalgethi.wav" + }, + { + "name": "Laomedeia", + "alias": "欢快", + "code": "Laomedeia", + "locale": "zh-CN", + "usedname": "欢快", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Laomedeia.wav" + }, + { + "name": "Achernar", + "alias": "软", + "code": "Achernar", + "locale": "zh-CN", + "usedname": "软", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Achernar.wav" + }, + { + "name": "Alnilam", + "alias": "Firm", + "code": "Alnilam", + "locale": "zh-CN", + "usedname": "Firm", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Alnilam.wav" + }, + { + "name": "Schedar", + "alias": "均匀", + "code": "Schedar", + "locale": "zh-CN", + "usedname": "均匀", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Schedar.wav" + }, + { + "name": "Gacrux", + "alias": "成人", + "code": "Gacrux", + "locale": "zh-CN", + "usedname": "成人", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Gacrux.wav" + }, + { + "name": "Pulcherrima", + "alias": "转发", + "code": "Pulcherrima", + "locale": "zh-CN", + "usedname": "转发", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Pulcherrima.wav" + }, + { + "name": "Achird", + "alias": "友好", + "code": "Achird", + "locale": "zh-CN", + "usedname": "友好", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Achird.wav" + }, + { + "name": "Zubenelgenubi", + "alias": "随意", + "code": "Zubenelgenubi", + "locale": "zh-CN", + "usedname": "随意", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Zubenelgenubi.wav" + }, + { + "name": "Vindemiatrix", + "alias": "温柔", + "code": "Vindemiatrix", + "locale": "zh-CN", + "usedname": "温柔", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Vindemiatrix.wav" + }, + { + "name": "Sadachbia", + "alias": "活泼", + "code": "Sadachbia", + "locale": "zh-CN", + "usedname": "活泼", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Sadachbia.wav" + }, + { + "name": "Sadaltager", + "alias": "知识渊博", + "code": "Sadaltager", + "locale": "zh-CN", + "usedname": "知识渊博", + "gender": "Male", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Sadaltager.wav" + }, + { + "name": "Sulafat", + "alias": "偏高", + "code": "Sulafat", + "locale": "zh-CN", + "usedname": "偏高", + "gender": "Female", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://www.gstatic.com/aistudio/voices/samples/Sulafat.wav" + } + ], + "podUsers": [ + {"role": "节目主理人", "code": "Sadaltager"}, + {"role": "科技爱好者", "code": "Vindemiatrix"} + ], + "turnPattern": "random", + "tts_max_retries": 3, + "apiUrl": "https://generativelanguage.googleapis.com/v1beta/models/{{model}}:generateContent", + "headers": { + "x-goog-api-key": "{{api_key}}", + "Content-Type": "application/json" + }, + "request_payload": { + "contents": [{ + "parts":[{ + "text": "{{text}}" + }] + }], + "generationConfig": { + "responseModalities": ["AUDIO"], + "speechConfig": { + "voiceConfig": { + "prebuiltVoiceConfig": { + "voiceName": "{{voice_code}}" + } + } + } + }, + "model": "gemini-2.5-flash-preview-tts" + } +} \ No newline at end of file diff --git a/config/index-tts.json b/config/index-tts.json index 88890c6..d05d8ca 100644 --- a/config/index-tts.json +++ b/config/index-tts.json @@ -6,7 +6,9 @@ "code": "zh-CN-XiaolinIndex", "locale": "zh-CN", "gender": "Female", - "usedname": "林夕" + "usedname": "林夕", + "volume_adjustment": 0, + "speed_adjustment": 0 }, { "name": "Yunzhe", @@ -14,7 +16,9 @@ "code": "zh-CN-YunzheIndex", "locale": "zh-CN", "gender": "Male", - "usedname": "苏哲" + "usedname": "苏哲", + "volume_adjustment": 0, + "speed_adjustment": 0 }, { "name": "HeXi", @@ -22,7 +26,9 @@ "code": "zh-CN-HeXiIndex", "locale": "zh-CN", "gender": "Male", - "usedname": "何夕" + "usedname": "何夕", + "volume_adjustment": 0, + "speed_adjustment": 0 }, { "name": "Datong", @@ -30,7 +36,19 @@ "code": "zh-CN-DatongIndex", "locale": "zh-CN", "gender": "Male", - "usedname": "大同" + "usedname": "大同", + "volume_adjustment": -1, + "speed_adjustment": 0 + }, + { + "name": "KaiQi", + "alias": "凯琪", + "code": "zh-CN-KaiQiIndex", + "locale": "zh-CN", + "gender": "Female", + "usedname": "凯琪", + "volume_adjustment": 0, + "speed_adjustment": 0 }, { "name": "Daibei", @@ -38,14 +56,16 @@ "code": "zh-CN-DaibeiIndex", "locale": "zh-CN", "gender": "Male", - "usedname": "大比" + "usedname": "大比", + "volume_adjustment": 0, + "speed_adjustment": 0 } ], "apiUrl": "http://192.168.1.232:7899/synthesize?text={{text}}&server_audio_prompt_path={{voiceCode}}", "podUsers": [ - {"role": "节目主理人", "code": "zh-CN-YunzheIndex"}, - {"role": "科技爱好者", "code": "zh-CN-XiaolinIndex"}, - {"role": "独立音乐人", "code": "zh-CN-DatongIndex"} + {"role": "节目主持人", "code": "zh-CN-DatongIndex"}, + {"role": "科技爱好者", "code": "zh-CN-KaiQiIndex"} ], - "turnPattern": "random" + "turnPattern": "random", + "tts_max_retries": 3 } \ No newline at end of file diff --git a/config/minimax.json b/config/minimax.json new file mode 100644 index 0000000..17ae488 --- /dev/null +++ b/config/minimax.json @@ -0,0 +1,925 @@ +{ + "voices": [ + { + "name": "ChenWenGaoGuan", + "alias": "沉稳高管", + "code": "Chinese (Mandarin)_Reliable_Executive", + "locale": "zh-CN", + "gender": "Female", + "usedname": "沉稳高管", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939828702964727-/hailuo-audio-25eb48c50a3b58c5b35a768da95d19c8.mp3" + }, + { + "name": "XinWenNvSheng", + "alias": "新闻女声", + "code": "Chinese (Mandarin)_News_Anchor", + "locale": "zh-CN", + "gender": "Male", + "usedname": "新闻女声", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939837404521410-/hailuo-audio-8c441f895ef46207b31ee1818b3c0bdf.mp3" + }, + { + "name": "ShuLangNanSheng", + "alias": "舒朗男声", + "code": "hunyin_6", + "locale": "zh-CN", + "gender": "Female", + "usedname": "舒朗男声", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://filecdn.minimax.chat/public/2984b933-6437-4cc0-82a2-e992893e1539.mp3" + }, + { + "name": "AoJiaoYuJie", + "alias": "傲娇御姐", + "code": "Chinese (Mandarin)_Mature_Woman", + "locale": "zh-CN", + "gender": "Male", + "usedname": "傲娇御姐", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939835298225708-/hailuo-audio-d8196e5799c65552662fc56f38af13db.mp3" + }, + { + "name": "BuJiQingNian", + "alias": "不羁青年", + "code": "Chinese (Mandarin)_Unrestrained_Young_Man", + "locale": "zh-CN", + "gender": "Female", + "usedname": "不羁青年", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939837678401020-/hailuo-audio-b501bd8ec7dd5c6f8272f0446274399e.mp3" + }, + { + "name": "XiaoZhangXiaoJie", + "alias": "嚣张小姐", + "code": "Arrogant_Miss", + "locale": "zh-CN", + "gender": "Male", + "usedname": "嚣张小姐", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096240932614767-/hailuo-audio-cd53c63ba41970f0307ed6c6b9ef2f41.mp3" + }, + { + "name": "JiXieZhanJia", + "alias": "机械战甲", + "code": "Robot_Armor", + "locale": "zh-CN", + "gender": "Female", + "usedname": "机械战甲", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096241022651937-/hailuo-audio-1f0487b0484424d83bc34dd68635c756.mp3" + }, + { + "name": "ReXinDaShen", + "alias": "热心大婶", + "code": "Chinese (Mandarin)_Kind-hearted_Antie", + "locale": "zh-CN", + "gender": "Male", + "usedname": "热心大婶", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939836702995041-/hailuo-audio-747a446c2d632142db87c11a6d2481ae.mp3" + }, + { + "name": "GaoXiaoDaYe", + "alias": "搞笑大爷", + "code": "Chinese (Mandarin)_Humorous_Elder", + "locale": "zh-CN", + "gender": "Female", + "usedname": "搞笑大爷", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939835767092010-/hailuo-audio-3b00ef13ecf64d5d5e27b3af39250e1b.mp3" + }, + { + "name": "WenRunNanSheng", + "alias": "温润男声", + "code": "Chinese (Mandarin)_Gentleman", + "locale": "zh-CN", + "gender": "Female", + "usedname": "温润男声", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939807409530648-/hailuo-audio-7f6792db55d582f5426f2df7ce642bd2.mp3" + }, + { + "name": "WenNuanGuiMi", + "alias": "温暖闺蜜", + "code": "Chinese (Mandarin)_Warm_Bestie", + "locale": "zh-CN", + "gender": "Male", + "usedname": "温暖闺蜜", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939827676982824-/hailuo-audio-8e92f8bc7cdeecdfdc24163fdbf10585.mp3" + }, + { + "name": "BoBaoNanSheng", + "alias": "播报男声", + "code": "Chinese (Mandarin)_Male_Announcer", + "locale": "zh-CN", + "gender": "Female", + "usedname": "播报男声", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939813636243159-/hailuo-audio-199574ab886502bfffeaaaeae9d690cd.mp3" + }, + { + "name": "DianTaiNanZhuBo", + "alias": "电台男主播", + "code": "Chinese (Mandarin)_Radio_Host", + "locale": "zh-CN", + "gender": "Female", + "usedname": "电台男主播", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939836560676953-/hailuo-audio-bd8f326fb44dcec0878ff2dc027fa94f.mp3" + }, + { + "name": "CalmWoman", + "alias": "Calm Woman", + "code": "Arabic_CalmWoman", + "locale": "en", + "gender": "Male", + "usedname": "Calm Woman", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096195678726631-/hailuo-audio-82aac82e527a394b209b4a2b604b50b9.mp3" + }, + { + "name": "GangPuKongJie", + "alias": "港普空姐", + "code": "Chinese (Mandarin)_HK_Flight_Attendant", + "locale": "zh-CN", + "gender": "Male", + "usedname": "港普空姐", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-08-07-14/moss-audio/user_audio//1754548066976928527-298988366913689.mp3" + }, + { + "name": "GracefulLady", + "alias": "Graceful Lady", + "code": "English_Graceful_Lady", + "locale": "en", + "gender": "Male", + "usedname": "Graceful Lady", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.video/moss/prod/2025-08-06-18/moss-audio/user_audio//1754476231322799699-298694229168254.mp3" + }, + { + "name": "PersuasiveFemaleSpeaker", + "alias": "Persuasive Female Speaker", + "code": "French_Female_Speech_New", + "locale": "en", + "gender": "Male", + "usedname": "Persuasive Female Speaker", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939777606312940-/hailuo-audio-e2c552ff9a04d11c428c7e88847c26d6.mp3" + }, + { + "name": "SweetGirl", + "alias": "Sweet Girl", + "code": "Indonesian_SweetGirl", + "locale": "en", + "gender": "Male", + "usedname": "Sweet Girl", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096199945586161-/hailuo-audio-7e3396cdfe9fde1f9bc07ae1a2ba51c7.mp3" + }, + { + "name": "ArrogantPrincess", + "alias": "Arrogant Princess", + "code": "Italian_ArrogantPrincess", + "locale": "en", + "gender": "Male", + "usedname": "Arrogant Princess", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939803705324406-/hailuo-audio-1c2bc2ee2a2c5a4650c254cd1f6efcf4.mp3" + }, + { + "name": "IntellectualSenior", + "alias": "Intellectual Senior", + "code": "Japanese_IntellectualSenior", + "locale": "en", + "gender": "Female", + "usedname": "Intellectual Senior", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-24-16/moss-audio/voice_sample_audio/sample/1737708432248717660-/hailuo-audio-18c17e54ed62c0491b9466ffddba8ed5.mp3" + }, + { + "name": "KindLady", + "alias": "Kind Lady", + "code": "Japanese_KindLady", + "locale": "en", + "gender": "Male", + "usedname": "Kind Lady", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-24-16/moss-audio/voice_sample_audio/sample/1737708433989780649-/hailuo-audio-f03c01520180359e4eee184bf0fc19ab.mp3" + }, + { + "name": "SweetGirl", + "alias": "Sweet Girl", + "code": "Korean_SweetGirl", + "locale": "en", + "gender": "Male", + "usedname": "Sweet Girl", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096215341266877-/hailuo-audio-7ea8d579722692c6294ed9cfa2f24073.mp3" + }, + { + "name": "ChildhoodFriendGirl", + "alias": "Childhood Friend Girl", + "code": "Korean_ChildhoodFriendGirl", + "locale": "en", + "gender": "Male", + "usedname": "Childhood Friend Girl", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096206080309714-/hailuo-audio-18971415b344cc08a9c92207829545b2.mp3" + }, + { + "name": "EnthusiasticTeen", + "alias": "Enthusiastic Teen", + "code": "Korean_EnthusiasticTeen", + "locale": "en", + "gender": "Female", + "usedname": "Enthusiastic Teen", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096209076732667-/hailuo-audio-6a62676f7f404cf91a0b83fd2dcf0360.mp3" + }, + { + "name": "BraveAdventurer", + "alias": "Brave Adventurer", + "code": "Korean_BraveAdventurer", + "locale": "en", + "gender": "Male", + "usedname": "Brave Adventurer", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096202715219216-/hailuo-audio-01927194c4e8a5257d89d2ef2e73c8d5.mp3" + }, + { + "name": "QuirkyGirl", + "alias": "Quirky Girl", + "code": "Korean_QuirkyGirl", + "locale": "en", + "gender": "Male", + "usedname": "Quirky Girl", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096213274958092-/hailuo-audio-10c5eb8e17935195f3c5fd7637473823.mp3" + }, + { + "name": "ColdGirl", + "alias": "Cold Girl", + "code": "Korean_ColdGirl", + "locale": "en", + "gender": "Male", + "usedname": "Cold Girl", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096206844716202-/hailuo-audio-08034a6a8405717729ab72605506487f.mp3" + }, + { + "name": "PossessiveMan", + "alias": "Possessive Man", + "code": "Korean_PossessiveMan", + "locale": "en", + "gender": "Female", + "usedname": "Possessive Man", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096212918731832-/hailuo-audio-3648709e795372c2be11153c7955d83b.mp3" + }, + { + "name": "Deep-tonedMan", + "alias": "Deep-toned Man", + "code": "Portuguese_Deep-tonedMan", + "locale": "en", + "gender": "Female", + "usedname": "Deep-toned Man", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939714857598214-/hailuo-audio-267471ebafe9f3baa93d5e9fe78f93db.mp3" + }, + { + "name": "ConfidentWoman", + "alias": "Confident Woman", + "code": "Portuguese_ConfidentWoman", + "locale": "en", + "gender": "Male", + "usedname": "Confident Woman", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096221082217897-/hailuo-audio-eee8639c2e4b1dbfd5bb4d95df4f6b4f.mp3" + }, + { + "name": "Grinch", + "alias": "Grinch", + "code": "Portuguese_Grinch", + "locale": "en", + "gender": "Female", + "usedname": "Grinch", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096226056145486-/hailuo-audio-b3e330056b9324a7777815abc3512776.mp3" + }, + { + "name": "SereneWoman", + "alias": "Serene Woman", + "code": "Portuguese_SereneWoman", + "locale": "en", + "gender": "Male", + "usedname": "Serene Woman", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096233988799669-/hailuo-audio-26ac9f353013d49d0a27bb760b32db46.mp3" + }, + { + "name": "Dramatist", + "alias": "Dramatist", + "code": "Portuguese_Dramatist", + "locale": "en", + "gender": "Female", + "usedname": "Dramatist", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096222364532260-/hailuo-audio-a522bdef0410221371811fdfbde034fd.mp3" + }, + { + "name": "CharmingLady", + "alias": "Charming Lady", + "code": "Portuguese_CharmingLady", + "locale": "en", + "gender": "Male", + "usedname": "Charming Lady", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096219366540273-/hailuo-audio-de56612994524a416188f4c5a7360ef2.mp3" + }, + { + "name": "GrimReaper", + "alias": "Grim Reaper", + "code": "Portuguese_GrimReaper", + "locale": "en", + "gender": "Female", + "usedname": "Grim Reaper", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096225707843994-/hailuo-audio-35d0909a7c103b0251e6d10b81a1888f.mp3" + }, + { + "name": "RomanticHusband", + "alias": "Romantic Husband", + "code": "Portuguese_RomanticHusband", + "locale": "en", + "gender": "Female", + "usedname": "Romantic Husband", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096231837088813-/hailuo-audio-71e49e955963c8e6aadc4688bef86730.mp3" + }, + { + "name": "ThoughtfulLady", + "alias": "Thoughtful Lady", + "code": "Portuguese_ThoughtfulLady", + "locale": "en", + "gender": "Male", + "usedname": "Thoughtful Lady", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096236330890911-/hailuo-audio-32cc62f4d5a0a44d01c58a292f7756fe.mp3" + }, + { + "name": "DeterminedManager", + "alias": "Determined Manager", + "code": "Portuguese_DeterminedManager", + "locale": "en", + "gender": "Male", + "usedname": "Determined Manager", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096222058020509-/hailuo-audio-2bb855bdce45f51fdfc65a6dd9b8e194.mp3" + }, + { + "name": "Bad-temperedBoy", + "alias": "Bad-tempered Boy", + "code": "Russian_Bad-temperedBoy", + "locale": "en", + "gender": "Female", + "usedname": "Bad-tempered Boy", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://filecdn.minimax.chat/public/e43500b7-5b48-4309-aade-fdb605fff45f.mp3" + }, + { + "name": "BossyLeader", + "alias": "Bossy Leader", + "code": "Spanish_BossyLeader", + "locale": "en", + "gender": "Female", + "usedname": "Bossy Leader", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939814882985359-/hailuo-audio-11769b72e55cd65edf6120128d3a5992.mp3" + }, + { + "name": "Deep-tonedMan", + "alias": "Deep-toned Man", + "code": "Spanish_Deep-tonedMan", + "locale": "en", + "gender": "Female", + "usedname": "Deep-toned Man", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939816536028381-/hailuo-audio-a0782d505cffd1131a8a2bde83e9a25e.mp3" + }, + { + "name": "Steadymentor", + "alias": "Steady Mentor", + "code": "Spanish_Steadymentor", + "locale": "en", + "gender": "Female", + "usedname": "Steady Mentor", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939823745029704-/hailuo-audio-0a02394475f241a68c76b9c1c2d4df8f.mp3" + }, + { + "name": "EnergeticBoy", + "alias": "Energetic Boy", + "code": "Spanish_EnergeticBoy", + "locale": "en", + "gender": "Female", + "usedname": "Energetic Boy", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939816978150659-/hailuo-audio-535a6d694eb3c1d429322d7e327ef476.mp3" + }, + { + "name": "PowerfulSoldier", + "alias": "Powerful Soldier", + "code": "Spanish_PowerfulSoldier", + "locale": "en", + "gender": "Female", + "usedname": "Powerful Soldier", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-15-19/moss-audio/voice_sample_audio/sample/1736939820646722142-/hailuo-audio-414c38f14ef119ad56b20ebd23acc8fa.mp3" + }, + { + "name": "CalmWoman", + "alias": "Calm Woman", + "code": "Turkish_CalmWoman", + "locale": "en", + "gender": "Male", + "usedname": "Calm Woman", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.com/prod/2025-01-17-14/moss-audio/voice_sample_audio/sample/1737096240585827701-/hailuo-audio-873447b700053726fb006028fbccfe52.mp3" + }, + { + "name": "ConfidentWoman", + "alias": "Confident Woman", + "code": "Thai_female_1_sample1", + "locale": "en", + "gender": "Male", + "usedname": "Confident Woman", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://filecdn.minimax.chat/public/22001509-f68e-4df0-99a1-d9867ddd42b9.mp3" + }, + { + "name": "EnergeticYouth", + "alias": "Energetic Youth", + "code": "Romanian_male_2_sample1", + "locale": "en", + "gender": "Female", + "usedname": "Energetic Youth", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://filecdn.minimax.chat/public/c1b5e6f0-fc06-4ef3-ab39-a11d1aca7d4a.mp3" + }, + { + "name": "ElegantLady", + "alias": "Elegant Lady", + "code": "czech_female_2_v2", + "locale": "en", + "gender": "Male", + "usedname": "Elegant Lady", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://filecdn.minimax.chat/public/e065d9cb-0217-4ed7-a530-ae1df47d6881.MP3" + }, + { + "name": "GracefulLady", + "alias": "Graceful Lady", + "code": "Bulgarian_female_1_v1", + "locale": "en", + "gender": "Male", + "usedname": "Graceful Lady", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.video/moss/prod/2025-08-06-17/moss-audio/user_audio//1754472491985636165-298678969561209.mp3" + }, + { + "name": "SteadyMan", + "alias": "Steady Man", + "code": "Persian_male_1_v1", + "locale": "en", + "gender": "Female", + "usedname": "Steady Man", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.video/moss/prod/2025-08-06-17/moss-audio/user_audio//1754473838522291170-298684517163108.mp3" + }, + { + "name": "CheerfulYoungLady", + "alias": "Cheerful Young Lady", + "code": "Croatian_female_1_v1", + "locale": "en", + "gender": "Male", + "usedname": "Cheerful Young Lady", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.video/moss/prod/2025-08-06-18/moss-audio/user_audio//1754475502307412455-298691346075740.mp3" + }, + { + "name": "MaleHost", + "alias": "Male Host", + "code": "Slovenian_male_1_v1", + "locale": "en", + "gender": "Female", + "usedname": "Male Host", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.video/moss/prod/2025-08-06-19/moss-audio/user_audio//1754480144906382494-298710401368130.mp3" + }, + { + "name": "MatureWoman", + "alias": "Mature Woman", + "code": "Tamil_female_1_v1", + "locale": "en", + "gender": "Male", + "usedname": "Mature Woman", + "volume_adjustment": 0, + "speed_adjustment": 0, + "audio": "https://cdn.hailuoai.video/moss/prod/2025-08-06-19/moss-audio/user_audio//1754481054444253754-298714012258408.mp3" + }, + { + "name": "QingSeQingNianYinSe", + "alias": "青涩青年音色", + "code": "male-qn-qingse", + "locale": "zh-CN", + "gender": "Female", + "usedname": "青涩青年音色", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "JingYingQingNianYinSe", + "alias": "精英青年音色", + "code": "male-qn-jingying", + "locale": "zh-CN", + "gender": "Female", + "usedname": "精英青年音色", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "BaDaoQingNianYinSe", + "alias": "霸道青年音色", + "code": "male-qn-badao", + "locale": "zh-CN", + "gender": "Female", + "usedname": "霸道青年音色", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "QingNianDaXueShengYinSe", + "alias": "青年大学生音色", + "code": "male-qn-daxuesheng", + "locale": "zh-CN", + "gender": "Female", + "usedname": "青年大学生音色", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ShaoNvYinSe", + "alias": "少女音色", + "code": "female-shaonv", + "locale": "zh-CN", + "gender": "Male", + "usedname": "少女音色", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YuJieYinSe", + "alias": "御姐音色", + "code": "female-yujie", + "locale": "zh-CN", + "gender": "Male", + "usedname": "御姐音色", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChengShuNvXingYinSe", + "alias": "成熟女性音色", + "code": "female-chengshu", + "locale": "zh-CN", + "gender": "Male", + "usedname": "成熟女性音色", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "TianMeiNvXingYinSe", + "alias": "甜美女性音色", + "code": "female-tianmei", + "locale": "zh-CN", + "gender": "Male", + "usedname": "甜美女性音色", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NanXingZhuChiRen", + "alias": "男性主持人", + "code": "presenter_male", + "locale": "zh-CN", + "gender": "Female", + "usedname": "男性主持人", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NvXingZhuChiRen", + "alias": "女性主持人", + "code": "presenter_female", + "locale": "zh-CN", + "gender": "Male", + "usedname": "女性主持人", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NanXingYouShengShu1", + "alias": "男性有声书1", + "code": "audiobook_male_1", + "locale": "zh-CN", + "gender": "Female", + "usedname": "男性有声书1", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "NanXingYouShengShu2", + "alias": "男性有声书2", + "code": "audiobook_male_2", + "locale": "zh-CN", + "gender": "Female", + "usedname": "男性有声书2", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "YuJieYinSe-beta", + "alias": "御姐音色-beta", + "code": "female-yujie-jingpin", + "locale": "zh-CN", + "gender": "Male", + "usedname": "御姐音色-beta", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ChunZhenXueDi", + "alias": "纯真学弟", + "code": "chunzhen_xuedi", + "locale": "zh-CN", + "gender": "Female", + "usedname": "纯真学弟", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Rudolph", + "alias": "Rudolph", + "code": "Rudolph", + "locale": "en", + "gender": "Female", + "usedname": "Rudolph", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "FluentFemaleBroadcaster", + "alias": "Fluent Female Broadcaster", + "code": "French_Female Journalist", + "locale": "en", + "gender": "Male", + "usedname": "Fluent Female Broadcaster", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "Optimisticyouth", + "alias": "Optimistic youth", + "code": "Portuguese_Optimisticyouth", + "locale": "en", + "gender": "Female", + "usedname": "Optimistic youth", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "EnergeticWoman", + "alias": "Energetic Woman", + "code": "Thai_female_2_sample2", + "locale": "en", + "gender": "Male", + "usedname": "Energetic Woman", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "EnergeticYouth", + "alias": "Energetic Youth", + "code": "Romanian_male_2_sample1", + "locale": "en", + "gender": "Female", + "usedname": "Energetic Youth", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GentleLady", + "alias": "Gentle Lady", + "code": "Greek_female_1_sample1", + "locale": "en", + "gender": "Male", + "usedname": "Gentle Lady", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ElegantLady", + "alias": "Elegant Lady", + "code": "czech_female_2_v2", + "locale": "en", + "gender": "Male", + "usedname": "Elegant Lady", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "AssetiveWoman", + "alias": "Assetive Woman", + "code": "finnish_female_4_v1", + "locale": "en", + "gender": "Male", + "usedname": "Assetive Woman", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "GracefulLady", + "alias": "Graceful Lady", + "code": "Bulgarian_female_1_v1", + "locale": "en", + "gender": "Male", + "usedname": "Graceful Lady", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ReliableMan", + "alias": "Reliable Man", + "code": "Hebrew_male_1_v1", + "locale": "en", + "gender": "Female", + "usedname": "Reliable Man", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SteadyMan", + "alias": "Steady Man", + "code": "Persian_male_1_v1", + "locale": "en", + "gender": "Female", + "usedname": "Steady Man", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ConfidentMan", + "alias": "Confident Man", + "code": "Swedish_male_1_v1", + "locale": "en", + "gender": "Female", + "usedname": "Confident Man", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "CheerfulYoungLady", + "alias": "Cheerful Young Lady", + "code": "Croatian_female_1_v1", + "locale": "en", + "gender": "Male", + "usedname": "Cheerful Young Lady", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "ReliableMan", + "alias": "Reliable Man", + "code": "Norwegian_male_1_v1", + "locale": "en", + "gender": "Female", + "usedname": "Reliable Man", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MaleHost", + "alias": "Male Host", + "code": "Slovenian_male_1_v1", + "locale": "en", + "gender": "Female", + "usedname": "Male Host", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "MatureWoman", + "alias": "Mature Woman", + "code": "Tamil_female_1_v1", + "locale": "en", + "gender": "Male", + "usedname": "Mature Woman", + "volume_adjustment": 0, + "speed_adjustment": 0 + }, + { + "name": "SteadyYouth", + "alias": "Steady Youth", + "code": "Afrikaans_male_1_v1", + "locale": "en", + "gender": "Female", + "usedname": "Steady Youth", + "volume_adjustment": 0, + "speed_adjustment": 0 + } + ], + "podUsers": [ + {"role": "节目主理人", "code": "Chinese (Mandarin)_Reliable_Executive"}, + {"role": "科技爱好者", "code": "Chinese (Mandarin)_Mature_Woman"} + ], + "turnPattern": "random", + "tts_max_retries": 3, + "apiUrl": "https://api.minimaxi.com/v1/t2a_v2?GroupId={{group_id}}", + "request_payload": { + "model": "speech-2.5-turbo-preview", + "text": "{{text}}", + "voice_setting": { + "speed": 1.2, + "vol": 1, + "pitch": 0, + "voice_id": "{{voice_code}}" + }, + "audio_setting":{ + "sample_rate":32000, + "bitrate":128000, + "format":"mp3" + }, + "output_format":"hex", + "language_boost": "auto" + }, + "headers": { + "Authorization": "Bearer {{api_key}}", + "Content-Type": "application/json" + } +} \ No newline at end of file diff --git a/config/tts_providers.json b/config/tts_providers.json new file mode 100644 index 0000000..9e9434a --- /dev/null +++ b/config/tts_providers.json @@ -0,0 +1,22 @@ +{ + "index": { + "api_key": null + }, + "edge": { + "api_key": null + }, + "doubao": { + "X-Api-App-Id": "null", + "X-Api-Access-Key": "null" + }, + "fish": { + "api_key": "null" + }, + "minimax": { + "group_id": "null", + "api_key": "null" + }, + "gemini": { + "api_key": "null" + } +} \ No newline at end of file diff --git a/example/doubaoTTS.wav b/example/doubaoTTS.wav new file mode 100644 index 0000000..5e9aa49 Binary files /dev/null and b/example/doubaoTTS.wav differ diff --git a/example/edgeTTS.wav b/example/edgeTTS.wav new file mode 100644 index 0000000..b60a5fe Binary files /dev/null and b/example/edgeTTS.wav differ diff --git a/example/edgeTTS_podcast_1754467217.mp3 b/example/edgeTTS_podcast_1754467217.mp3 deleted file mode 100644 index 3661d0b..0000000 Binary files a/example/edgeTTS_podcast_1754467217.mp3 and /dev/null differ diff --git a/example/fish.wav b/example/fish.wav new file mode 100644 index 0000000..dd17e08 Binary files /dev/null and b/example/fish.wav differ diff --git a/example/geminiTTS.wav b/example/geminiTTS.wav new file mode 100644 index 0000000..bc774b5 Binary files /dev/null and b/example/geminiTTS.wav differ diff --git a/example/indexTTS.wav b/example/indexTTS.wav new file mode 100644 index 0000000..bf62dcb Binary files /dev/null and b/example/indexTTS.wav differ diff --git a/example/indexTTS_podcast_1754467749.mp3 b/example/indexTTS_podcast_1754467749.mp3 deleted file mode 100644 index 063fc9a..0000000 Binary files a/example/indexTTS_podcast_1754467749.mp3 and /dev/null differ diff --git a/example/minimax.wav b/example/minimax.wav new file mode 100644 index 0000000..4ebd01e Binary files /dev/null and b/example/minimax.wav differ diff --git a/ext/doubao-voice-list.py b/ext/doubao-voice-list.py new file mode 100644 index 0000000..3b70518 --- /dev/null +++ b/ext/doubao-voice-list.py @@ -0,0 +1,72 @@ +import requests +import json + +# --- 配置 --- +# 请将这里的URL替换为你要获取数据的实际URL +URL = "https://lf3-config.bytetcc.com/obj/tcc-config-web/tcc-v2-data-lab.speech.tts_middle_layer-default" # <--- 替换成你的URL +OUTPUT_FILENAME = "data_from_url_volc_bigtts.json" +# 设置请求超时(秒),防止程序因网络问题无限期等待 +TIMEOUT = 10 + +print(f"准备从URL获取数据: {URL}") + +# --- 主逻辑 --- +try: + # 1. 发送GET请求到URL + # a. requests.get() 发送请求 + # b. timeout=TIMEOUT 是一个好习惯,避免程序卡死 + response = requests.get(URL, timeout=TIMEOUT) + + # 2. 检查响应状态码,确保请求成功 (例如 200 OK) + # response.raise_for_status() 会在响应码为 4xx 或 5xx (客户端/服务器错误) 时抛出异常 + response.raise_for_status() + print("✅ HTTP请求成功,状态码: 200 OK") + + # 3. 解析最外层的JSON + # requests库的 .json() 方法可以直接将响应内容解析为Python字典 + # 这完成了我们的第一次解析 + outer_data = response.json() + + # 4. 从解析后的字典中提取内层的JSON字符串 + # 这一步可能会因为键不存在而抛出KeyError + volc_bigtts_string = outer_data['data']['volc_bigtts'] + + # 5. 解析内层的JSON字符串,得到最终的JSON数组(Python列表) + # 这一步可能会因为字符串格式不正确而抛出JSONDecodeError + final_json_array = json.loads(volc_bigtts_string) + + print("✅ 成功解析嵌套的JSON数据。") + print("解析出的数组内容:", final_json_array) + + # 6. 将最终的JSON数组写入本地文件 + with open(OUTPUT_FILENAME, 'w', encoding='utf-8') as f: + json.dump(final_json_array, f, indent=4, ensure_ascii=False) + + print(f"\n🎉 成功将数据写入文件: {OUTPUT_FILENAME}") + +# --- 错误处理 --- +# 将不同类型的错误分开捕获,可以提供更清晰的错误信息 +except requests.exceptions.HTTPError as errh: + # 捕获HTTP错误,如 404 Not Found, 500 Internal Server Error + print(f"❌ HTTP错误: {errh}") +except requests.exceptions.ConnectionError as errc: + # 捕获连接错误,如DNS查询失败、拒绝连接等 + print(f"❌ 连接错误: {errc}") +except requests.exceptions.Timeout as errt: + # 捕获请求超时 + print(f"❌ 请求超时: {errt}") +except requests.exceptions.RequestException as err: + # 捕获requests库可能抛出的其他所有异常 + print(f"❌ 请求发生未知错误: {err}") +except json.JSONDecodeError: + # 捕获JSON解析错误 + # 可能发生在 response.json() 或 json.loads() + print("❌ JSON解析失败。从URL返回的数据或内层字符串不是有效的JSON格式。") + # 如果需要调试,可以打印原始响应内容 + # print("原始响应内容:", response.text) +except KeyError: + # 捕获键错误 + print("❌ JSON结构不符合预期,找不到 'data' 或 'volc_bigtts' 键。") +except Exception as e: + # 捕获所有其他未预料到的异常 + print(f"❌ 发生未知错误: {e}") \ No newline at end of file diff --git a/podcast_generator.py b/podcast_generator.py index bd2d7df..b2701b2 100644 --- a/podcast_generator.py +++ b/podcast_generator.py @@ -13,10 +13,12 @@ from datetime import datetime from openai_cli import OpenAICli # Moved to top for proper import import urllib.parse # For URL encoding import re # For regular expression operations +from tts_adapters import TTSAdapter, IndexTTSAdapter, EdgeTTSAdapter, FishAudioAdapter, MinimaxAdapter, DoubaoTTSAdapter, GeminiTTSAdapter # Import TTS adapters # Global configuration output_dir = "output" file_list_path = os.path.join(output_dir, "file_list.txt") +tts_providers_config_path = 'config/tts_providers.json' def read_file_content(filepath): """Reads content from a given file path.""" @@ -24,35 +26,52 @@ def read_file_content(filepath): with open(filepath, 'r', encoding='utf-8') as f: return f.read() except FileNotFoundError: - print(f"Error: File not found at {filepath}") - sys.exit(1) + raise FileNotFoundError(f"Error: File not found at {filepath}") -def select_json_config(config_dir='config'): +def select_json_config(config_dir='config', return_file_path=False): """ Reads JSON files from the specified directory and allows the user to select one. Returns the content of the selected JSON file. + If return_file_path is True, returns a tuple of (file_path, content). """ json_files = glob.glob(os.path.join(config_dir, '*.json')) if not json_files: - print(f"Error: No JSON files found in {config_dir}") - sys.exit(1) + raise FileNotFoundError(f"Error: No JSON files found in {config_dir}") + valid_json_files = [] print(f"Found JSON configuration files in '{config_dir}':") for i, file_path in enumerate(json_files): - print(f"{i + 1}. {os.path.basename(file_path)}") + file_name = os.path.basename(file_path) + if file_name != "tts_providers.json": + valid_json_files.append(file_path) + print(f"{len(valid_json_files)}. {file_name}") + + if not valid_json_files: + raise FileNotFoundError(f"Error: No valid JSON files (excluding tts_providers.json) found in {config_dir}") while True: try: - choice = int(input("Enter the number of the configuration file to use: ")) - if 1 <= choice <= len(json_files): - selected_file = json_files[choice - 1] + choice_str = input("Enter the number of the configuration file to use: ") + if not choice_str: # Allow empty input to raise an error + raise ValueError("No input provided. Please enter a number.") + choice = int(choice_str) + if 1 <= choice <= len(valid_json_files): + selected_file = valid_json_files[choice - 1] print(f"Selected: {os.path.basename(selected_file)}") with open(selected_file, 'r', encoding='utf-8') as f: - return json.load(f) + content = json.load(f) + if return_file_path: + return selected_file, content + else: + return content else: - print("Invalid choice. Please enter a number within the range.") - except ValueError: - print("Invalid input. Please enter a number.") + raise ValueError("Invalid choice. Please enter a number within the range.") + except FileNotFoundError as e: + raise FileNotFoundError(f"Error loading selected JSON file: {e}") + except json.JSONDecodeError as e: + raise ValueError(f"Error decoding JSON from selected file: {e}") + except ValueError as e: + print(f"Invalid input: {e}. Please enter a number.") def generate_speaker_id_text(pod_users, voices_list): """ @@ -78,7 +97,7 @@ def generate_speaker_id_text(pod_users, voices_list): speaker_info.append(f"speaker_id={speaker_id}的名叫{found_name}") else: raise ValueError(f"语音code '{pod_user_code}' (speaker_id={speaker_id}) 未找到对应名称或alias。请检查 config/edge-tts.json 中的 voices 配置。") - + return "。".join(speaker_info) + "。" def merge_audio_files(): @@ -88,9 +107,7 @@ def merge_audio_files(): try: subprocess.run(["ffmpeg", "-version"], check=True, capture_output=True) except FileNotFoundError: - print("Error: FFmpeg is not installed or not in your PATH. Please install FFmpeg to merge audio files.") - print("You can download FFmpeg from: https://ffmpeg.org/download.html") - sys.exit(1) + raise RuntimeError("FFmpeg is not installed or not in your PATH. Please install FFmpeg to merge audio files. You can download FFmpeg from: https://ffmpeg.org/download.html") print(f"\nMerging audio files into {output_audio_filename}...") try: @@ -110,91 +127,94 @@ def merge_audio_files(): print("FFmpeg stdout:\n", process.stdout) print("FFmpeg stderr:\n", process.stderr) except subprocess.CalledProcessError as e: - print(f"Error merging audio files with FFmpeg: {e}") - print(f"FFmpeg stdout:\n", e.stdout) - print(f"FFmpeg stderr:\n", e.stderr) - sys.exit(1) + raise RuntimeError(f"Error merging audio files with FFmpeg: {e.stderr}") finally: - # Clean up temporary audio files and the file list # Clean up temporary audio files and the file list for item in os.listdir(output_dir): if item.startswith("temp_audio"): try: os.remove(os.path.join(output_dir, item)) except OSError as e: - print(f"Error removing temporary audio file {item}: {e}") + print(f"Error removing temporary audio file {item}: {e}") # This should not stop the process try: os.remove(file_list_path) except OSError as e: - print(f"Error removing file list {file_list_path}: {e}") + print(f"Error removing file list {file_list_path}: {e}") # This should not stop the process print("Cleaned up temporary files.") - -def main(): - # Parse command-line arguments +def _parse_arguments(): + """Parses command-line arguments.""" parser = argparse.ArgumentParser(description="Generate podcast script and audio using OpenAI and local TTS.") parser.add_argument("--api-key", help="OpenAI API key.") parser.add_argument("--base-url", default="https://api.openai.com/v1", help="OpenAI API base URL (default: https://api.openai.com/v1).") parser.add_argument("--model", default="gpt-3.5-turbo", help="OpenAI model to use (default: gpt-3.5-turbo).") parser.add_argument("--threads", type=int, default=1, help="Number of threads to use for audio generation (default: 1).") - args = parser.parse_args() + return parser.parse_args() +def _load_configuration(): + """Selects and loads JSON configuration, and infers tts_provider from the selected file name.""" print("Podcast Generation Script") + selected_file_path, config_data = select_json_config(return_file_path=True) + + # 从文件名中提取 tts_provider + # 假设文件名格式为 'provider-name.json' + file_name = os.path.basename(selected_file_path) + tts_provider = os.path.splitext(file_name)[0] # 移除 .json 扩展名 + + config_data["tts_provider"] = tts_provider # 将 tts_provider 添加到配置数据中 + + print("\nLoaded Configuration: " + tts_provider) + return config_data - # Step 1: Select JSON configuration - config_data = select_json_config() - print("\nLoaded Configuration:") - # print(json.dumps(config_data, indent=4)) - - # Determine final API key, base URL, and model based on priority - # Command-line args > config file > environment variables +def _prepare_openai_settings(args, config_data): + """Determines final OpenAI API key, base URL, and model based on priority.""" api_key = args.api_key or config_data.get("api_key") or os.getenv("OPENAI_API_KEY") base_url = args.base_url or config_data.get("base_url") or os.getenv("OPENAI_BASE_URL") model = args.model or config_data.get("model") # Allow model to be None if not provided anywhere - # Fallback for model if not specified if not model: model = "gpt-3.5-turbo" print(f"Using default model: {model} as it was not specified via command-line, config, or environment variables.") if not api_key: - print("Error: OpenAI API key is not set. Please provide it via --api-key, in your config file, or as an environment variable (OPENAI_API_KEY).") - sys.exit(1) + raise ValueError("Error: OpenAI API key is not set. Please provide it via --api-key, in your config file, or as an environment variable (OPENAI_API_KEY).") + return api_key, base_url, model - # Step 2: Read prompt files +def _read_prompt_files(): + """Reads content from input, overview, and podcast script prompt files.""" input_prompt = read_file_content('input.txt') overview_prompt = read_file_content('prompt/prompt-overview.txt') original_podscript_prompt = read_file_content('prompt/prompt-podscript.txt') + return input_prompt, overview_prompt, original_podscript_prompt - # 从 input_prompt 中提取自定义内容 +def _extract_custom_content(input_prompt_content): + """Extracts custom content from the input prompt.""" custom_content = "" custom_begin_tag = '```custom-begin' custom_end_tag = '```custom-end' - start_index = input_prompt.find(custom_begin_tag) + start_index = input_prompt_content.find(custom_begin_tag) if start_index != -1: - end_index = input_prompt.find(custom_end_tag, start_index + len(custom_begin_tag)) + end_index = input_prompt_content.find(custom_end_tag, start_index + len(custom_begin_tag)) if end_index != -1: - custom_content = input_prompt[start_index + len(custom_begin_tag):end_index].strip() - # 移除 input_prompt 中 ```custom-end 以上的部分,包含 ```custom-end - input_prompt = input_prompt[end_index + len(custom_end_tag):].strip() - + custom_content = input_prompt_content[start_index + len(custom_begin_tag):end_index].strip() + input_prompt_content = input_prompt_content[end_index + len(custom_end_tag):].strip() + return custom_content, input_prompt_content + +def _prepare_podcast_prompts(config_data, original_podscript_prompt, custom_content): + """Prepares the podcast script prompts with speaker info and placeholders.""" pod_users = config_data.get("podUsers", []) voices = config_data.get("voices", []) turn_pattern = config_data.get("turnPattern", "random") - # 替换 original_podscript_prompt 中的占位符 original_podscript_prompt = original_podscript_prompt.replace("{{numSpeakers}}", str(len(pod_users))) original_podscript_prompt = original_podscript_prompt.replace("{{turnPattern}}", turn_pattern) speaker_id_info = generate_speaker_id_text(pod_users, voices) - # 将自定义内容前置到 podscript_prompt - podscript_prompt = speaker_id_info + "\n\n" + original_podscript_prompt + "\n\n" + custom_content + podscript_prompt = speaker_id_info + "\n\n" + original_podscript_prompt + "\n\n" + custom_content + return podscript_prompt, pod_users, voices, turn_pattern # Return voices for potential future use or consistency - print(f"\nInput Prompt (input.txt):\n{input_prompt[:100]}...") # Display first 100 chars - print(f"\nOverview Prompt (prompt-overview.txt):\n{overview_prompt[:100]}...") - print(f"\nPodscript Prompt (prompt-podscript.txt):\n{podscript_prompt[:1000]}...") - - # Step 4 & 5: Call openai_cli to generate overview content +def _generate_overview_content(api_key, base_url, model, overview_prompt, input_prompt): + """Generates overview content using OpenAI CLI.""" print("\nGenerating overview with OpenAI CLI...") try: openai_client_overview = OpenAICli(api_key=api_key, base_url=base_url, model=model, system_message=overview_prompt) @@ -202,129 +222,121 @@ def main(): overview_content = "".join([chunk.choices[0].delta.content for chunk in overview_response_generator if chunk.choices and chunk.choices[0].delta.content]) print("Generated Overview:") print(overview_content[:100]) + return overview_content except Exception as e: - print(f"Error generating overview: {e}") - sys.exit(1) + raise RuntimeError(f"Error generating overview: {e}") - # Step 6: Call openai_cli to generate podcast script JSON +def _generate_podcast_script(api_key, base_url, model, podscript_prompt, overview_content): + """Generates and parses podcast script JSON using OpenAI CLI.""" print("\nGenerating podcast script with OpenAI CLI...") + # Initialize podscript_json_str outside try block to ensure it's always defined + podscript_json_str = "" try: openai_client_podscript = OpenAICli(api_key=api_key, base_url=base_url, model=model, system_message=podscript_prompt) - podscript_response_generator = openai_client_podscript.chat_completion(messages=[{"role": "user", "content": overview_content}]) - podscript_json_str = "".join([chunk.choices[0].delta.content for chunk in podscript_response_generator if chunk.choices and chunk.choices[0].delta.content]) - # try: - # output_script_filename = os.path.join(output_dir, f"podcast_script_{int(time.time())}.json") - # with open(output_script_filename, 'w', encoding='utf-8') as f: - # json.dump(podscript_json_str, f, ensure_ascii=False, indent=4) - # print(f"Podcast script saved to {output_script_filename}") - # except Exception as e: - # print(f"Error saving podcast script to file: {e}") - # sys.exit(1) + # Generate the response string first + podscript_json_str = "".join([chunk.choices[0].delta.content for chunk in openai_client_podscript.chat_completion(messages=[{"role": "user", "content": overview_content}]) if chunk.choices and chunk.choices[0].delta.content]) - # Attempt to parse the JSON string. OpenAI sometimes returns extra text. podcast_script = None decoder = json.JSONDecoder() idx = 0 valid_json_str = "" + while idx < len(podscript_json_str): try: obj, end = decoder.raw_decode(podscript_json_str[idx:]) - # Check if this object is the expected podcast_script if isinstance(obj, dict) and "podcast_transcripts" in obj: podcast_script = obj - valid_json_str = podscript_json_str[idx : idx + end] # Capture the exact valid JSON string - break # Found the desired JSON, stop searching - idx += end # Move to the end of the current JSON object + valid_json_str = podscript_json_str[idx : idx + end] + break + idx += end except json.JSONDecodeError: - # If decoding fails, advance index by one and continue idx += 1 - # Optionally, skip to the next potential JSON start if it's far away next_brace = podscript_json_str.find('{', idx) if next_brace != -1: idx = next_brace else: - break # No more braces, no more JSON to find + break if podcast_script is None: - print(f"Error: Could not find a valid podcast script JSON object with 'podcast_transcripts' key in response.") - print(f"Raw response: {podscript_json_str}") - sys.exit(1) + raise ValueError(f"Error: Could not find a valid podcast script JSON object with 'podcast_transcripts' key in response. Raw response: {podscript_json_str}") print("\nGenerated Podcast Script Length:"+ str(len(podcast_script.get("podcast_transcripts") or []))) - print(valid_json_str[:100] + "...") # Print beginning of the *actual* parsed JSON + print(valid_json_str[:100] + "...") if not podcast_script.get("podcast_transcripts"): - print("Warning: 'podcast_transcripts' array is empty or not found in the generated script. Nothing to convert to audio.") - sys.exit(0) # Exit gracefully if no transcripts to process - + raise ValueError("Error: 'podcast_transcripts' array is empty or not found in the generated script. Nothing to convert to audio.") + return podcast_script + except json.JSONDecodeError as e: + raise ValueError(f"Error decoding JSON from podcast script response: {e}. Raw response: {podscript_json_str}") except Exception as e: - print(f"Error generating podcast script: {e}") - sys.exit(1) + raise RuntimeError(f"Error generating podcast script: {e}") - # Step 7: Parse podcast script and generate audio - os.makedirs(output_dir, exist_ok=True) # Create output directory if it doesn't exist +def generate_audio_for_item(item, config_data, tts_adapter: TTSAdapter, max_retries: int = 3): + """Generate audio for a single podcast transcript item using the provided TTS adapter.""" + speaker_id = item.get("speaker_id") + dialog = item.get("dialog") + + voice_code = None + volume_adjustment = 0.0 # 默认值为 0.0 + speed_adjustment = 0.0 # 默认值为 0.0 + + + if config_data and "podUsers" in config_data and 0 <= speaker_id < len(config_data["podUsers"]): + pod_user_entry = config_data["podUsers"][speaker_id] + voice_code = pod_user_entry.get("code") + # 从 voices 列表中获取对应的 volume_adjustment + voice_map = {voice.get("code"): voice for voice in config_data.get("voices", []) if voice.get("code")} + volume_adjustment = voice_map.get(voice_code, {}).get("volume_adjustment", 0.0) + speed_adjustment = voice_map.get(voice_code, {}).get("speed_adjustment", 0.0) + + if not voice_code: + raise ValueError(f"No voice code found for speaker_id {speaker_id}. Cannot generate audio for this dialog.") + + # print(f"dialog-before: {dialog}") + dialog = re.sub(r'[^\w\s\-,,.。??!!\u4e00-\u9fa5]', '', dialog) + print(f"dialog: {dialog}") - def generate_audio_for_item(item, index): - """Generate audio for a single podcast transcript item.""" - speaker_id = item.get("speaker_id") - dialog = item.get("dialog") - - # Get the voice code based on speaker_id (index into config_data["person"]) - # Assuming speaker_id corresponds to the index in the 'person' array - voice_code = None - if config_data and "podUsers" in config_data and 0 <= speaker_id < len(config_data["podUsers"]): - pod_user_entry = config_data["podUsers"][speaker_id] - voice_code = pod_user_entry.get("code") - - if not voice_code: - print(f"Warning: No voice code found for speaker_id {speaker_id}. Skipping this dialog.") - return None - - # Replace placeholders in apiUrl - # URL encode the dialog before replacing {{text}} - # 移除指定标点符号,只保留逗号,句号,感叹号 - dialog = re.sub(r'[^\w\s\-,,.。??!!\u4e00-\u9fa5]', '', dialog) - print(f"dialog: {dialog}") - encoded_dialog = urllib.parse.quote(dialog) - api_url = config_data.get("apiUrl", "").replace("{{text}}", encoded_dialog).replace("{{voiceCode}}", voice_code) - - if not api_url: - print(f"Warning: apiUrl not found in config. Skipping dialog for speaker_id {speaker_id}.") - return None - + for attempt in range(max_retries): try: - print(f"Calling TTS API for speaker {speaker_id} with voice {voice_code}...") - response = requests.get(api_url, stream=True) - response.raise_for_status() # Raise an exception for bad status codes - - # Save the audio chunk to a temporary file - temp_audio_file = os.path.join(output_dir, f"temp_audio_{uuid.uuid4()}.mp3") - with open(temp_audio_file, 'wb') as f: - for chunk in response.iter_content(chunk_size=8192): - f.write(chunk) - print(f"Generated {os.path.basename(temp_audio_file)}") + print(f"Calling TTS API for speaker {speaker_id} ({voice_code}) (Attempt {attempt + 1}/{max_retries})...") + temp_audio_file = tts_adapter.generate_audio( + text=dialog, + voice_code=voice_code, + output_dir=output_dir, + volume_adjustment=volume_adjustment, # 传递音量调整参数 + speed_adjustment=speed_adjustment # 传递速度调整参数 + ) return temp_audio_file + except RuntimeError as e: # Catch specific RuntimeError from TTS adapters + print(f"Error generating audio for speaker {speaker_id} ({voice_code}) on attempt {attempt + 1}: {e}") + if attempt < max_retries - 1: + wait_time = 2 ** attempt + print(f"Retrying in {wait_time} seconds...") + time.sleep(wait_time) + else: + raise RuntimeError(f"Max retries ({max_retries}) reached for speaker {speaker_id} ({voice_code}). Audio generation failed.") + except Exception as e: # Catch other unexpected errors + raise RuntimeError(f"An unexpected error occurred for speaker {speaker_id} ({voice_code}) on attempt {attempt + 1}: {e}") - except requests.exceptions.RequestException as e: - print(f"Error calling TTS API for speaker {speaker_id} ({voice_code}): {e}") - return None - +def _generate_all_audio_files(podcast_script, config_data, tts_adapter: TTSAdapter, threads): + """Orchestrates the generation of individual audio files.""" + os.makedirs(output_dir, exist_ok=True) print("\nGenerating audio files...") + # test script + # podcast_script = json.loads("{\"podcast_transcripts\":[{\"speaker_id\":0,\"dialog\":\"欢迎收听,来生小酒馆,客官不进来喝点吗?今天咱们来唠唠AI。 小希,你有什么新鲜事来分享吗?\"},{\"speaker_id\":1,\"dialog\":\"当然了, AI 编程工具 Cursor 给开发者送上了一份大礼,付费用户现在可以限时免费体验 GPT 5 的强大编码能力\"}]}") transcripts = podcast_script.get("podcast_transcripts", []) - # Use ThreadPoolExecutor for multi-threading audio generation + max_retries = config_data.get("tts_max_retries", 3) # 从配置中获取最大重试次数,默认3次 + from concurrent.futures import ThreadPoolExecutor, as_completed - # Create a dictionary to hold results with their indices audio_files_dict = {} - with ThreadPoolExecutor(max_workers=args.threads) as executor: - # Submit all tasks with their indices + with ThreadPoolExecutor(max_workers=threads) as executor: future_to_index = { - executor.submit(generate_audio_for_item, item, i): i + executor.submit(generate_audio_for_item, item, config_data, tts_adapter, max_retries): i for i, item in enumerate(transcripts) } - # Collect results and place them in the correct order for future in as_completed(future_to_index): index = future_to_index[future] try: @@ -332,42 +344,121 @@ def main(): if result: audio_files_dict[index] = result except Exception as e: - print(f"Error generating audio for item {index}: {e}") + # Re-raise the exception to propagate it to the main thread + raise RuntimeError(f"Error generating audio for item {index}: {e}") - # Convert dictionary to list in the correct order audio_files = [audio_files_dict[i] for i in sorted(audio_files_dict.keys())] print(f"\nFinished generating individual audio files. Total files: {len(audio_files)}") - """ - Merges a list of audio files into a single output file using FFmpeg. - Args: - audio_files (list): A list of paths to the audio files to merge. - output_dir (str): The directory where the merged audio file will be saved. - """ + return audio_files + +def _create_ffmpeg_file_list(audio_files): + """Creates the file list for FFmpeg concatenation.""" if not audio_files: - print("No audio files were generated to merge.") - return + raise ValueError("No audio files were generated to merge.") - # Create a file list for ffmpeg print(f"Creating file list for ffmpeg at: {file_list_path}") with open(file_list_path, 'w', encoding='utf-8') as f: for audio_file in audio_files: - # FFmpeg concat demuxer requires paths to be relative to the file_list.txt - # or absolute. Using basename if file_list.txt is in output_dir. f.write(f"file '{os.path.basename(audio_file)}'\n") print("Content of file_list.txt:") with open(file_list_path, 'r', encoding='utf-8') as f: print(f.read()) +from typing import cast # Add import for cast + +def _initialize_tts_adapter(config_data: dict, output_dir: str) -> TTSAdapter: + """ + 根据配置数据初始化并返回相应的 TTS 适配器。 + """ + tts_provider = config_data.get("tts_provider") + if not tts_provider: + raise ValueError("TTS provider is not specified in the configuration.") + + tts_providers_config = {} + try: + tts_providers_config_content = read_file_content(tts_providers_config_path) + tts_providers_config = json.loads(tts_providers_config_content) + except Exception as e: + print(f"Warning: Could not load tts_providers.json: {e}") + + # 获取当前 tts_provider 的额外参数 + current_tts_extra_params = tts_providers_config.get(tts_provider.split('-')[0], {}) # 例如 'doubao-tts' -> 'doubao' + + if tts_provider == "index-tts": + api_url = config_data.get("apiUrl") + if not api_url: + raise ValueError("IndexTTS apiUrl is not configured.") + return IndexTTSAdapter(api_url_template=cast(str, api_url)) + elif tts_provider == "edge-tts": + api_url = config_data.get("apiUrl") + if not api_url: + raise ValueError("EdgeTTS apiUrl is not configured.") + return EdgeTTSAdapter(api_url_template=cast(str, api_url)) + elif tts_provider == "fish-audio": + api_url = config_data.get("apiUrl") + headers = config_data.get("headers") + request_payload = config_data.get("request_payload") + if not all([api_url, headers, request_payload]): + raise ValueError("FishAudio requires apiUrl, headers, and request_payload configuration.") + return FishAudioAdapter(api_url=cast(str, api_url), headers=cast(dict, headers), request_payload_template=cast(dict, request_payload), tts_extra_params=cast(dict, current_tts_extra_params)) + elif tts_provider == "minimax": + api_url = config_data.get("apiUrl") + headers = config_data.get("headers") + request_payload = config_data.get("request_payload") + if not all([api_url, headers, request_payload]): + raise ValueError("Minimax requires apiUrl, headers, and request_payload configuration.") + return MinimaxAdapter(api_url=cast(str, api_url), headers=cast(dict, headers), request_payload_template=cast(dict, request_payload), tts_extra_params=cast(dict, current_tts_extra_params)) + elif tts_provider == "doubao-tts": + api_url = config_data.get("apiUrl") + headers = config_data.get("headers") + request_payload = config_data.get("request_payload") + if not all([api_url, headers, request_payload]): + raise ValueError("DoubaoTTS requires apiUrl, headers, and request_payload configuration.") + return DoubaoTTSAdapter(api_url=cast(str, api_url), headers=cast(dict, headers), request_payload_template=cast(dict, request_payload), tts_extra_params=cast(dict, current_tts_extra_params)) + elif tts_provider == "gemini-tts": + api_url = config_data.get("apiUrl") + headers = config_data.get("headers") + request_payload = config_data.get("request_payload") + if not all([api_url, headers, request_payload]): + raise ValueError("GeminiTTS requires apiUrl, headers, and request_payload configuration.") + return GeminiTTSAdapter(api_url=cast(str, api_url), headers=cast(dict, headers), request_payload_template=cast(dict, request_payload), tts_extra_params=cast(dict, current_tts_extra_params)) + else: + raise ValueError(f"Unsupported TTS provider: {tts_provider}") + +def main(): + args = _parse_arguments() + config_data = _load_configuration() + api_key, base_url, model = _prepare_openai_settings(args, config_data) + + input_prompt_content, overview_prompt, original_podscript_prompt = _read_prompt_files() + custom_content, input_prompt = _extract_custom_content(input_prompt_content) + podscript_prompt, pod_users, voices, turn_pattern = _prepare_podcast_prompts(config_data, original_podscript_prompt, custom_content) + + print(f"\nInput Prompt (input.txt):\n{input_prompt[:100]}...") + print(f"\nOverview Prompt (prompt-overview.txt):\n{overview_prompt[:100]}...") + print(f"\nPodscript Prompt (prompt-podscript.txt):\n{podscript_prompt[:1000]}...") + + overview_content = _generate_overview_content(api_key, base_url, model, overview_prompt, input_prompt) + podcast_script = _generate_podcast_script(api_key, base_url, model, podscript_prompt, overview_content) + + tts_adapter = _initialize_tts_adapter(config_data, output_dir) # 初始化 TTS 适配器 + + audio_files = _generate_all_audio_files(podcast_script, config_data, tts_adapter, args.threads) + _create_ffmpeg_file_list(audio_files) + if __name__ == "__main__": - start_time = time.time() # Record the start time - - main() - merge_audio_files() - - end_time = time.time() # Record the end time - execution_time = end_time - start_time # Calculate total execution time - print(f"\nTotal execution time: {execution_time:.2f} seconds") + start_time = time.time() + try: + main() + merge_audio_files() + except Exception as e: + print(f"\nError: An unexpected error occurred during podcast generation: {e}", file=sys.stderr) + sys.exit(1) + finally: + end_time = time.time() + execution_time = end_time - start_time + print(f"\nTotal execution time: {execution_time:.2f} seconds") \ No newline at end of file diff --git a/prompt/prompt-podscript.txt b/prompt/prompt-podscript.txt index 1d2e168..15e1d01 100644 --- a/prompt/prompt-podscript.txt +++ b/prompt/prompt-podscript.txt @@ -57,10 +57,15 @@ You are a master podcast scriptwriter, adept at transforming diverse input conte * **Target Duration:** Create a transcript that would result in approximately 5-6 minutes of audio (around 800-1000 words total). * **Balanced Speaking Turns:** Aim for a natural conversational flow among speakers rather than extended monologues by one person. Prioritize the most important information from the source content. -7. **Personalized & Output:** +7. **Copy & Replacement:** + If a hyphen connects English letters and numbers or letters on both sides, replace it with a space. + If a hyphen has numbers on both sides, replace it with '减'. + If a hyphen has a percent sign or '%' on its left and a number on its right, replace it with '到'. + Replace four-digit Arabic numerals with their Chinese character equivalents, one-to-one. + +8. **Personalized & Output:** * **Output Format:** No explanatory text,Make sure the input language is set as the output language! - * **Begin Format:** After the opening remarks, introduce each guest who will participate in the discussion. * **End Format:** Before concluding, review and summarize the previous speeches, which are concise, concise, powerful and thought-provoking. diff --git a/tts_adapters.py b/tts_adapters.py new file mode 100644 index 0000000..d17bd49 --- /dev/null +++ b/tts_adapters.py @@ -0,0 +1,379 @@ +import os +import json # 导入 json 模块 +import base64 # 导入 base64 模块 +from msgpack.fallback import EX_CONSTRUCT +import requests +import uuid +import urllib.parse +import re # Add re import +import time # Add time import +from abc import ABC, abstractmethod +from typing import Optional # Add Optional import + +class TTSAdapter(ABC): + """ + 抽象基类,定义 TTS 适配器的接口。 + """ + @abstractmethod + def generate_audio(self, text: str, voice_code: str, output_dir: str, volume_adjustment: float = 0.0, speed_adjustment: float = 0.0) -> str: + """ + 根据文本和语音代码生成音频文件。 + + Args: + text (str): 要转换为语音的文本。 + voice_code (str): 用于生成语音的语音代码。 + output_dir (str): 生成的音频文件保存的目录。 + volume_adjustment (float): 音量调整值,正数增加,负数减少。 + + Returns: + str: 生成的音频文件路径。 + + Raises: + Exception: 如果音频生成失败。 + """ + pass + + def _apply_audio_effects(self, audio_file_path: str, volume_adjustment: float, speed_adjustment: float) -> str: + """ + 对音频文件应用音量和速度调整。 + Args: + audio_file_path (str): 原始音频文件路径。 + volume_adjustment (float): 音量调整值。例如,6.0 表示增加 6dB,-3.0 表示减少 3dB。 + speed_adjustment (float): 速度调整值,正数增加,负数减少。speed_adjustment 是百分比,例如 10 表示 +10%,-10 表示 -10%。 + Returns: + str: 调整后的音频文件路径。 + Raises: + ImportError: 如果 'pydub' 模块未安装。 + RuntimeError: 如果音频效果调整失败。 + """ + if volume_adjustment == 0.0 and speed_adjustment == 0.0: + return audio_file_path + + try: + from pydub import AudioSegment + except ImportError: + raise ImportError("The 'pydub' module is required for audio adjustments. Please install it using 'pip install pydub'.") + + current_audio_file = audio_file_path + base, ext = os.path.splitext(audio_file_path) + + try: + audio = AudioSegment.from_file(current_audio_file) + + # 应用音量调整 + if volume_adjustment != 0.0: + adjusted_audio = audio + volume_adjustment + new_file_path = f"{base}_vol_adjusted{ext}" + adjusted_audio.export(new_file_path, format=ext[1:]) + os.remove(current_audio_file) + current_audio_file = new_file_path + audio = adjusted_audio + print(f"Applied volume adjustment of {volume_adjustment} dB to {os.path.basename(current_audio_file)}") + + # 应用速度调整 + if speed_adjustment != 0.0: + speed_multiplier = 1 + speed_adjustment / 100.0 + adjusted_audio = audio.speedup(playback_speed=speed_multiplier, chunk_size=150, crossfade=25) + new_file_path = f"{base}_speed_adjusted{ext}" + adjusted_audio.export(new_file_path, format=ext[1:]) + if current_audio_file != audio_file_path and os.path.exists(current_audio_file): # 只有当 current_audio_file 是中间文件时才删除 + os.remove(current_audio_file) + else: # 如果没有音量调整,current_audio_file 仍然是原始文件 + os.remove(audio_file_path) + current_audio_file = new_file_path + print(f"Applied speed adjustment of {speed_adjustment}% to {os.path.basename(current_audio_file)}") + + return current_audio_file + + except Exception as e: + # 如果发生错误,清理任何中间文件 + if current_audio_file != audio_file_path and os.path.exists(current_audio_file): + os.remove(current_audio_file) + raise RuntimeError(f"Error applying audio effects to {os.path.basename(audio_file_path)}: {e}") + + +class IndexTTSAdapter(TTSAdapter): + """ + IndexTTS 的 TTS 适配器实现。 + """ + def __init__(self, api_url_template: str): + self.api_url_template = api_url_template + + def generate_audio(self, text: str, voice_code: str, output_dir: str, volume_adjustment: float = 0.0, speed_adjustment: float = 0.0) -> str: + encoded_text = urllib.parse.quote(text) + + api_url = self.api_url_template.replace("{{text}}", encoded_text).replace("{{voiceCode}}", voice_code) + + if not api_url: + raise ValueError("API URL is not configured for IndexTTS. Cannot generate audio.") + + try: + print(f"Calling IndexTTS API with voice {voice_code}...") + response = requests.get(api_url, stream=True, timeout=30) + response.raise_for_status() + + temp_audio_file = os.path.join(output_dir, f"temp_audio_{uuid.uuid4()}.wav") + with open(temp_audio_file, 'wb') as f: + for chunk in response.iter_content(chunk_size=8192): + f.write(chunk) + print(f"Generated {os.path.basename(temp_audio_file)}") + # 应用音量调整 + final_audio_file = self._apply_audio_effects(temp_audio_file, volume_adjustment, speed_adjustment) + return final_audio_file + + except requests.exceptions.RequestException as e: + raise RuntimeError(f"Error calling IndexTTS API with voice {voice_code}: {e}") + except Exception as e: # Catch other potential errors like JSON parsing or data decoding + raise RuntimeError(f"Error processing IndexTTS API response for voice {voice_code}: {e}") + +class EdgeTTSAdapter(TTSAdapter): + """ + EdgeTTS 的 TTS 适配器实现。 + """ + def __init__(self, api_url_template: str): + self.api_url_template = api_url_template + + def generate_audio(self, text: str, voice_code: str, output_dir: str, volume_adjustment: float = 0.0, speed_adjustment: float = 0.0) -> str: + encoded_text = urllib.parse.quote(text) + + api_url = self.api_url_template.replace("{{text}}", encoded_text).replace("{{voiceCode}}", voice_code) + + if not api_url: + raise ValueError("API URL is not configured for EdgeTTS. Cannot generate audio.") + + try: + print(f"Calling EdgeTTS API with voice {voice_code}...") + response = requests.get(api_url, stream=True, timeout=30) + response.raise_for_status() + + temp_audio_file = os.path.join(output_dir, f"temp_audio_{uuid.uuid4()}.mp3") + with open(temp_audio_file, 'wb') as f: + for chunk in response.iter_content(chunk_size=8192): + f.write(chunk) + print(f"Generated {os.path.basename(temp_audio_file)}") + # 应用音量调整 + final_audio_file = self._apply_audio_effects(temp_audio_file, volume_adjustment, speed_adjustment) + return final_audio_file + + except requests.exceptions.RequestException as e: + raise RuntimeError(f"Error calling EdgeTTS API with voice {voice_code}: {e}") + except Exception as e: # Catch other potential errors like JSON parsing or data decoding + raise RuntimeError(f"Error processing EdgeTTS API response for voice {voice_code}: {e}") + +# 尝试导入 msgpack +class FishAudioAdapter(TTSAdapter): + """ + FishAudio 的 TTS 适配器实现。 + """ + def __init__(self, api_url: str, headers: dict, request_payload_template: dict, tts_extra_params: Optional[dict] = None): + self.api_url = api_url + self.headers = headers + self.request_payload_template = request_payload_template + self.tts_extra_params = tts_extra_params if tts_extra_params is not None else {} + + def generate_audio(self, text: str, voice_code: str, output_dir: str, volume_adjustment: float = 0.0, speed_adjustment: float = 0.0) -> str: + try: + import msgpack # 延迟导入 msgpack + except ImportError: + raise ImportError("The 'msgpack' module is required for FishAudioAdapter. Please install it using 'pip install msgpack'.") + + # 构造请求体 + payload = self.request_payload_template.copy() + payload["text"] = text + payload["reference_id"] = voice_code + self.headers["Authorization"] = self.headers["Authorization"].replace("{{api_key}}", self.tts_extra_params["api_key"]) + + # 使用 msgpack 打包请求体 + packed_payload = msgpack.packb(payload, use_bin_type=True) + + try: + print(f"Calling FishAudio API with voice {voice_code}...") + response = requests.post(self.api_url, data=packed_payload, headers=self.headers, timeout=60) # Increased timeout for FishAudio + + temp_audio_file = os.path.join(output_dir, f"temp_audio_{uuid.uuid4()}.mp3") + with open(temp_audio_file, "wb") as f: + f.write(response.content) + + print(f"Generated {os.path.basename(temp_audio_file)}") + # 应用音量调整 + final_audio_file = self._apply_audio_effects(temp_audio_file, volume_adjustment, speed_adjustment) + return final_audio_file + + except requests.exceptions.RequestException as e: + raise RuntimeError(f"Error calling FishAudio API with voice {voice_code}: {e}") + except Exception as e: # Catch other potential errors like JSON parsing or data decoding + raise RuntimeError(f"Error processing FishAudio API response for voice {voice_code}: {e}") + + +class MinimaxAdapter(TTSAdapter): + """ + Minimax 的 TTS 适配器实现。 + """ + def __init__(self, api_url: str, headers: dict, request_payload_template: dict, tts_extra_params: Optional[dict] = None): + self.api_url = api_url + self.headers = headers + self.request_payload_template = request_payload_template + self.tts_extra_params = tts_extra_params if tts_extra_params is not None else {} + + def generate_audio(self, text: str, voice_code: str, output_dir: str, volume_adjustment: float = 0.0, speed_adjustment: float = 0.0) -> str: + + # 构造请求体 + payload = self.request_payload_template.copy() + payload["text"] = text + payload["voice_setting"]["voice_id"] = voice_code + self.headers["Authorization"] = self.headers["Authorization"].replace("{{api_key}}", self.tts_extra_params["api_key"]) + self.api_url = self.api_url.replace("{{group_id}}", self.tts_extra_params["group_id"]) + + # Minimax 返回十六进制编码的音频数据,需要解码 + if payload.get("output_format") == "hex": + is_hex_output = True + else: + is_hex_output = False + + try: + print(f"Calling Minimax API with voice {voice_code}...") + response = requests.post(self.api_url, json=payload, headers=self.headers, timeout=60) # Increased timeout for Minimax + + temp_audio_file = os.path.join(output_dir, f"temp_audio_{uuid.uuid4()}.mp3") + response_data = response.json() + # 解析并保存音频数据 + if is_hex_output: + audio_hex = response_data.get('data', {}).get('audio') + audio_bytes = bytes.fromhex(audio_hex) + with open(temp_audio_file, "wb") as f: + f.write(audio_bytes) + else: + audio_url = response_data.get('data', {}).get('audio') + if not audio_url: + raise RuntimeError("Minimax API returned success but no audio URL found when output_format is not hex.") + + # 下载音频文件 + audio_response = requests.get(audio_url, stream=True, timeout=30) + audio_response.raise_for_status() + with open(temp_audio_file, 'wb') as f: + for chunk in audio_response.iter_content(chunk_size=8192): + f.write(chunk) + + print(f"Generated {os.path.basename(temp_audio_file)}") + # 应用音量调整 + final_audio_file = self._apply_audio_effects(temp_audio_file, volume_adjustment, speed_adjustment) + return final_audio_file + + except requests.exceptions.RequestException as e: + raise RuntimeError(f"Error calling Minimax API with voice {voice_code}: {e}") + except Exception as e: # Catch other potential errors like JSON parsing or data decoding + raise RuntimeError(f"Error processing Minimax API response for voice {voice_code}: {e}") + + +class DoubaoTTSAdapter(TTSAdapter): + """ + 豆包TTS 的 TTS 适配器实现。 + """ + def __init__(self, api_url: str, headers: dict, request_payload_template: dict, tts_extra_params: Optional[dict] = None): + self.api_url = api_url + self.headers = headers + self.request_payload_template = request_payload_template + self.tts_extra_params = tts_extra_params if tts_extra_params is not None else {} + + def generate_audio(self, text: str, voice_code: str, output_dir: str, volume_adjustment: float = 0.0, speed_adjustment: float = 0.0) -> str: + session = requests.Session() + try: + payload = self.request_payload_template.copy() + payload['req_params']['text'] = text + payload['req_params']['speaker'] = voice_code + self.headers["X-Api-App-Id"] = self.headers["X-Api-App-Id"].replace("{{X-Api-App-Id}}", self.tts_extra_params["X-Api-App-Id"]) + self.headers["X-Api-Access-Key"] = self.headers["X-Api-Access-Key"].replace("{{X-Api-Access-Key}}", self.tts_extra_params["X-Api-Access-Key"]) + + print(f"Calling Doubao TTS API with voice {voice_code}...") + response = session.post(self.api_url, headers=self.headers, json=payload, stream=True, timeout=30) + response.raise_for_status() + + audio_data = bytearray() + 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"]: + import base64 + 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: + raise RuntimeError(f"Doubao TTS API returned error: {data}") + + if not audio_data: + raise RuntimeError("Doubao TTS API returned success but no audio data received.") + + temp_audio_file = os.path.join(output_dir, f"temp_audio_{uuid.uuid4()}.mp3") + with open(temp_audio_file, "wb") as f: + f.write(audio_data) + + print(f"Generated {os.path.basename(temp_audio_file)}") + # 应用音量调整 + final_audio_file = self._apply_audio_effects(temp_audio_file, volume_adjustment, speed_adjustment) + return final_audio_file + + except requests.exceptions.RequestException as e: + raise RuntimeError(f"Error calling Doubao TTS API with voice {voice_code}: {e}") + except Exception as e: + raise RuntimeError(f"Error processing Doubao TTS API response for voice {voice_code}: {e}") + finally: + session.close() + + +class GeminiTTSAdapter(TTSAdapter): + """ + Gemini TTS 的 TTS 适配器实现。 + """ + def __init__(self, api_url: str, headers: dict, request_payload_template: dict, tts_extra_params: Optional[dict] = None): + self.api_url = api_url + self.headers = headers + self.request_payload_template = request_payload_template + self.tts_extra_params = tts_extra_params if tts_extra_params is not None else {} + + def generate_audio(self, text: str, voice_code: str, output_dir: str, volume_adjustment: float = 0.0, speed_adjustment: float = 0.0) -> str: + try: + # 构造请求体 + payload = self.request_payload_template.copy() + model_name = payload['model'] + api_url = self.api_url.replace('{{model}}', model_name) if '{{model}}' in self.api_url else self.api_url + + # 更新请求 payload + payload['contents'][0]['parts'][0]['text'] = text + payload['generationConfig']['speechConfig']['voiceConfig']['prebuiltVoiceConfig']['voiceName'] = voice_code + + # 更新 headers 中的 API key + gemini_api_key = self.tts_extra_params.get('api_key') + self.headers['x-goog-api-key'] = gemini_api_key + + print(f"Calling Gemini TTS API with voice {voice_code}...") + response = requests.post(api_url, headers=self.headers, json=payload, timeout=60) + response.raise_for_status() + + response_data = response.json() + audio_data_base64 = response_data['candidates'][0]['content']['parts'][0]['inlineData']['data'] + audio_data_pcm = base64.b64decode(audio_data_base64) + + # Gemini 返回的是 PCM 数据,需要保存为 WAV + temp_audio_file = os.path.join(output_dir, f"temp_audio_{uuid.uuid4()}.wav") # 更改为 .wav 扩展名 + import wave # 导入 wave 模块 + with wave.open(temp_audio_file, "wb") as f: + f.setnchannels(1) + f.setsampwidth(2) # 假设 16-bit PCM + f.setframerate(24000) # 假设 24kHz 采样率 + f.writeframes(audio_data_pcm) + + print(f"Generated {os.path.basename(temp_audio_file)}") + # 应用音量和速度调整 + final_audio_file = self._apply_audio_effects(temp_audio_file, volume_adjustment, speed_adjustment) + return final_audio_file + + except requests.exceptions.RequestException as e: + raise RuntimeError(f"Error calling Gemini TTS API with voice {voice_code}: {e}") + except Exception as e: + raise RuntimeError(f"Error processing Gemini TTS API response for voice {voice_code}: {e}") \ No newline at end of file