Spaces:
Sleeping
Sleeping
File size: 8,220 Bytes
e1b91c5 4fc7b93 e1b91c5 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 00d371a 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 9c78e6e 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 a58537c 4fc7b93 3766aa9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
---
title: Genie Tts
emoji: 😻
colorFrom: green
colorTo: pink
sdk: docker
pinned: false
---
---
## Genie TTS API 使用文档
### 1. 概述
本文档旨在指导开发者如何调用部署在 Hugging Face Spaces 上的 Genie TTS 服务。该服务允许您通过 API 请求,使用预加载的角色模型将文本转换为高质量的语音。
**API 基地址 (Base URL):**
```
https://clown145-genie-tts-t.hf.space
```
### 2. 核心使用流程
本 API 的核心工作流程分为两步,**每次语音合成都需要完整执行这两个步骤**:
1. **设置参考音频 (`/set_reference_audio`)**: 为指定的角色设置一段参考音频和对应的文本。这一步是为了让模型能够克隆出参考音频中的情感和语调。
2. **请求语音合成 (`/tts`)**: 发送你想要合成的文本,服务器将返回对应的原始音频数据流。
### 3. API 端点详解
#### 3.1 设置参考音频
此端点用于为即将进行的 TTS 任务设置声音克隆所需的参考音频。
* **Endpoint**: `POST /set_reference_audio`
* **Method**: `POST`
* **描述**: 为指定角色设置参考音频及其文本。这是成功进行语音合成的**前提条件**。
* **请求体 (Request Body)**: `JSON`
```json
{
"character_name": "aoi",
"audio_path": "reference_audio/12b00400a02.ogg",
"audio_text": "世界の外に電波発信してるの"
}
```
* **参数说明**:
* `character_name` (string, 必需): 你想要使用的角色名称。此名称必须与服务器启动时加载的某个角色匹配 (例如: "aoi", "kisaki", "may")。
* `audio_path` (string, 必需): 参考音频文件在 **Hugging Face 仓库中的相对路径**。服务器会在其下载的代码库中自动查找此文件。
* `audio_text` (string, 必需): 与参考音频文件内容完全匹配的文本。
* **响应 (Response)**:
* **成功**:
* **状态码**: `200 OK`
* **内容**: `{"message": "Reference audio set successfully."}`
* **失败**:
* **状态码**: `404 Not Found` (如果角色未找到)
#### 3.2 请求语音合成
在设置好参考音频后,使用此端点来生成语音。
* **Endpoint**: `POST /tts`
* **Method**: `POST`
* **描述**: 根据传入的文本,为当前设置了参考音频的角色生成语音,并以原始音频流的形式返回。
* **请求体 (Request Body)**: `JSON`
```json
{
"character_name": "aoi",
"text": "これからもし同じようなことがあっても",
"split_sentence": true
}
```
* **参数说明**:
* `character_name` (string, 必需): 你想要使用的角色名称,必须与上一步中设置的角色一致。
* `text` (string, 必需): 你想要转换为语音的文本。
* `split_sentence` (boolean, 可选): 是否自动切分句子,默认为 `false`。推荐设置为 `true` 以获得更好的效果。
* **响应 (Response)**:
* **成功**:
* **状态码**: `200 OK`
* **内容**: **纯原始音频数据流 (Raw PCM Audio Stream)**。
* **格式**: 单声道 (1 Channel)
* **采样率**: 32000 Hz
* **位深**: 16-bit PCM
* **失败**:
* **状态码**: `400 Bad Request` (如果未先设置参考音频)
### 4. 重要注意事项
* **合成文本限制**: 只能合成日语。
* **模型加载限制**: 当前服务配置为在启动时加载 **最多 3 个** 角色模型。请确保你请求的角色在预加载的名单中。
* **音频输出格式**: `/tts` 接口返回的**不是一个 `.wav` 文件**,而是构成 `.wav` 文件的核心——原始 PCM 音频数据。客户端接收到数据后,需要自行使用 `wave` 等库来构建一个可播放的 `.wav` 文件。
* **关于 `/load_character`**: 你可能在文档中看到过此接口,但在当前部署中,所有模型都在服务器启动时加载。**客户端无需也不应调用 `/load_character` 接口**。
### 5. 完整 Python 客户端示例
这是一个可以直接运行的 Python 脚本,展示了如何正确调用 API 并将返回的音频流保存为可播放的 `.wav` 文件。
```python
# client_example.py
import requests
import time
import os
import wave # 导入 Python 标准的 wave 库,用于正确生成 .wav 文件
# --- API 配置 ---
BASE_URL = "https://clown145-genie-tts.hf.space"
# --- 音频参数 (必须与服务器输出匹配) ---
BYTES_PER_SAMPLE = 2 # 16-bit 音频
CHANNELS = 1 # 单声道
SAMPLE_RATE = 32000 # 32kHz 采样率
# --- 角色配置 ---
CHARACTERS = {
"aoi": {
"ref_audio": "reference_audio/12b00400a02.ogg",
"ref_text": "世界の外に電波発信してるの"
},
"kisaki": {
"ref_audio": "reference_audio/Kisaki_802.ogg",
"ref_text": "ほら、ホタルもとても喜んでいます。ルリもそう呼んであげてくださいね。"
},
# 你可以在这里添加 'may' 或其他预加载的角色
}
def synthesize_speech_to_file(character_name, text_to_synthesize, output_path):
"""
一个完整的调用流程:设置参考 -> 合成语音 -> 构建WAV文件。
"""
if character_name not in CHARACTERS:
print(f"错误:角色 '{character_name}' 未在配置中定义。")
return
print(f"\n--- 开始为角色 '{character_name}' 合成语音 ---")
char_info = CHARACTERS[character_name]
# 步骤 1: 动态设置参考音频
print("[Client] 步骤 1: 正在设置参考音频...")
ref_payload = {
"character_name": character_name,
"audio_path": char_info["ref_audio"],
"audio_text": char_info["ref_text"]
}
try:
response = requests.post(f"{BASE_URL}/set_reference_audio", json=ref_payload, timeout=60)
response.raise_for_status()
print(f"[Client] 角色 '{character_name}' 的参考音频设置成功。")
except requests.exceptions.RequestException as e:
print(f"[Client] 设置参考音频失败: {e}")
return
# 步骤 2: 请求 TTS 并将返回的原始音频流构建为 WAV 文件
print(f"[Client] 步骤 2: 正在请求 TTS 并准备构建 WAV 文件到 {output_path}...")
tts_payload = {
"character_name": character_name,
"text": text_to_synthesize,
"split_sentence": True
}
try:
with requests.post(f"{BASE_URL}/tts", json=tts_payload, stream=True, timeout=300) as response:
response.raise_for_status()
# 使用 wave 库来正确写入文件
with wave.open(output_path, 'wb') as wf:
# 这三行代码至关重要,它们会为原始音频数据写入正确的 WAV 文件头
wf.setnchannels(CHANNELS)
wf.setsampwidth(BYTES_PER_SAMPLE)
wf.setframerate(SAMPLE_RATE)
# 接收原始音频流数据块,并写入文件
print("[Client] 正在接收音频流并写入 WAV 文件...")
for chunk in response.iter_content(chunk_size=8192):
if chunk:
wf.writeframes(chunk)
print(f"[Client] 🎉 恭喜!音频已成功构建并保存到: {output_path}")
except requests.exceptions.RequestException as e:
print(f"[Client] TTS 请求失败: {e}")
except Exception as e:
print(f"[Client] 保存文件时发生错误: {e}")
if __name__ == "__main__":
# 确保输出文件夹存在
if not os.path.exists("outputs"):
os.makedirs("outputs")
# --- 示例调用 ---
print("\n" + "="*50)
synthesize_speech_to_file(
character_name="aoi",
text_to_synthesize="これは最初のテストです。",
output_path="outputs/aoi_output.wav"
)
time.sleep(1) # 短暂间隔,避免请求过于频繁
print("\n" + "="*50)
synthesize_speech_to_file(
character_name="kisaki",
text_to_synthesize="次の音声合成もお願いします。",
output_path="outputs/kisaki_output.wav"
)
``` |