Whisper语音识别及VITS语音合成

3/23/2023 Whisper语音识别VITS语音合成OpenVoice语音克隆

# 1. 语音识别文本

# 1.1 Whisper基本介绍

# 1.1.1 Whisper简介

Whisper 是一个自动语音识别系统,OpenAI 通过从网络上收集了 68 万小时的多语言(98 种语言)和多任务监督数据对 Whisper 进行了训练。OpenAI 认为使用这样一个庞大而多样的数据集,可以提高对口音、背景噪音和技术术语的识别能力。除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。

它有五种模型尺寸,提供速度和准确性的平衡,下面是可用模型的名称、大致内存需求和相对速度。

Size Parameters English-only model Multilingual model
tiny 39 M
base 74 M
small 244 M
medium 769 M
large 1550 M

# 1.1.2 Whisper原理

一种 Transformer 序列到序列模型被训练用于各种语音处理任务,包括多语种语音识别、语音翻译、口语语言识别以及语音活动检测。这些任务共同以一个需要被解码器预测的符号序列的形式进行表示,从而使得单个模型可以替代传统语音处理管道中的多个阶段。多任务训练格式使用一系列特殊的符号作为任务指示符或分类目标。

Whisper原理

# 1.2 Whisper使用示例

Whisper.cpp 是 OpenAI Whisper 模型的一个实现,可以在本地进行语音识别。

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura13.2.1系统,Python3.9环境

首先需要安装 ffmpeg 工具库,它是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源工具。

$ brew install ffmpeg
$ ffmpeg -version
1
2

之后拉取 Whisper.cpp 项目代码并进行编译,然后下载相应的模型。

$ export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
$ git clone https://github.com/ggerganov/whisper.cpp.git
$ make
$ ./models/download-ggml-model.sh small
1
2
3
4

然后可以随便找个单声道的音频进行测试,可以使用 ffmpeg 进行转换。

$ ffmpeg -i ./test.mp3 -ar 16000 -ac 1 -c:a pcm_s16le ./test.wav      // 将mp3音频转换成wav音频
$ ffmpeg -i ./test.mp4 -f wav -ar 16000 ./test.wav                    // 从mp4视频中提取wav音频
1
2

执行如下命令提取音频的文本:

$ ./main -m models/ggml-small.bin --language zh -f ./test.wav
1

运行效果如下:

Whisper.cpp运行效果

注:在 Apple Silicon 设备上,编码器推理可以通过 Core ML 在 Apple Neural Engine 上执行,这可以带来显著的加速——与仅 CPU 执行相比快 3 倍以上。

# 2. 文本合成语音

# 2.1 VITS语音合成

VITS:用于端到端文本到语音的具有对抗学习的条件变分自动编码器,生成的语音效果比较好。

项目简介:最近已经提出了几种支持单阶段训练和并行采样的端到端文本到语音 (TTS) 模型,但它们的样本质量与两阶段 TTS 系统的样本质量不匹配。在这项工作中,我们提出了一种并行的端到端 TTS 方法,它比当前的两阶段模型生成更自然的声音。我们的方法采用通过标准化流和对抗训练过程增强的变分推理,提高了生成建模的表达能力。我们还提出了一个随机持续时间预测器,以从输入文本中合成具有不同节奏的语音。通过对潜在变量的不确定性建模和随机持续时间预测器,我们的方法表达了自然的一对多关系,其中文本输入可以以不同的音高和节奏以多种方式说出。

VITS语音合成

应用实例:https://github.com/JOETtheIV/VITS-Paimon (opens new window)(效果体验:派蒙语音合成Google-Colab (opens new window)

# 2.2 效果一般的语音合成

# 2.2.1 gTTS语音合成

谷歌开源的文本转语音 API 交互的 Python 库,虽然免费但生成的语音机器音较重,使用时需要联网(被墙,国内需要设置代理)

项目地址:https://github.com/pndurette/gTTS (opens new window)

$ pip install gTTS
1

示例代码如下:

# -*- coding: utf-8 -*-

import os
from gtts import gTTS

os.environ["https_proxy"] = "http://127.0.0.1:1080"

# 谷歌文字转语音API测试
text = "测试gtts文本转语音"
audio = gTTS(text=text, lang="zh-cn")
audio.save("demo.mp3")
1
2
3
4
5
6
7
8
9
10
11

注:如果未设置代理或者代理有问题,会报“Python GTTS / Failed to connect. Probable cause: Unknown”错误。

语音文件播放:

playsound 声明它已经在WAV和MP3文件上进行了测试,但是它可能也适用于其他文件格式。

$ pip install playsound
1

示例代码如下:

from playsound import playsound
playsound('demo.mp3')
1
2

注意事项:调用时可能出现“指定的设备未打开,或不被 MCI 所识别”报错。原因是windows不支持utf-16编码,需修改playsound源码。

修改\Lib\site-packages\playsound.py文件的源码如下:

def winCommand(*command):
        bufLen = 600
        buf = c_buffer(bufLen)
        #command = ' '.join(command).encode('utf-16') # 1.修改前
        command = ' '.join(command) # 1.修改后
        errorCode = int(windll.winmm.mciSendStringW(command, buf, bufLen - 1, 0))  # use widestring version of the function
        if errorCode:
            errorBuffer = c_buffer(bufLen)
            windll.winmm.mciGetErrorStringW(errorCode, errorBuffer, bufLen - 1)  # use widestring version of the function
            exceptionMessage = ('\n    Error ' + str(errorCode) + ' for command:'
                                #'\n        ' + command.decode('utf-16') + # 2.修改前
                                '\n        ' + command + # 2.修改后
                                '\n    ' + errorBuffer.raw.decode('utf-16').rstrip('\0'))
            logger.error(exceptionMessage)
            raise PlaysoundException(exceptionMessage)
        return buf.value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 2.2.2 OpenTTS语音合成

OpenTTS 是一个用 Python 编写的免费、开源的文本转语音服务。它支持多种语言,并带有易于使用的界面。

项目地址:https://github.com/synesthesiam/opentts (opens new window)

$ docker run --name opentts -itd -p 5500:5500 synesthesiam/opentts:all --no-espeak --cache /cache
1

opentts

# 3. OpenVoice语音克隆

# 3.1 OpenVoice简介

自2023年5月以来,OpenVoice一直在为myshell.ai提供即时语音克隆功能。直到2023年11月,全球用户已经使用了数千万次语音克隆模型,并见证了该平台上用户数量的爆炸性增长。

OpenVoice原理图

# 3.2 租用GPU服务器部署服务

# 3.2.1 准备实验环境

实验环境:租用的AutoDL的GPU服务器,NVIDIA A5000 / 24GB,Ubuntu20.04,Python 3.10, CUDA 11.8

由于这家的服务器都是境内的,拉取Github代码和HuggingFace模型都会受到墙的干扰,建议配置一下代理。

$ source /etc/network_turbo
1

另外,该服务器上的服务不可被外界直接调用,如有需要,可使用自定义服务。

  • 打开自定义服务,在本地终端输入上述命令(6006换成服务器实际部署服务的端口),之后就可以在本地通过127.0.0.1:6006去访问服务器部署的服务了。

本地访问AutoDL部署的服务

注:现在这个“自定义服务”需要实名认证,6006端口只是个示例,可以换成任意端口,也可以开多个。

# 3.2.2 部署OpenVoice服务

Step1:拉取代码并安装依赖

$ source /etc/network_turbo   // 设置AutoDL提供的科学上网代理
$ git clone https://github.com/myshell-ai/OpenVoice.git
$ cd /root/OpenVoice
$ pip3 install -r requirements.txt
$ apt-get update && apt install ffmpeg
$ ffmpeg -version
$ ffprobe -version
1
2
3
4
5
6
7

注:Pytorch环境使用了镜像里自带的那个,这里就不重复安装了。

Step2:下载模型文件并解压到checkpoints目录

$ curl -o checkpoints_1226.zip https://myshell-public-repo-hosting.s3.amazonaws.com/checkpoints_1226.zip
$ unzip checkpoints_1226.zip -d ./
1
2

注:后面执行时还会自动下载WavMark模型,如果网络不通可手动下载,https://huggingface.co/M4869/WavMark (opens new window)

Step3:指定6006端口启动应用服务

$ export GRADIO_SERVER_PORT=6006
$ python3 openvoice_app.py
1
2

之后使用AutoDL的“自定义服务”功能,使其在本地访问该应用。

# 3.3 测试语音克隆的效果

左侧修改Text Prompt、选择Style、上传Reference Audio,勾选Agree后,点击Send,之后右侧便会有克隆出的语音。

OpenVoice语音克隆

使用体验:

[1] 英文支持所有Style,中文仅支持default Style,实际体验英文的克隆效果不错,而中文的克隆声音太难听了。

[2] 示例源码里加了校验,Text Prompt需要在2-200之间,这个将openvoice_app.py的校验代码注释掉即可解决。

# 4. 参考资料

[1] Whisper的使用 from LI的技术笔记 (opens new window)

[2] 中文普通话语音识别开源数据集 from CSDN (opens new window)

[3] 开源(离线)中文文本转语音TTS(语音合成)工具整理 from CSDN (opens new window)

[4] Python调用playsound时报错:指定的设备未打开,或不被 MCI 所识别 from 程序员的秘密 (opens new window)

[5] googletrans出现httpcore._exceptions.ConnectError: [WinError 10061] 由于目标计算机积极拒绝,无法连接 from CSDN (opens new window)

[6] ffmpeg 从视频中提取WAV格式的音频 from CSDN (opens new window)

Last Updated: 2/22/2024, 3:26:55 PM