为了对播放音符的嵌入式平台进行端到端测试,我们尝试通过麦克风进行录音,并确定是否使用设备的扬声器播放特定的声音。测试设置不是实时系统,因此我们并不真正知道预期的声音何时(甚至是否)开始和结束。
预期的声音以波形文件(或类似文件)表示,我们可以从磁盘读取。
我们如何运行测试来断言声音是否按预期播放?
有几种方法可以解决这个问题:
将期望的声音转换为频率幅度序列
对。然后,通过麦克风录制声音并进行转换
记录到相应的频率幅度序列中
对。最后,比较两个序列,看看它们是否匹配。
可以使用模块 scipy、numpy、 和 matplotlib。
我们需要生成一系列频率幅度对 以获得预期的声音。我们可以通过使用来做到这一点 scipy.io.wavfile.read() 函数读取波形文件 包含预期的声音。该函数将返回一个元组 包含采样率(以每秒采样数为单位)和 numpy 包含波形幅度的数组。然后我们可以使用 numpy.fft.fft() 函数将幅度转换为 频率幅度对序列。
我们需要通过麦克风录制声音。为了这, 我们将使用 pyaudio 模块。我们可以创建一个 PyAudio 对象 使用 pyaudio.PyAudio() 构造函数,然后使用 open() 方法在麦克风上打开流。那么我们就可以 使用 read() 方法从流中读取数据块。 每个数据块将是一个 numpy 数组,其中包含 该特定时刻的波形幅度。 然后我们可以使用 numpy.fft.fft() 函数来转换 幅度转换为一系列频率幅度对。
最后,我们可以比较两个序列的频率 振幅对以查看它们是否匹配。如果它们匹配,那么我们 可以断定预期的声音已正确录制。如果 它们不匹配,那么我们可以得出结论,预期的声音 未正确记录。
使用声音识别系统识别录音中预期的声音。
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
# 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()
通过这种方式,您可以设置测试来检查是否获得正确的输出。