语音合成技术简介

最近由于工作需要,对语音合成技术进行了一些研究,总结一下。

语音合成技术又称为文本转语音技术,简单来说就是把一段文字按照一定的需求转化为对应的音频。文本转语音是一项包含了语义学、声学、数字信号处理以及机器学习的等多项学科的交叉任务。相对于英语的语音合成,中文博大精深,存在多音字,一字多义等各种情况,想把一段中文文本转换为正确的音频绝非易事。

更广义的语音合成又包括语音转换和歌唱合成,语音转换是把当前音频按照需求进行转换,例如说话人转换、语音到歌唱转换、语音情感转换、口音转换等;歌唱合成包括歌词到歌唱转换、可视语音合成等。

1. 发展历史

1779年,德裔丹麦科学家 Christian Gottlieb Kratzenstein 建造了人类的声道模型,使其可以产生五个长元音。

1791年, Wolfgang von Kempelen 添加了唇和舌的模型,使其能够发出辅音和元音。

贝尔实验室于20世纪30年代发明了声码器(Vocoder),将语音自动分解为音调和共振,此项技术由 Homer Dudley 改进为键盘式合成器并于 1939年纽约世界博览会展出。第一台基于计算机的语音合成系统起源于20世纪50年代。

1961年,IBM John Larry Kelly,以及 Louis Gerstman 使用 IBM 704 计算机合成语音,成为贝尔实验室最著名的成就之一。

1975年,第一代语音合成系统之一 —— MUSAMUltichannel Speaking Automation)问世,其由一个独立的硬件和配套的软件组成。

1978年发行的第二个版本也可以进行无伴奏演唱。

90 年代的主流是采用 MIT 和贝尔实验室的系统,并结合自然语言处理模型。

2016年,谷歌发布了WavNet,这是第一个能生成人类自然语音的深度神经网络随着WavNet的面世,对我们来说以端对端(来自声音记录本身)的方式来生成未处理的声音样本成为可能,可以简单的修饰声音,更重要的是和现存的语音处理方式相比,得到的声音明显的更加自然。所有的一切都要感谢深度学习的出现。

随后国内大厂商百度和阿里先后发布了中文语音合成模型PaddleSpeechSambert-Hifigan

基于深度学习的语音合成流水线包含 文本前端(Text Frontend)、声学模型(Acoustic Model) 和 声码器(Vocoder) 三个主要模块。

Ø文本前端模块将原始文本转换为字符/音素
Ø声学模型将字符/音素转换为声学特征,如线性频谱图、mel 频谱图、LPC 特征等
Ø声码器将声学特征转换为波形

2、PaddleSpeech

采用了易用、高效、灵活以及可扩展的实现,旨在为工业应用、学术研究提供更好的支持,实现的功能包含训练、推断以及测试模块,以及部署过程,主要包括

📦  易用性 : 安装门槛低,可使用  CLI  快速开始。
🏆  对标 SoTA : 提供了高速、轻量级模型,且借鉴了最前沿的技术。
🏆  流式 ASR TTS 系统 :工业级的端到端流式识别、流式合成系统。
💯  基于规则的中文前端 : 我们的前端包含文本正则化和字音转换( G2P )。此外,使用自定义语言规则来适应中文语境。
多种工业界以及学术界主流功能支持 :
🛎典型 音频任务 : 本工具包提供了音频任务如音频分类、语音翻译、自动语音识别、文本转语音、语音合成、声纹识别、 KWS 等任务的实现。
🔬 主流模型及数据集 : 本工具包实现了参与整条语音任务流水线的各个模块,并且采用了主流数据集如 LibriSpeech LJSpeech AIShell CSMSC
联模型应用 : 作为传统语音任务的扩展,我们结合了自然语言处理、计算机视觉等任务,实现更接近实际需求的产业级应用。

语音合成模块类型

模型类型

数据集

脚本

文本前端

tn / g2p

声学模型

Tacotron2

LJSpeech / CSMSC

tacotron2-ljspeech / tacotron2-csmsc

Transformer TTS

LJSpeech

transformer-ljspeech

SpeedySpeech

CSMSC

speedyspeech-csmsc

FastSpeech2

LJSpeech / VCTK / CSMSC / AISHELL-3

fastspeech2-ljspeech / fastspeech2-vctk / fastspeech2-csmsc / fastspeech2-aishell3

声码器

WaveFlow

LJSpeech

waveflow-ljspeech

Parallel WaveGAN

LJSpeech / VCTK / CSMSC / AISHELL-3

PWGAN-ljspeech / PWGAN-vctk / PWGAN-csmsc / PWGAN-aishell3

Multi Band MelGAN

CSMSC

Multi Band MelGAN-csmsc

Style MelGAN

CSMSC

Style MelGAN-csmsc

HiFiGAN

LJSpeech / VCTK / CSMSC / AISHELL-3

HiFiGAN-ljspeech / HiFiGAN-vctk / HiFiGAN-csmsc / HiFiGAN-aishell3

WaveRNN

CSMSC

WaveRNN-csmsc

测试

from paddlespeech.cli.tts.infer import TTSExecutor
tts = TTSExecutor()
tts(text="今天天气十分不错,我们出去玩吧!", output="output.wav")

3、Sambert-Hifigan

整体框架:

拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用,故此处仅涉及参数法。

参数TTS系统可分为两大模块:前端和后端。 前端包含文本正则、分词、多音字预测、文本转音素和韵律预测等模块,它的功能是把输入文本进行解析,获得音素、音调、停顿和位置等语言学特征。 后端包含时长模型、声学模型和声码器,它的功能是将语言学特征转换为语音。其中,时长模型的功能是给定语言学特征,获得每一个建模单元(例如:音素)的时长信息;声学模型则基于语言学特征和时长信息预测声学特征;声码器则将声学特征转换为对应的语音波形。

系统结构:

前端模块我们采用模型结合规则的方式灵活处理各种场景下的文本,后端模块则采用SAM-BERT + HIFIGAN提供高表现力的流式合成效果。

from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

text = '今天天气十分不错,我们出去玩吧!'
model_id = 'damo/speech_sambert-hifigan_tts_zh-cn_16k'
sambert_hifigan_tts = pipeline(task=Tasks.text_to_speech, model=model_id)
output = sambert_hifigan_tts(input=text, voice='zhitian_emo')
wav = output[OutputKeys.OUTPUT_WAV]
with open('output.wav', 'wb') as f:
    f.write(wav)

利用两种框架分别做了简单测试,发现结果还是存在一定差异。

合成的音频文件目前都是机器声,已经有人利用提供的原始音频合成特定人员的音频文件,但还是有所差异,想要合成特定人员的音频就需要大量的原始音频进行音频特征提取和模型训练。此外,模拟声音相似度提高又将引发安全问题,不法分子难免会利用合成音频进行诈骗等违法行为,所以,如何在提高音频合成技术成熟度的前提下保证安全合理应用,也是需要解决的问题。

相关推荐

  1. 语音合成

    2024-01-20 12:36:01       9 阅读
  2. 百度语音合成API

    2024-01-20 12:36:01       30 阅读
  3. Protobuf 反射技术简介

    2024-01-20 12:36:01       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-20 12:36:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-20 12:36:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-20 12:36:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-20 12:36:01       20 阅读

热门阅读

  1. c/c++中不同文件中的同名变量一定会redefine吗

    2024-01-20 12:36:01       27 阅读
  2. git format-patch怎么用

    2024-01-20 12:36:01       30 阅读
  3. js事件循环以及promise

    2024-01-20 12:36:01       30 阅读
  4. 【QT】QThread 成员函数

    2024-01-20 12:36:01       24 阅读