OpenVoice本地部署教程与踩坑记录

发布时间:2024年01月09日

前言

????????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

安装库

? ? ? ? 安装官方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下载文件,本项目需要的一个支持文件就无法下载,导致运行时报下载超时的错误。报错信息如下:

'(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默认的缓存目录即可。

下一步

? ? ? ? 希望你通过上面的步骤能够成功运行起来,如果有任何预料之外的错误可以先看一下官方仓库里面的issues,或许有人已经遇到并解决了你的错误。如果仍未解决,可以在本文评论,带上您的错误日志,我尽力帮助。

? ? ? ? 如果你成功运行起来了,可能你通过实测会发现对于中文的音调效果处理不太理想,我粗略研究后认为是TTS对于中文支持不太好的原因,您可以尝试使用真人发音或者换其它优秀的TTS生成原始音频再进行音色转换,这将会取得不错的效果。

? ? ? ? 正如我在【https://github.com/myshell-ai/OpenVoice/issues/54】中提到的那样,我完成了实时语音转换的功能,可以实时采集麦克风音频进,然后通过默认喇叭输出转换后的音频 ,我将会在下一篇博文中介绍我的实现步骤。

*如果本文对您有帮助,求三联(点赞、收藏、关注)

文章来源:https://blog.csdn.net/Print_lin/article/details/135472766
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。