Python打开原始音频数据文件
我有一些文件,扩展名是“.adc”。这些文件只是原始数据文件。我可以用Audacity这个软件打开它们,方法是通过文件菜单选择“导入”然后选择“原始数据”,接着设置编码为“有符号16位”,采样率为“16000赫兹”。
我想用Python做同样的事情。我觉得audioop模块可能是我需要的,但我找不到简单的使用示例。
我的主要目标是打开这个文件,并播放文件中的某个位置,比如从第10秒到第20秒。有没有什么工具可以帮我完成这个任务?
提前谢谢你。
3 个回答
3
你可以使用 PySoundFile 这个工具来把音频文件打开成一个NumPy数组,然后用 python-sounddevice 来播放它。
import soundfile as sf
import sounddevice as sd
sig, fs = sf.read('myfile.adc', channels=2, samplerate=16000,
format='RAW', subtype='PCM_16')
sd.play(sig, fs)
你可以通过在NumPy数组上使用索引来选择音频数据的某一部分。
4
非常感谢,我成功做到了以下几点:
def play_data(filename, first_sec, second_sec):
import ao
from ao import AudioDevice
dev = AudioDevice(2, bits=16, rate=16000,channels=1)
f = open(filename, 'r')
data_len = (second_sec-first_sec)*32000
f.seek(32000*first_sec)
data = f.read(data_len)
dev.play(data)
f.close()
play_data('AR001_3.adc', 2.5, 5)
8
要打开文件,你只需要用 file()
这个函数。
要找到文件中的某个位置,其实不需要用到 audioop:你只需要把秒数转换成字节数,然后获取文件中需要的字节。例如,如果你的文件是 16 kHz 16 位单声道的,每秒的数据量是 32,000 字节。所以第 10 秒的数据就是文件中的 320kB。只要定位到文件中的合适位置,然后读取相应数量的字节就可以了。
而 audioop 不能帮你解决最难的部分:也就是播放音频。播放音频的正确方法其实很大程度上取决于你使用的操作系统。
补充:抱歉,我刚注意到你的用户名是 "thelinuxer"。如果你在 Linux 上用 Python 播放音频,可以考虑使用 pyAO。你可能需要更改采样格式才能播放音频——audioop 可以帮你处理这个问题(看看 ratecv、tomono/tostereo、lin2lin 和 bias 这些功能)。