前言
在【OpenVoice本地部署教程与踩坑记录】一文中介绍了OpenVoice的基本概念与,并且完成了项目的安装与运行。官方给的示例和用法中仅包含了文本转TTS再克隆音色的功能,仅能用于TTS场景下的文字朗读。
本文基于官方示例改造,实现了实时采集麦克风音频进行语音克隆的功能。在阅读项目论文理论后,少量修改了官方源码,取得了不错的实测效果。
论文
项目论文可以在这里查看【OpenVoice: Versatile Instant Voice Cloning】,我将原文机器翻译成了中文,也可以参考中文版的论文【百度网盘,提取码: d7ja】。
阅读论文后可以知道,OpenVoice将 IVC 任务解耦为独立的子任务,与耦合任务相比,每个子任务都更容易实现,音调颜色的克隆与所有其余风格参数和语言的控制完全分离。我们也可以不依赖原有的TTS,可以使用本地录音进行音色转换。在阅读完论文和相关代码后发现大部分为音频数据的基础数学计算,未包含前后强逻辑关联,故我们可以引入Buff的概念,将音频数据一段一段的送入转换,所以实时音频转换从理论上是可行的。

*我不是专业研究员,上述内容如有错误还望不吝赐教
实现
我们实现的基本思路是利用pyaudio库从麦克风实时采集np.float32的音频数据,然后传入到convert方法中进行转换,将转换后的结果同样通过pyaudio库播放即可。
pyaudio安装
使用pip下载pyaudio库即可正常使用:
pip install pyaudio
pyaudio基础使用
关于pyaudio的基础使用可以参考网上的其它文章,这个库用起来不复杂,仅需要简单配置即可,我让chatGPT帮我写了一个测试示例供大家参考:
import pyaudio
import numpy as np
def play_and_record():
# 设置参数
FORMAT = pyaudio.paInt16
CHANNELS = 1 # 单声道
RATE = 44100 # 采样率,您可以根据需要调整
CHUNK = 1024 # 每次读取的样本数
p = pyaudio.PyAudio()
# 打开麦克风
stream_in = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
# 打开扬声器
stream_out = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
output=True,
frames_per_buffer=CHUNK)
print("开始录音并播放...")
try:
while True:
# 从麦克风读取数据

本文介绍了如何基于OpenVoice项目,实现从麦克风实时采集音频并进行语音克隆,通过修改官方示例,引入缓冲区技术处理音频数据,并实现静音检测以降低CPU资源消耗,实现实时音频转换功能。
最低0.47元/天 解锁文章
2172

被折叠的 条评论
为什么被折叠?



