📝 提示: 本API提供音色克隆功能,支持流式处理长音频。所有接口返回JSON格式数据。
GET
/api/health
功能:检查API服务是否正常运行
请求参数:无
响应示例:
{
"status": "ok",
"message": "OpenVoice API is running",
"sample_rate": 22050
}
POST
/api/clone
功能:执行音色克隆,将源音频的音色转换为目标音色
Content-Type:application/json
请求参数:
| 参数名 |
类型 |
必需 |
说明 |
| target_audio |
string |
是 |
目标音频的base64编码(要模仿的声音),支持data URL格式或纯base64 |
| source_audio |
string |
是 |
源音频的base64编码(要转换的音频),支持data URL格式或纯base64 |
| tau |
float |
否 |
音色混合强度(0-1),默认0.3。值越大,目标音色特征越明显 |
请求示例:
POST /api/clone
Content-Type: application/json
{
"target_audio": "data:audio/wav;base64,UklGRi...",
"source_audio": "data:audio/wav;base64,UklGRi...",
"tau": 0.3
}
响应示例:
{
"success": true,
"message": "音色克隆成功",
"result_audio": "UklGRi...",
"stats": {
"extract_time": "1.23s",
"clone_time": "2.45s",
"total_time": "3.68s"
}
}
💡 注意:
- 返回的
result_audio 是纯base64字符串(不含data URL前缀)
- 前端应将其封装为
data:audio/wav;base64,{result_audio} 格式使用
- 音频长度超过10秒时,建议在客户端切分后逐段请求,最后合并结果
GET
/api/info
功能:获取模型信息
请求参数:无
响应示例:
{
"model": "OpenVoice Tone Clone",
"version": "v2",
"sample_rate": 22050,
"target_length": 1024,
"tone_dimension": 256,
"supported_formats": ["wav", "mp3", "flac", "ogg"]
}
📖 JavaScript 使用示例
基础用法:
// 将文件转换为base64
async function fileToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
// 调用API
const targetBase64 = await fileToBase64(targetFile);
const sourceBase64 = await fileToBase64(sourceFile);
const response = await fetch('/api/clone', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
target_audio: targetBase64,
source_audio: sourceBase64,
tau: 0.3
})
});
const result = await response.json();
if (result.success) {
// 使用结果音频
const audioSrc = `data:audio/wav;base64,${result.result_audio}`;
audioElement.src = audioSrc;
}
流式处理长音频:
// 1. 使用Web Audio API切分音频
const audioContext = new AudioContext();
const audioBuffer = await audioContext.decodeAudioData(fileArrayBuffer);
const segmentDuration = 10 * audioBuffer.sampleRate; // 10秒
const segments = [];
for (let i = 0; i < audioBuffer.length; i += segmentDuration) {
// 提取片段并转换为base64
const segmentData = extractSegment(audioBuffer, i, segmentDuration);
segments.push(await convertToBase64(segmentData));
}
// 2. 并发或顺序处理所有片段
const results = [];
for (const segment of segments) {
const response = await fetch('/api/clone', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
target_audio: targetBase64,
source_audio: segment,
tau: 0.3
})
});
results.push((await response.json()).result_audio);
}
// 3. 合并所有片段
const mergedAudio = await mergeSegments(results);
📖 Python 使用示例
import base64
import requests
# 读取音频文件并编码为base64
def audio_to_base64(file_path):
with open(file_path, 'rb') as f:
return base64.b64encode(f.read()).decode('utf-8')
# 准备数据
target_base64 = audio_to_base64('target.wav')
source_base64 = audio_to_base64('source.wav')
# 发送请求
response = requests.post('http://localhost:5000/api/clone', json={
'target_audio': target_base64,
'source_audio': source_base64,
'tau': 0.3
})
result = response.json()
if result['success']:
# 保存结果
audio_data = base64.b64decode(result['result_audio'])
with open('output.wav', 'wb') as f:
f.write(audio_data)
⚙️ 参数说明
| 参数 |
范围 |
推荐值 |
效果说明 |
| tau |
0.0 - 1.0 |
0.3 - 0.5 |
控制目标音色的影响强度。值越大,目标音色特征越明显 |
💡 Tau参数建议:
- 0.0 - 0.2:保持源音频音色,目标音色影响较小
- 0.3 - 0.5:平衡模式,推荐用于大多数场景
- 0.6 - 1.0:强烈应用目标音色特征
❓ 常见问题
Q: 支持哪些音频格式?
A: 支持常见格式:WAV, MP3, FLAC, OGG
Q: 音频时长有限制吗?
A: 单次请求建议不超过30秒,长音频请使用流式处理切分为10秒片段
Q: 如何提高克隆效果?
A: 使用清晰、无背景噪音的目标音频,时长建议2-10秒
Q: API返回什么格式的音频?
A: 返回WAV格式的base64编码字符串,采样率为22050Hz