java - 使用 MARF 进行说话人识别

标签 java matlab signal-processing speech-recognition matlab-deployment

我正在使用 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 个采样值的窗口会产生 ca 的窗口。 23 毫秒,根据我的经验,它在包含 500 个说话者的数据集上返回了最佳结果。

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

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

但这不是 LPC 算法所必需的(虽然对于处理器来说可能稍微更有效,因为它只知道 2 的幂:-))

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

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

关于位深度的一个词:8 位与 16 位 虽然采样率是关于时间的精度,但位深度与幅度的精度有关。 8 位给你 256 个值 16 位给你 65536 个值

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

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

关于 vText:正如我之前告诉您的那样,我发现傅里叶变换 (FFT) 不适用于大型数据集。它缺乏精确性。

在将计算委托(delegate)给 MathLab 时,这里似乎出现了问题。如果没有代码,恕我直言,几乎不可能为您提供更多信息。

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

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

如果您想试试 Recognito:https://github.com/amaurycrickx/recognito

关于java - 使用 MARF 进行说话人识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21037171/

相关文章:

java - 我应该手动关闭从数据源获得的连接吗?

java - jface.preference.FileFieldEditor 无法指定新文件

arrays - 如何在Octave/MATLAB中找到向量每两个对应元素之间的范围?

css - matlab浏览器版本

matlab - 如何在matlab中分别控制耳机左右声道在matlab中播放音频信号?

python - 我需要什么过滤器?只想保留高频值

java - 无法从 getdefaultsharedpreferences 获得正确的结果

java - Maven Surefire 2.13 无法在 Windows 上 fork

MATLAB ActiveX 可选参数

python - 计算卫星数据中 u 和 v 风分量的旋度 - Python