Pydub原始音频数据

6
我正在使用Python 3.4中的Pydub来尝试检测一些音频文件的音高。
我有一个工作的音高检测算法(McLeod音高方法),它对于实时应用程序非常稳健(我甚至用它制作了一个Android音高检测应用程序:https://github.com/sevagh/Pitcha)。
我的问题是,当我将它应用于AudioSegment._data时,我没有得到任何有意义的输出。
代码:
from pydub import AudioSegment

sound = AudioSegment.from_wav(file="./8700hz.wav")

#sampling rate = sound.frame_rate = 44100hz
mpm = Mpm(sound.frame_rate, len(sound._data))
print(mpm.get_pitch(sound._data))

输出:

Pitch: 150.000002396

如果我从扬声器播放相同的wav文件,从麦克风录制并在原始麦克风捕获上应用算法(signed 16-bit little endian PCM, 44100Hz, mono),我会得到正确的音调。

AudioSegment._data返回的不是我期望的吗?

1个回答

11

sound._data是一个bytestring。我不确定Mpm需要什么输入,但你可能需要将bytestring转换为array,像这样:

import array
from pydub import AudioSegment
from pydub.utils import get_array_type

sound = AudioSegment.from_wav(file="./8700hz.wav")

bit_depth = sound.sample_width * 8
array_type = get_array_type(bit_depth)

numeric_array = array.array(array_type, sound._data)

实际上,Mpm只是迭代我给它的任何内容,所以我使用以下方式访问字节串:for i in range(0, len(sound._data)): sound._data[i]。 - Sevag
2
你的建议非常完美地解决了问题: 音高:8715.26013083, 音高:8714.35873644,音高:8713.95019086,音高:8714.24068269。感谢您提供如此出色的库并积极回答有关它的问题。 - Sevag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接