🎤 OpenVoice 音色克隆

使用AI技术提取并克隆语音音色

目标音色(要模仿的声音)

文件名: -

大小: -

🎵 音频预览:

源音频(要转换的音频)

文件名: -

大小: -

🎵 音频预览:

0.3
0%
进度: 0 / 0 片段

状态

等待上传文件...

模型 OpenVoice v2

采样率 22050 Hz

音色维度 256

API 使用文档

📝 提示: 本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