python - 文本到语音神经网络的 WAV 文件格式是什么?

数据挖掘 Python 神经网络 音频识别
2021-10-11 13:35:08

我正在为一种名为“Kannada”的语音语言创建一个文本到语音系统,并计划使用神经网络对其进行训练。输入是一个单词/短语,而输出是相应的音频。

在实现网络时,我认为输入应该是单词/短语的分段字符,因为输出发音仅取决于组成单词的字符,不像英语中我们需要考虑沉默的单词和词性。但是,我不知道应该如何训练输出。

由于我的数据集是单词/短语和对应的 MP3 文件的集合,我想使用 pydub 将这些文件转换为 WAV 用于所有音频文件。

from pydub import AudioSegment
sound = AudioSegment.from_mp3("audio/file1.mp3")
sound.export("wav/file1.wav", format="wav")

接下来,我打开 wav 文件并将其转换为值介于 0 和 1 之间的规范化字节数组。

import numpy as np
import wave

f = wave.open('wav/kn3.wav', 'rb')
frames = f.readframes(-1)

#Array of integers of range [0,255]
data = np.fromstring(frames, dtype='uint8')

#Normalized bytes of wav
arr  = np.array(data)/255

我应该如何训练这个?

从这里开始,我不确定如何使用输入文本进行训练。由此,我需要第一层和最后一层中可变数量的输入和输出神经元,因为每个输入的字符数(第一层)和相应波(最后一层)的字节数都会发生变化。

由于 RNN 处理此类可变数据,我认为它在这里会派上用场。

如果我错了,请纠正我,但神经网络的输出实际上是介于 0 和 1 之间的概率值。但是,我们不是在处理分类问题。音频可以是任何东西,对吧?就我而言,“输出”应该是对应于 WAV 文件的字节向量。因此,每个单词将有大约 40,000 个值在 0 到 255 之间(没有标准化步骤)。如何训练这些语音数据?任何建议表示赞赏。

编辑 1:响应arduinolover 的回答

据我了解,音素是语言的基本发音。那么,为什么我需要一个神经网络来映射音素标签和语音呢?我不能说,“每当你看到这个字母,就这样发音毕竟,这种语言,卡纳达语,是语音的:没有无声的词。所有单词的发音方式与拼写相同。那么神经网络将如何帮助呢?

在输入新文本时,我只需要将其分解为相应的字母(也是音素)并检索它的文件(从 WAV 转换为原始字节数据)。现在,将字节合并在一起并将其转换为 wav 文件。

这是不是太简单了?我在这里错过了什么吗?这种特定语言(卡纳达语)的神经网络有什么意义?

1个回答

语音数据由称为音素的独特声学单元组成。任何音频文件都可以表示为一系列音素。自动语音识别 (ASR) 和语音合成 (SS) 系统都对这些音素进行建模。在 ASR 中,语音信号(wav 文件)用作输入并预测音素标签,而在 SS 中,可以输入音素标签并输出语音信号。

您可以使用语音词典将文本文件转换为音素序列。例如玩 -> PL EY

如果您有音素边界标记数据,例如在音频文件 file1.wav 中,0.1s 到 0.5s 音素 x 和 0.5s 到 0.9s 是音素 y。现在您可以使用 NN 来学习音素标签和语音信号之间的映射(400 个数据点作为输出,这 400 个点的音素标签作为输入)。

但是影响发音的因素很多。下面列出了其中一些:

上下文: “to”和“go”具有相同的音素“o”,但发音却大不相同。

音高:女性演讲者的音高通常比男性演讲者高。

语速:说话者的语速不同。它还取决于阅读文本时的口语模式,与对话相比,我们的停顿次数往往更少。

length_of_output_phoneme:要生成的wav文件的长度

所以最后你的神经网络的输入看起来像这样 [left_context, phoneme, right_context, specking_rate, pitch, length_of_output_phoneme]并且输出将是相应的语音信号。您可以使用 MFCC 功能或原始 wav 数据作为 NN 输出。还有很多其他因素会影响发音。

如果您没有时间标记的数据。您可以使用隐马尔可夫模型HMM进行语音合成。将为每个音素学习一个单独的模型。HMM 的输入将是文本文件(音素序列),输出将是 specch 信号。这些学习到的模型可以用于以后生成语音数据。

下面列出了一些语音合成资源:

1) CMU 音乐节

2)波网

3)语音合成中的深度学习

最大的挑战是让它听起来像人声。

编辑1:下面列出了“每当你看到这个字母,就这样发音”的一些问题

1) 上下文:从上面的 to 和 go 示例中,将使用 'o' 的哪个发音

2)不连续性:声道振动(唇、舌运动)产生音素。由于声道不会立即停止振动,因此音素会扩散到相邻的音素中。如果你复制粘贴音素,那么会有一个突然的变化。您可以复制粘贴单词的声音,因为它们是独立的(在说话时,“不能”变成“不能”)并在单词之间插入小停顿。但是你必须存储所有单词的发音。

3)重音音素:当说一个或多个音素时,重音(更集中,更长),复制粘贴会忽略重音信息,因为一切都是一样的

如果您可以在所有可能的上下文中存储所有音素的发音并且可以平滑相邻音素之间的过渡,那么您可以复制粘贴声音。使用生成模型,我们尝试对人类声道系统进行建模,并根据输入上下文生成语速音频数据。浏览第一个和第三个资源以获得详细解释。

所有这些问题的出现都是因为我们想让它听起来更人性化。音素转换和扩散是主要障碍。

待办事项:选择任何单词并将其记录在不同的上下文、不同的语速、不同的说话者和绘图波形中。你会看到每次它都有不同的波形。即使您每次不更改任何条件,同一个单词的发音也会略有不同。保存少数音素的发音并复制粘贴它们以生成单词并收听。