我正在为一种名为"卡纳达语"的语音语言创建一个文本到语音转换系统,我计划用神经网络训练它。输入是单词/短语,而输出是相应的音频。
在实施网络时,我认为输入应该是单词/短语的分段字符,因为输出发音仅取决于构成单词的字符,这与英语不同,我们有倾斜的单词和词性需要考虑。但是,我不知道应该如何训练输出。
由于我的数据集是单词/短语和相应的 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:回应亚伦的评论
据我了解,音素是语言的基本声音。那么,为什么我需要神经网络来用语音映射音素标签呢?我不能说,"每当你看到这个字母表时,就这样发音"。毕竟,卡纳达语这种语言是语音的:没有无声的单词。所有单词的发音都与拼写方式相同。那么神经网络在这里会有什么帮助呢?
在输入新文本时,我只需要将其分解为相应的字母(也是音素)并检索其文件(从 WAV 转换为原始字节数据)。现在,将字节合并在一起并将其转换为 wav 文件。
这是不是太简单了?我在这里错过了什么吗?这种特定语言(卡纳达语)的神经网络有什么意义?
它不是微不足道的,需要特殊的架构。你可以在DeepMind和百度的出版物中阅读它的描述。
您可能还想研究波网训练的现有实现。
总体而言,纯粹的端到端语音合成仍然不起作用。如果你认真对待文本到语音转换,最好研究像merlin这样的传统系统。