从存储在数组中的波形播放声音

Posted

技术标签:

【中文标题】从存储在数组中的波形播放声音【英文标题】:Playing a sound from a wave form stored in an array 【发布时间】:2012-01-03 04:36:29 【问题描述】:

我目前正在尝试在 Python 中生成声音,我很好奇如何获取表示波形的 n 数组(采样率为 44100 hz)并播放它。我在这里寻找纯 Python,而不是依赖于支持不仅仅是 .wav 格式的库。

【问题讨论】:

【参考方案1】:

或使用sounddevice 模块。使用pip install sounddevice 安装,但您首先需要这个:sudo apt-get install libportaudio2

绝对基础:

import numpy as np
import sounddevice as sd

sd.play(myarray) 
#may need to be normalised like in below example
#myarray must be a numpy array. If not, convert with np.array(myarray)

更多选择:

import numpy as np
import sounddevice as sd

#variables
samplfreq = 100   #the sampling frequency of your data (mine=100Hz, yours=44100)
factor = 10       #incr./decr frequency (speed up / slow down by a factor) (normal speed = 1)

#data
print('..interpolating data')
arr = myarray

#normalise the data to between -1 and 1. If your data wasn't/isn't normalised it will be very noisy when played here
sd.play( arr / np.max(np.abs(arr)), samplfreq*factor)

【讨论】:

请注意,如果在 Eclipse 中运行 sounddevice 将不起作用。【参考方案2】:

应该使用图书馆。用纯 Python 编写这一切可能需要数千行代码,用于与音频硬件接口!

使用库,例如audiere,就这么简单:

import audiere
ds = audiere.open_device()
os = ds.open_array(input_array, 44100)
os.play()

还有 pyglet、pygame 等等……


编辑: 上面提到的audiere 模块似乎不再维护,但我对依赖库的建议保持不变。在此处选择当前项目:

https://wiki.python.org/moin/Audio/

https://pythonbasics.org/python-play-sound/

这里没有很多高级标准库“包含电池”的原因是因为与音频硬件的交互可能非常依赖于平台。

【讨论】:

audiere 似乎是一个非常古老的项目...上次发布于 2006 年,Python 绑定的自述文件日期为 2002 年并引用 Python 2.2... 我自己在 python 2.7 上使用过它,它仍然可以正常工作。 audiere 模块来自 pyaudiere.org ,可能您正在查看 audiere.sourceforge.net 。 pyaudiere 使用 Audiere API pyaudiere 网站已不存在,audiere 自 2006 年以来仍未更新。这不再是一个好的答案。【参考方案3】:

播放声音给定数组 input_array 的 16 位样本。这是来自pyadio documentation page的修改示例

import pyaudio

# instantiate PyAudio (1)
p = pyaudio.PyAudio()

# open stream (2), 2 is size in bytes of int16
stream = p.open(format=p.get_format_from_width(2),
                channels=1,
                rate=44100,
                output=True)

# play stream (3), blocking call
stream.write(input_array)

# stop stream (4)
stream.stop_stream()
stream.close()

# close PyAudio (5)
p.terminate()

【讨论】:

【参考方案4】:

我想你可以看看这个列表 http://wiki.python.org/moin/PythonInMusic 它列出了许多处理声音的有用工具。

【讨论】:

【参考方案5】:

这是取自this *** answer 的代码的 sn-p,并添加了一个播放 numpy 数组的示例(scipy 加载的声音文件):

from wave import open as waveOpen
from ossaudiodev import open as ossOpen
from ossaudiodev import AFMT_S16_NE
import numpy as np
from scipy.io import wavfile

# from https://***.com/questions/307305/play-a-sound-with-python/311634#311634
# run this: sudo modprobe snd-pcm-oss
s = waveOpen('example.wav','rb')
(nc,sw,fr,nf,comptype, compname) = s.getparams( )
dsp = ossOpen('/dev/dsp','w')

print(nc,sw,fr,nf,comptype, compname)

_, snp = wavfile.read('example.wav')
print(snp)

dsp.setparameters(AFMT_S16_NE, nc, fr)
data = s.readframes(nf)
s.close()

dsp.write(snp.tobytes())
dsp.write(data)
dsp.close()

基本上你可以调用 tobytes() 方法;返回的字节数组就可以播放了。

附:这个方法超级快

【讨论】:

以上是关于从存储在数组中的波形播放声音的主要内容,如果未能解决你的问题,请参考以下文章

html5 + javascript播放波浪声音

从 Struct 创建的数组中存储的选定表格单元格中播放音频

从存储在 Python 变量中的数据中播放声音

从字符串数组 Swift 播放声音

System.InvalidOperationException:“声音 API 仅支持播放 PCM 波形文件。”

在linux中播放波形文件[关闭]