OpenVoice本地部署教程与踩坑记录
前言
OpenVoice是一种多功能的即时声音克隆方法,它只需要参考发言者的一小段音频片段,就可以复制他们的声音并用多种语言生成语音。更多介绍详见博文【Python趋势榜-OpenVoice】,官方仓库地址【https://github.com/myshell-ai/OpenVoice】
简单的说,OpenVoice可以克隆语音,只需要一段几十秒的录音就可以得到很不错的模仿效果。甚至男声转女声的效果也很不错,这就有很大的想象空间。目前官方的做法是通过算法学习录音文件的音色和发音习惯,然后将文本通过TTS转为语音,再用学习到的音色特征转换语音得到最终音频文件,其中还可以对生成的文件加入特殊水印从而保证不被滥用。
部署
准备环境
本项目运行在python3.9,可以到python官网下载对应的版本【python-3.9.10-amd64.exe】,也可以使用conda创建。自行安装的记得切换环境变量,最好是CMD中尝试一下是否正常运行在3.9之上。
克隆项目
克隆就不再赘述了,程序员的基本技能【https://github.com/myshell-ai/OpenVoice】。
git clone https://github.com/myshell-ai/OpenVoice.git
由于官方在2024-2-14日改变了目录层级【refactor!: Converts Project into a Python Compatible Package】,本文的代码无法直接使用,建议拉取之前的历史代码测试。也可以修改本文调用的代码测试,难度不大。
安装库
安装官方requirements.txt中所要求的支持库。
pip install -r requirements.txt
下载支持文件
项目运行需要一些支持文件,里面包含了英文和中文的预训练模型,还有转换器模型,官方给了一个下载连接【checkpoints_1226.zip】,不过需要墙。如果没有工具可以到网盘下载,没有好的网盘(求推荐),就委屈一下用百度了:https://pan.baidu.com/s/1Xbv6TyRYmR6SIb8F8YWHIQ,提取码:56m7
下载后将文件解压到项目根目录即可,文件夹名称checkpoints。
运行
我们可以运行一下官方提供的demo_part1.ipynb,这个示例中使用了默认的录音文件作为目标音频,然后使用TTS输出原始音频进行转换。
如果你没有jupyter环境,可以尝试将其中的代码复制到py文件中运行,如果一切正常,你将会得到一个outputs文件夹,其中的tmp.wav为TTS原始音频,output_chinese.wav为转换后的目标音频,可以试听output_chinese.wav确认转换效果。
代码
import os
import torch
import se_extractor
from api import BaseSpeakerTTS, ToneColorConverter
ckpt_converter = 'checkpoints/converter'
# 使用CPU进行计算
device = 'cpu'
output_dir = 'outputs'
# 加载基础模型
tone_color_converter = ToneColorConverter(f'{ckpt_converter}/config.json', device=device)
tone_color_converter.load_ckpt(f'{ckpt_converter}/checkpoint.pth')
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 训练音频
reference_speaker = 'resources/example_reference.mp3'
target_se, audio_name = se_extractor.get_se(reference_speaker, tone_color_converter, target_dir='processed', vad=True)
# TTS配置
ckpt_base = 'checkpoints/base_speakers/ZH'
base_speaker_tts = BaseSpeakerTTS(f'{ckpt_base}/config.json', device=device)
base_speaker_tts.load_ckpt(f'{ckpt_base}/checkpoint.pth')
source_se = torch.load(f'{ckpt_base}/zh_default_se.pth').to(device)
save_path = f'{output_dir}/output_chinese.wav'
text = "今天天气真好,我们一起出去吃饭吧。"
src_path = f'{output_dir}/tmp.wav'
# TTS转换,speed为语速
base_speaker_tts.tts(text, src_path, speaker='default', language='Chinese', speed=0.9)
# 数字水印内容
encode_message = "@Print_Lin"
# 运行转换
tone_color_converter.convert(
audio_src_path=src_path,
src_se=source_se,
tgt_se=target_se,
output_path=save_path,
message=encode_message)
预期错误
huggingface文件无法下载
由于国内目前无法访问huggingface下载文件,本项目需要的一个支持文件就无法下载,导致运行时报下载超时的错误。报错信息如下:
'(MaxRetryError("HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /M4869/WavMark/resolve/main/step59000_snr39.99_pesq4.35_BERP_none0.30_mean1.81_std1.81.model.pkl (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x000001AADD964790>, 'Connection to huggingface.co timed out. (connect timeout=10)'))"), '(Request ID: 012bc077-12af-441a-8b68-571f9aa0da2d)')' thrown while requesting HEAD https://huggingface.co/M4869/WavMark/resolve/main/step59000_snr39.99_pesq4.35_BERP_none0.30_mean1.81_std1.81.model.pkl
Traceback (most recent call last):
File "C:\Python39\lib\site-packages\urllib3\connection.py", line 203, in _new_conn
sock = connection.create_connection(
File "C:\Python39\lib\site-packages\urllib3\util\connection.py", line 85, in create_connection
raise err
File "C:\Python39\lib\site-packages\urllib3\util\connection.py", line 73, in create_connection
sock.connect(sa)
socket.timeout: timed out
我们通过完整的错误信息定位到对应文件下载的代码位置,在【C:\Python39\Lib\site-packages\wavmark\__init__.py】中的第10行发起的下载,我们手动下载对应的文件,然后这里修改代码为本地读取即可。修改后的代码:
def load_model(path="default"):
if path == "default":
# resume_path = hf_hub_download(repo_id="M4869/WavMark",
# filename="step59000_snr39.99_pesq4.35_BERP_none0.30_mean1.81_std1.81.model.pkl",
# )
resume_path = "C:/Users/Number/.cache/huggingface/hub/models--M4869--WavMark/step59000_snr39.99_pesq4.35_BERP_none0.30_mean1.81_std1.81.model.pkl"
model = my_model.Model(16000, num_bit=32, n_fft=1000, hop_length=400, num_layers=8)
checkpoint = torch.load(resume_path, map_location=torch.device('cpu'))
model_ckpt = checkpoint
model.load_state_dict(model_ckpt, strict=True)
model.eval()
return model
目标文件的下载地址【step59000_snr39.99_pesq4.35_BERP_none0.30_mean1.81_std1.81.model.pkl】,如果无法过墙的朋友可以通过网盘下载:https://pan.baidu.com/s/198-AcmwzzEE7HfqnR0LdoQ,提取码:3fzq。下载后将文件放在huggingface默认的缓存目录即可,一般指向的是:C:/Users/Number/.cache/huggingface/hub/,您可以检查一下本机相关目录,对应的文件夹应该已经自动创建了的。
silero无法下载
如果您的Git未设置代理,可能silero仓库无法正常拉取。导致运行时报下载超时的错误。报错信息如下:
Traceback (most recent call last):
File "C:\Python39\lib\site-packages\whisper_timestamped\transcribe.py", line 1885, in get_vad_segments
_silero_vad_model, utils = torch.hub.load(repo_or_dir=repo_or_dir, model="silero_vad", onnx=onnx, source=source)
File "C:\Python39\lib\site-packages\torch\hub.py", line 539, in load
repo_or_dir = _get_cache_or_reload(repo_or_dir, force_reload, trust_repo, "load",
...省略若干调用链...
File "C:\Python39\lib\http\client.py", line 289, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response
同样您可以自行下载目标文件放到相应的目录即可,目标文件的下载地址【silero-vad-master.zip】,如果无法过墙的朋友可以通过网盘下载:链接: https://pan.baidu.com/s/1yTPk-dVE59MPuekYHbZNrA,提取码: upfs。下载后将文件放在torch默认的缓存目录即可,一般指向的是:C:\Users\Number\.cache\torch\hub\,文件夹名称为:snakers4_silero-vad_master,将文件解压到这个文件夹下即可。
Linux用户的缓存目录可能在:/home/用户名/.cache
下一步
希望你通过上面的步骤能够成功运行起来,如果有任何预料之外的错误可以先看一下官方仓库里面的issues,或许有人已经遇到并解决了你的错误。如果仍未解决,可以在本文评论,带上您的错误日志,我尽力帮助。
如果你成功运行起来了,可能你通过实测会发现对于中文的音调效果处理不太理想,我粗略研究后认为是TTS对于中文支持不太好的原因,您可以尝试使用真人发音或者换其它优秀的TTS生成原始音频再进行音色转换,这将会取得不错的效果。
正如我在【https://github.com/myshell-ai/OpenVoice/issues/54】中提到的那样,我完成了实时语音转换的功能,可以实时采集麦克风音频进,然后通过默认喇叭输出转换后的音频 ,我将会在下一篇博文中介绍我的实现步骤。博文已发布,可以移步【OpenVoice实时语音克隆功能实现】
*如果本文对您有帮助,求三连(点赞、收藏、关注)
更多推荐
所有评论(0)