我正在为一种名为“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 文件。
这是不是太简单了?我在这里错过了什么吗?这种特定语言(卡纳达语)的神经网络有什么意义?