在基于语音识别网络的mfccs的后续步骤

时间:2016-09-28 08:12:45

标签: javascript voice-recognition mfcc

我正在研究urdu(在巴基斯坦,印度,孟加拉国使用的语言)语音识别,将乌尔都语言翻译成乌尔都语。到目前为止,我什么也没做,只是找到了meyda javascript库,用于从数据帧中提取mfccs。一些文件说,对于ASR,26中需要前12或13个mfcc。在测试期间,我在wav扩展名的文件夹中有46个音素(/ b /,/ g /,/ d / ...)。在其中一个音素上运行meyda proccess之后,它会为每个音素创建4到5个帧,其中每个帧包含前12个值中的每一个的mfcc。由于声誉低于10,因此禁用后期图像。但你可以在以下链接上的图像。该图像包含7帧音素/ b /。每帧包括13个mfccs。红色长垂直线值为438,其他值为48,38等。 http://realnfo.com/images/b.png

我的问题是,我是否需要将这些帧(mfccs)保存在数据库中作为/ b /的预定义音素,并且我为所有其他音素执行相同然后绑定麦克风,meyda将提取每帧的mfccs ,我将编程javascript,通过使用动态时间扭曲,提取的帧mfcc将与预定义的帧mfccs匹配。最后将获得特定音素的最小距离。

mfccs之后的专业方式是HMM和GMM,但我不知道如何处理。我研究了很多关于HMM和GMM的文件,但却浪费了。

1 个答案:

答案 0 :(得分:2)

Meyda的合着者。

这似乎是一个相当困难的用例。如果您已经知道如何将缓冲区拆分为音素,则可以在这些缓冲区上运行MFCC提取,并使用k Nearest Neighbour(或一些更好的分类算法)进行我认为合理的成功率。

粗略草图:

const Meyda = require('meyda');
// I can't find a real KNN library because npm is down.
// I'm just using this as a placeholder for a real one.
const knn = require('knn');
// dataset should be a collection of labelled mfcc sets
const nearestPhoneme = knn(dataset);
const buffer = [...]; // a buffer containing a phoneme
let nearestPhonemes = []; // an array to store your phoneme matches
for(let i = 0; i < buffer.length; i += Meyda.bufferSize) {
  nearestPhonemes.push(nearestPhoneme(Meyda.extract('mfcc', buffer)));
}

在此for循环之后,nearestPhonemes包含音频的每个帧的音素的最佳猜测数组。然后,您可以选择该阵列中最常出现的音素(模式)。我还想象在整个帧中平均mfcc可能会产生更强大的结果。这肯定是你必须要玩的东西,并试验找到最优的解决方案。

希望有所帮助!如果您开源代码,我很乐意看到它。