OpenVoice
在 Clore.ai 上使用 OpenVoice 通过几秒音频克隆任意声音
最后更新于
这有帮助吗?
这有帮助吗?
pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime22/tcp
7860/httppip install git+https://github.com/myshell-ai/OpenVoice.git gradio && \
python -c "
print(f"已生成:{name}")
from openvoice import se_extractor
from openvoice.api import ToneColorConverter
import torch
ckpt_converter = 'checkpoints_v2/converter'
device = 'cuda'
tone_color_converter = ToneColorConverter(f'{ckpt_converter}/config.json', device=device)
tone_color_converter.load_ckpt(f'{ckpt_converter}/checkpoint.pth')
def clone(source_audio, reference_audio):
source_se, _ = se_extractor.get_se(source_audio, tone_color_converter, vad=False)
target_se, _ = se_extractor.get_se(reference_audio, tone_color_converter, vad=False)
output_path = 'output.wav'
tone_color_converter.convert(
audio_src_path=source_audio,
src_se=source_se,
tgt_se=target_se,
output_path=output_path
)
return output_path
demo = gr.Interface(
fn=clone,
inputs=[gr.Audio(type='filepath', label='Source'), gr.Audio(type='filepath', label='Target Voice')],
outputs=gr.Audio(label='Cloned'),
title='OpenVoice Clone'
)
demo.launch(server_name='0.0.0.0', server_port=7860)
"git clone https://github.com/myshell-ai/OpenVoice.git
cd OpenVoice
pip install -e .
# Download checkpoints
python -c "from huggingface_hub import snapshot_download; snapshot_download(repo_id='myshell-ai/OpenVoice', local_dir='checkpoints')"from openvoice import se_extractor
from openvoice.api import ToneColorConverter
import torch
# 初始化
device = "cuda" if torch.cuda.is_available() else "cpu"
ckpt_converter = 'checkpoints_v2/converter'
tone_color_converter = ToneColorConverter(
f'{ckpt_converter}/config.json',
device=device
)
tone_color_converter.load_ckpt(f'{ckpt_converter}/checkpoint.pth')
# Extract speaker embeddings
source_se, _ = se_extractor.get_se("source_audio.wav", tone_color_converter, vad=False)
target_se, _ = se_extractor.get_se("target_voice.wav", tone_color_converter, vad=False)
# Convert voice
tone_color_converter.convert(
audio_src_path="source_audio.wav",
src_se=source_se,
tgt_se=target_se,
output_path="output.wav"
)from openvoice import se_extractor
from openvoice.api import ToneColorConverter, BaseSpeakerTTS
from melo.api import TTS
# Initialize TTS
tts = TTS(language='EN', device=device)
speaker_ids = tts.hps.data.spk2id
# Generate base speech
tts.tts_to_file("Hello, this is a test.", speaker_ids['EN-US'], "base.wav")
# Clone to target voice
source_se, _ = se_extractor.get_se("base.wav", tone_color_converter, vad=False)
target_se, _ = se_extractor.get_se("target_voice.wav", tone_color_converter, vad=False)
tone_color_converter.convert(
audio_src_path="base.wav",
src_se=source_se,
tgt_se=target_se,
output_path="cloned_speech.wav"
)from melo.api import TTS
# Available languages
languages = ['EN', 'ES', 'FR', 'ZH', 'JP', 'KR']
# English
tts_en = TTS(language='EN', device=device)
tts_en.tts_to_file("Hello world", tts_en.hps.data.spk2id['EN-US'], "en.wav")
# Chinese
tts_zh = TTS(language='ZH', device=device)
tts_zh.tts_to_file("你好世界", tts_zh.hps.data.spk2id['ZH'], "zh.wav")
# Japanese
tts_jp = TTS(language='JP', device=device)
tts_jp.tts_to_file("こんにちは", tts_jp.hps.data.spk2id['JP'], "jp.wav")from openvoice.api import BaseSpeakerTTS
# Base TTS with styles
base_speaker_tts = BaseSpeakerTTS(
f'{ckpt_base}/config.json',
device=device
)
base_speaker_tts.load_ckpt(f'{ckpt_base}/checkpoint.pth')
# Available styles
styles = ['default', 'whispering', 'cheerful', 'terrified', 'angry', 'sad', 'friendly']
for style in styles:
base_speaker_tts.tts(
"This is a test sentence.",
f"output_{style}.wav",
speaker='default',
language='English',
style=style
)批处理处理
from openvoice import se_extractor
from openvoice.api import ToneColorConverter
tone_color_converter = ToneColorConverter(
f'{ckpt_converter}/config.json',
device='cuda'
)
tone_color_converter.load_ckpt(f'{ckpt_converter}/checkpoint.pth')
# Get target voice embedding once
target_se, _ = se_extractor.get_se("target_voice.wav", tone_color_converter, vad=False)
input_dir = "./audio_files"
output_dir = "./cloned"
output_dir = "./relit"
lighting_prompt = "专业影棚照明,柔和的阴影"
if filename.endswith(('.wav', '.mp3')):
input_path = os.path.join(input_dir, filename)
output_path = os.path.join(output_dir, f"cloned_{filename}")
source_se, _ = se_extractor.get_se(input_path, tone_color_converter, vad=False)
tone_color_converter.convert(
audio_src_path=input_path,
src_se=source_se,
tgt_se=target_se,
output_path=output_path
)
print(f"Cloned: {filename}")from fastapi import FastAPI, UploadFile
from fastapi.responses import FileResponse
from openvoice import se_extractor
from openvoice.api import ToneColorConverter
import tempfile
import shutil
app = FastAPI()
tone_color_converter = ToneColorConverter(
'checkpoints_v2/converter/config.json',
device='cuda'
)
tone_color_converter.load_ckpt('checkpoints_v2/converter/checkpoint.pth')
@app.post("/clone")
async def clone_voice(source: UploadFile, target: UploadFile):
# Save uploaded files
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as src_tmp:
shutil.copyfileobj(source.file, src_tmp)
src_path = src_tmp.name
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tgt_tmp:
shutil.copyfileobj(target.file, tgt_tmp)
tgt_path = tgt_tmp.name
# Extract embeddings
source_se, _ = se_extractor.get_se(src_path, tone_color_converter, vad=False)
target_se, _ = se_extractor.get_se(tgt_path, tone_color_converter, vad=False)
# 转换
output_path = tempfile.mktemp(suffix=".wav")
tone_color_converter.convert(
audio_src_path=src_path,
src_se=source_se,
tgt_se=target_se,
output_path=output_path
)
return FileResponse(output_path, media_type="audio/wav")
# 运行:uvicorn server:app --host 0.0.0.0 --port 8000import librosa
import soundfile as sf
def preprocess_audio(input_path, output_path, target_sr=22050):
audio, sr = librosa.load(input_path, sr=target_sr)
# Trim silence
audio, _ = librosa.effects.trim(audio, top_db=20)
# Normalize
audio = librosa.util.normalize(audio)
sf.write(output_path, audio, target_sr)
return output_path
preprocess_audio("raw_reference.wav", "clean_reference.wav")