使用Python进行声音检测

问题描述 投票:0回答:3

为了对播放音符的嵌入式平台进行端到端测试,我们尝试通过麦克风进行录音,并确定是否使用设备的扬声器播放特定的声音。测试设置不是实时系统,因此我们并不真正知道预期的声音何时(甚至是否)开始和结束。

预期的声音以波形文件(或类似文件)表示,我们可以从磁盘读取。

我们如何运行测试来断言声音是否按预期播放?

python audio signal-processing
3个回答
4
投票

有几种方法可以解决这个问题:

  1. 将期望的声音转换为频率幅度序列
    对。然后,通过麦克风录制声音并进行转换
    记录到相应的频率幅度序列中 对。最后,比较两个序列,看看它们是否匹配。

    1. 可以使用模块 scipy、numpy、 和 matplotlib。

    2. 我们需要生成一系列频率幅度对 以获得预期的声音。我们可以通过使用来做到这一点 scipy.io.wavfile.read() 函数读取波形文件 包含预期的声音。该函数将返回一个元组 包含采样率(以每秒采样数为单位)和 numpy 包含波形幅度的数组。然后我们可以使用 numpy.fft.fft() 函数将幅度转换为 频率幅度对序列。

    3. 我们需要通过麦克风录制声音。为了这, 我们将使用 pyaudio 模块。我们可以创建一个 PyAudio 对象 使用 pyaudio.PyAudio() 构造函数,然后使用 open() 方法在麦克风上打开流。那么我们就可以 使用 read() 方法从流中读取数据块。 每个数据块将是一个 numpy 数组,其中包含 该特定时刻的波形幅度。 然后我们可以使用 numpy.fft.fft() 函数来转换 幅度转换为一系列频率幅度对。

    4. 最后,我们可以比较两个序列的频率 振幅对以查看它们是否匹配。如果它们匹配,那么我们 可以断定预期的声音已正确录制。如果 它们不匹配,那么我们可以得出结论,预期的声音 未正确记录。

  2. 使用声音识别系统识别录音中预期的声音。

from pydub import AudioSegment
from pydub.silence import split_on_silence, detect_nonsilent
from pydub.playback import play

def get_sound_from_recording():
    sound = AudioSegment.from_wav("recording.wav") # detect silent chunks and split recording on them
    chunks = split_on_silence(sound,  min_silence_len=1000,  keep_silence=200) # split on silences longer than 1000ms. Anything under -16 dBFS is considered silence. keep 200ms of silence at the beginning and end
    for i, chunk in enumerate(chunks):
        play(chunk)
        return chunks
  1. 将录音与预期的声音交叉关联。这将产生一系列值,指示录音与预期声音的匹配程度。特定时间索引的高值表示当时的录音和预期声音非常匹配。
# read in the wav file and get the sampling rate
sampling_freq, audio = wavfile.read('audio_file.wav')

# read in the reference image file
reference = plt.imread('reference_image.png')

# cross correlate the image and the audio signal
corr = signal.correlate2d(audio, reference)

# plot the cross correlation signal
plt.plot(corr)
plt.show()

通过这种方式,您可以设置测试来检查是否获得正确的输出。


1
投票

您所描述的那种具有明确定义的持续时间并且可以计数的声音称为声音事件。检测此类事件的任务称为“声音事件检测”(SED)。有时人们也将其称为音频事件检测或声学事件检测 (AED)。 有一些在线学习资源,例如:

    使用机器学习进行声音事件检测 (EuroPython 2021)
  • 声音事件检测:教程
  • 我会使用预训练的音频分类器作为提取音频嵌入的基础,然后在上面放置一个小型 SED 模型。
OpenL3

是一个很好的候选者。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.