Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何检测一个语音记录与另一个语音记录的相似程度?_Algorithm_Machine Learning_Audio - Fatal编程技术网

Algorithm 如何检测一个语音记录与另一个语音记录的相似程度?

Algorithm 如何检测一个语音记录与另一个语音记录的相似程度?,algorithm,machine-learning,audio,Algorithm,Machine Learning,Audio,我想建立一个程序来检测一个用户的音频记录与另一个记录的接近程度,以便纠正用户的发音。例如: 我录下自己说“早上好” 我让一个外国学生记录“早上好” 把他的录音和我的比较一下,看看他的发音是否足够好 我在一些语言学习工具中看到了这一点(我相信罗塞塔·斯通就是这么做的),但它是如何做到的呢?请注意,我们只处理语音(而不是,比如说,音乐)。我应该研究哪些算法或库?你必须研究语音识别算法。我知道您不需要将语音转换为文本(这是由语音识别算法完成的),但是,在您的情况下,许多算法都是相同的 也许,HMM在这

我想建立一个程序来检测一个用户的音频记录与另一个记录的接近程度,以便纠正用户的发音。例如:

  • 我录下自己说“早上好”
  • 我让一个外国学生记录“早上好”
  • 把他的录音和我的比较一下,看看他的发音是否足够好

  • 我在一些语言学习工具中看到了这一点(我相信罗塞塔·斯通就是这么做的),但它是如何做到的呢?请注意,我们只处理语音(而不是,比如说,音乐)。我应该研究哪些算法或库?

    你必须研究语音识别算法。我知道您不需要将语音转换为文本(这是由语音识别算法完成的),但是,在您的情况下,许多算法都是相同的

    也许,HMM在这里会有帮助(隐马尔可夫模型)。 也可以在这里查看:

    musicg api 有一个音频指纹发生器和记分器 以及源代码,以显示它是如何完成的

    我认为它会在每条赛道中寻找最相似的点,然后根据它能匹配的距离来得分

    可能看起来像

    import com.musicg.wave.Wave
       com.musicg.fingerprint.FingerprintSimilarity
       com.musicg.fingerprint.FingerprintSimilarityComputer
       com.musicg.fingerprint.FingerprintManager
    
    double score =
    new FingerprintsSimilarity(
        new Wave("voice1.wav").getFingerprint(),
        new Wave("voice2.wav").getFingerprint() ).getSimilarity();
    
    创意: 生物技术学家排列两个蛋白质序列的方式如下:每个序列在字母表上表示为一个字符串(a/C/G/T-这些是不同类型的蛋白质,与我们无关),其中每个字母(这里是一个条目)代表一个特定的氨基酸。对齐的质量(其得分)是根据每对对应项的相似度和需要插入的空白条目的数量和长度来计算的。 根据一组交替发音中的替换频率,可以对发音使用相同的算法()。然后,您可以计算对齐分数,以对音素之间的差异敏感的方式测量两个发音之间的相似性。这里可以使用的相似性度量是Levenshtein距离、音素错误率和单词错误率

    算法 将一个序列转换为另一个序列所需的最小插入、删除和替换次数是Levenshtein距离。更多信息请访问 音素错误率(PER)是预测发音和参考发音之间的Levenshtein距离除以参考发音中的音素数量。 单词错误率(WER)是至少有一个音素错误的预测发音占发音总数的比例


    来源:在威斯康辛州麦迪逊大学进行了这方面的实习

    一个精心配置的系统应该可以做到这一点。

    如果这只是为了检查发音[当然是不同的口音],你可以这样做:

    第1步:使用语音工具[say],你可以随身携带文本

    步骤2:比较字符串或组成的单词,并将其与实际要发音的字符串进行比较


    第三步:如果您发现字符串中有任何差异,则表示单词拼写不正确。而且你可以建议正确的发音。

    许多人似乎建议某种编辑距离,这在确定两种语音模式的相似性时是一种完全错误的方法,尤其是对于像OP所暗示的那么短的模式。实际上,语音识别所使用的特定算法与您希望在此处使用的算法几乎相反。语音识别中的问题是将许多相似的发音分解为相同的表示。这里的问题是取一些稍微不同的发音,并在它们之间获得某种有意义的距离

    我已经为大规模数据科学做了很多这方面的工作,虽然我不能评论专有程序是如何做到这一点的,但我可以评论学术界是如何做到这一点的,并提供一个简单的解决方案,它将为您提供这种方法所需的能力和灵活性

    首先:假设您拥有的是一些音频块,而没有对其进行任何过滤。就像从麦克风中获取一样。第一步是消除背景噪声。有很多不同的方法可以实现这一点,但我将假设您想要的是一种能够很好地工作,而不会难以实现的方法

    • 使用scipy的过滤模块过滤音频。麦克风拾取的许多频率对语音分类根本没有用处。我建议使用贝塞尔或巴特沃斯滤波器,以确保通过滤波保持波形。日常讲话的基本频率通常在800到2000赫兹之间(),因此合理的截止频率大约为300到4000赫兹,以确保不会丢失任何东西
    • 寻找语音中最不活跃的部分,并假设它是背景噪声的合理表示。此时,您需要对数据进行一系列傅里叶变换(或生成频谱图),并找到语音记录中平均频率响应最低的部分。一旦你有了那个快照,你应该从音频样本中的所有其他点中减去它
    • 此时,应该有一个音频文件,该文件主要是用户的语音,并且应该准备好与经过此过程的另一个文件进行比较。现在,我们想实际剪辑声音,并将此剪辑与一些主剪辑进行比较
    其次:您将要提出两种语音模式之间的距离度量,有很多方法可以做到这一点,但我将假设我们有第一部分的输出和一些经过类似处理的主文件

    • 生成光谱图
      import com.musicg.wave.Wave;
      import com.musicg.fingerprint.FingerprintSimilarity;
      
      
              //somewhere in your code add
              String file1 = Environment.getExternalStorageDirectory().getAbsolutePath();
              file1 += "/test.wav";
      
              String file2 = Environment.getExternalStorageDirectory().getAbsolutePath();
              file2 += "/test.wav";
      
              Wave w1 = new Wave(file1);
              Wave w2 = new Wave(file2);
      
      
              FingerprintSimilarity fps = w1.getFingerprintSimilarity(w2);
              float score = fps.getScore();
              float sim = fps.getSimilarity();
      
      
      
              Log.d("score", score+"");
              Log.d("similarities", sim+"");