使用MARF进行说话人识别



我正在使用MARF(模块化音频识别框架)来识别说话者的声音。在这方面,我用人"A"的声音训练了MARF,并用人"B"的声音测试了MARF。使用--train training-samples进行培训使用--ident testing-samples/G.wav进行测试在我的speakers.txt文件中,我提到了两个人的语音样本,即A&B.

但我没有得到正确的响应,这意味着训练的声音和测试的声音都不同,但MARF给出了音频采样匹配。

我也浏览了这个链接。。

http://stackoverflow.com/questions/4837511/speaker-recognition

结果

Config: [SL: WAVE, PR: NORMALIZATION (100), FE: FFT (301), CL: EUCLIDEAN_DISTANCE (503), ID: -1]
Speaker's ID: 26
Speaker identified: G

或者我做错了,或者有其他的说话人识别方法吗。

编辑------------------------现在我正在使用vText,它可以很容易地使用。http://basic-signalprocessing.com/voiceRecognition.php按照这个链接和vText也使用MATLAB给出输出。

我得到了正确的频率-时域图,但我无法比较这两个语音样本。我收到错误

Exception: com.mathworks.toolbox.javabuilder.MWException: Error using ==> eq
Matrix dimensions must agree.
{??? Error using ==> eq
Matrix dimensions must agree.
Error in ==> recognizePartial10k at 10

} 

任何知道这个的人

我想说的第一件事是,根据我的经验,使用FFT算法不会给你最好的结果:在MARF 中尝试LPC

第二:MARF假设人们称之为"闭集"的语音,这意味着即使系统不知道说话者,它也总是会返回结果->你必须根据距离阈值来决定响应的可能性。

此外,请确保滑动窗口(Hamming窗口)大小根据文件的采样率进行设置:例如,在22050 Hz的采样率下使用512个采样值的窗口会产生大约23毫秒的窗口。根据我的经验,这在500个扬声器的数据集上返回了最佳结果。

由于22050 Hz意味着每秒有很多样本,因此对于任何采样率,都很容易找到25 ms左右的所需长度:采样率/1000*25

请注意,MARF中使用的FFT算法需要一个正好为2(256/512/1024/…)幂的窗口

但这对LPC算法来说是不需要的(尽管对处理器来说可能效率稍高,因为它只知道2的幂:-)

哈,别忘了,如果你使用立体声文件,窗口的长度是原来的两倍。。。但我建议使用单声道文件:使用多声道文件进行语音处理没有任何附加值,它更长,精度更低。

一个关于采样率的词:选择的采样率应该是你感兴趣的最高频率的两倍。通常,人们认为语音的最高频率是4000Hz,因此选择8000Hz的采样率。请注意,这并不完全正确:"s"one_answers"sh"的声音频率更高。的确,你不需要这些频率来理解说话者在说什么,但在提取声纹时,使用更宽的频谱可能会很有用。我更喜欢22050Hz。有些语音密码包不允许你低于11000赫兹。

位深度字:8位对16位虽然采样率是关于时间的精度,但比特深度与幅度的精度有关。8位提供256个值16位提供65536个值

不用说为什么你应该使用16位的声音生物测量:-)

作为参考,音频CD使用44100Hz/16位

关于vText:正如我之前告诉你的,傅立叶变换(FFT)在大型数据集上不可用。它缺乏精确性。

在这里,将计算委派给MathLab时似乎出现了问题。没有代码,imho,几乎不可能给你更多的信息。

不要犹豫,请澄清我所说的话,我可能会认为有些事情是理所当然的,但没有意识到这并不那么清楚:-)

FWIW,我刚刚用Java编写了一个名为Recognito的说话人识别工具,我相信它在识别能力方面并不比MARF好多少,但它在最初的步骤中对用户来说肯定更容易,使用的许可模型不需要你的软件是开源的,支持多个并发线程的调用。

如果您想给Recognito注射:https://github.com/amaurycrickx/recognito

最新更新