首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中两种音频信号(唱歌记录)的相似性比较

Python中两种音频信号(唱歌记录)的相似性比较
EN

Stack Overflow用户
提问于 2022-04-01 20:38:59
回答 1查看 1.5K关注 0票数 2

我正在做一个项目,比较一个人的演唱和原来的艺术家有多相似。最感兴趣的是声音的音高,看他们是否合拍。

音频文件是.wav格式的,我已经能够用波形模块加载它们,并将它们转换为Numpy数组。然后,我建立了一个频率和一个时间向量来绘制信号。

代码语言:javascript
复制
raw_audio = wave.open("myAudio.WAV", "r")
audio = raw_audio.readframes(-1)
signal = np.frombuffer(audio, dtype='int16')
fs = raw_audio.getframerate()
timeDelta = 1/(2*fs)

#Get time and frequency vectors
start = 0
end = len(signal)*timeDelta
points = len(signal)

t = np.linspace(start, end, points)
f = np.linspace(0,fs,points)

如果我有另一个相同持续时间的信号(他们在5-10秒左右着陆)。比较这两种信号的相似性最好的方法是什么?

我曾经想过比较频域和自相关,但我觉得这两种方法都有很多缺点。

EN

回答 1

Stack Overflow用户

发布于 2022-05-19 20:46:39

我面临着一个类似的问题:评估两个音频信号的相似性(一个是真实的,一个是由机器学习管道产生的)。我有信号部分,其中比较是非常关键的(代表不同早期反射到达的峰值之间的时间差),为此,我将尝试计算信号之间的互相关系(这里将更详细地介绍:https://www.researchgate.net/post/how_to_measure_the_similarity_between_two_signal )。

由于两种不同声音的自然录音在时间域上会有很大的不同,这可能对你的问题不太理想。

对于频率信息(如音高和音色)更感兴趣的信号,我将在频域工作。例如,您可以为这两个信号计算短时间ffts (stft)或cqt (映射到八度时频谱的音乐表示),然后通过计算两个信号的时间窗口之间的均方误差(MSE)来比较两者的相似之处。在转换之前,你应该偏离正规化的信号。STFT、CQT和规范化可以很容易地用librosa实现和可视化。

看这里:https://librosa.org/doc/latest/generated/librosa.util.normalize.html这里:https://librosa.org/doc/latest/generated/librosa.cqt.html?highlight=cqt这里:https://librosa.org/doc/latest/generated/librosa.stft.html和这里:https://librosa.org/doc/main/generated/librosa.display.specshow.html)

这种方法有两样东西:

  1. 不要让你的时间窗口太短。人的声音的光谱开始在百赫兹范围(https://av-info.eu/index.html?https&&&av-info.eu/audio/speech-level.html这里给出的350赫兹作为低端)。因此,您的stft时间窗口中的样本数量(或长度)至少应该是:

(1 / 350 Hz) *采样频率

因此,如果你的录音有44100赫兹的采样频率,你的时间窗口必须至少是

(1 / 350 Hz) * 44100 Hz =0.002857.44100个样本/秒=126个样本长。

让它128,这是一个更好的数字。这样你就可以保证一个基本频率为350赫兹的声波在一个窗口中至少能被“看到”整整一段时间。当然,更大的窗口会给你更精确的光谱表示。

在转换之前,

  1. 应该确保您正在比较的两个信号同时表示相同的声音事件。所以,如果两个歌手没有以相同的速度演唱,或者信号中有不同的背景噪音,所有这些都是行不通的。只要你有干燥的录音,只有声音和这些声音以同样的速度唱歌,你只需要确保信号开始对齐。一般来说,你需要确保声音事件(例如瞬变,沉默,音符)对齐。当一个信号中有一个长音时,另一个信号中也应该有一个长音。通过进一步增加stft窗口,可以使您的评估更加可靠,这将降低时间分辨率(信号的频谱表示将更少),但是在一个时间窗口中会评估更多的声音事件。

当然,您可以为整个长度内的每个信号生成一个fft,但是如果您在等长、短时间窗口上生成stft或cqts (或其他更适合人类听觉的转换),然后计算每个时间窗口的mse (信号1的第一时间窗口和信号2的第一窗口,然后是第二窗口对,然后是第三窗口,等等),则结果会更有意义。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71712529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档