foo*_*bar 20 algorithm audio machine-learning
我想建立一个程序来检测用户的录音与另一个录音的接近程度,以便纠正用户的发音.例如:
我在一些语言学习工具中看到了这一点(我相信Rosetta Stone会这样做),但它是如何完成的?请注意,我们只处理语音(而不是音乐).我应该研究哪些算法或库?
Sla*_*off 62
许多人似乎在暗示某种编辑距离,IMO是确定两种语音模式相似性的完全错误的方法,特别是对于OP所暗示的模式.事实上,语音识别所使用的特定算法几乎与您在此处使用的算法相反.语音识别中的问题是将许多相似的发音解析为相同的表示.这里的问题是采用一些略有不同的发音,并在它们之间获得某种有意义的距离.
我已经为大规模数据科学做了很多这样的事情,虽然我无法评论专有程序是如何做到的,但我可以评论它是如何在学术界完成的,并提供一个简单易行的解决方案你有这种方法所需的力量和灵活性.
首先:假设你拥有的是一些音频,而不对其进行任何过滤.就像从麦克风那里获得一样.第一步是消除背景噪音.有许多不同的方法,但我会假设你想要的东西能够很好地工作而不会非常难以实现.
其次:你想要在两个语音模式之间提出一个距离度量,有很多方法可以做到这一点,但我会假设我们有第一部分的输出和一些主文件经过类似的处理.
生成相关音频文件的频谱图(示例).这样的输出最终将是一个可以表示为频率响应值的二维阵列的图像.频谱图基本上是随时间变化的傅立叶变换,其中颜色对应于强度.
使用OpenCV(具有python绑定,示例)在谱图上运行blob检测.实际上,这将在谱图中间寻找大的彩色斑点,并给你一些限制.实际上,这应该做的是返回原始2d阵列的一个明显更稀疏的版本,它仅代表所讨论的语音.(假设您的音频文件在录制的前端和后端有一些尾随的东西)
将两个斑点标准化以解释语音速度的差异.每个人都以不同的速度说话,因此你的blob可能沿着x轴(时间)有不同的大小.这将最终在您的算法中引入一系列您不希望语速的检查.如果您还想确保它们以与主副本相同的速度说话,则不需要此步骤,但我会建议.基本上你想通过将它的时间轴乘以某个常数来拉伸较短版本,该常数只是两个blob长度的比率.
您还应该根据最大和最小强度对两个blob进行标准化,以便考虑不同音量的人.同样,这取决于您自己的判断,但为了解决这个问题,您应该找到相似的总强度范围以及两个记录的最大强度,并确保这两个值在二维数组之间匹配.
第三:既然你有二维数组代表你的两个语音事件,理论上它应该包含所有有用的信息,是时候直接比较它们了.幸运的是,比较两个矩阵是一个很好解决的问题,并且有很多方法可以向前推进.
我个人建议使用像Cosine Similarity这样的度量来确定你的两个blob之间的差异,但这不是唯一的解决方案,虽然它会给你一个快速验证,你可以做得更好.
您可以尝试从另一个矩阵中减去一个矩阵,并评估它们之间的差异,这可能比简单的余弦距离更准确.
这可能是矫枉过正,但你可以假设某些言语区域或多或少对于评估blob之间的差异(如果有人使用长i而不是短i,可能无关紧要,但是ag而不是ak可能是一个完全不同的词).对于类似的东西,你需要在上一步中为差异数组开发一个掩码,并将所有值乘以它.
无论您选择哪种方法,现在只需设置一些差异阈值,并确保两个斑点之间的差异低于您想要的阈值.如果是,则捕获的语音足够相似以使其正确.否则让他们再试一次.
我希望这有用,而且我再也不能向你保证这是公司使用的确切算法,因为该信息非常专有并且不对公众开放,但我可以向你保证,类似这些的方法用于学术界最好的论文,这些方法将使您在准确性和易于实施方面取得很大的平衡.如果您有任何问题,请告诉我,祝您未来的数据科学成果好运!
想法: 生物技术学家对齐两种蛋白质序列的方式如下:每个序列在字母表中表示为字符串(A/C/G/T-这些是不同类型的蛋白质,与我们无关),每个字母(这里) ,条目)代表特定的氨基酸.根据每对相应条目的相似性以及需要插入以产生该对齐的空白条目的数量和长度来计算对齐的质量(其得分).
相同的算法(http://en.wikipedia.org/wiki/Needleman-Wunsch_algorithm)可用于发音,来自一组备用发音中的替换频率.然后,您可以计算对齐分数,以对音素之间的差异敏感的方式测量两个发音之间的相似性.这里可以使用的相似度量是Levenshtein距离,音素错误率和单词错误率.
算法 将一个序列转换为另一个序列所需的最小插入,删除和替换次数是Levenshtein距离.更多信息,请访问http://php.net/manual/en/function.levenshtein.php 音素错误率(PER)是预测发音与参考发音之间的Levenshtein距离除以参考发音中的音素数.字错误率(WER)是具有至少一个音素错误的预测发音与发音总数的比例.
资料来源:在威斯康星大学麦迪逊分校实习
musicg api https://code.google.com/p/musicg/ 有一个音频指纹生成器和记分器以及源代码,以显示其完成情况.
我认为它会查找每个轨道中最相似的点,然后根据它可以匹配的距离进行评分.
它可能看起来像
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();
Run Code Online (Sandbox Code Playgroud)