如何使用Python播放固定频率的声音


8

我尝试了多种播放固定频率声音(例如1000Hz)的方法,但没有任何效果。

我已经下载了“哔哔”声,并且没有声音。

我尝试与pyao接口,但没有任何效果。

我尝试连接到audiere,但遇到运行时错误,表明尽管从软件中心安装了该库,也找不到该库。

任何有关安装适当的库和相关代码的指南将不胜感激。

我无法为此生成.mp3 / .wav文件,但需要在运行时生成音调。

非常感谢你


您需要使WAVE浮动。为什么不称之为FREQ?同样,该方程式是不正确的。试试这个:math.sin((x * 2 * math.pi * FREQ)/ RATE)* 127)+128

更好的实现可以在这里找到: stackoverflow.com/questions/974071/...
外国佬倜傥

Answers:


10
import math
#sudo apt-get install python-pyaudio
from pyaudio import PyAudio

#See http://en.wikipedia.org/wiki/Bit_rate#Audio
BITRATE = 16000 #number of frames per second/frameset.      

#See http://www.phy.mtu.edu/~suits/notefreqs.html
FREQUENCY = 261.63 #Hz, waves per second, 261.63=C4-note.
LENGTH = 1.2232 #seconds to play sound

NUMBEROFFRAMES = int(BITRATE * LENGTH)
RESTFRAMES = NUMBEROFFRAMES % BITRATE
WAVEDATA = ''    

for x in xrange(NUMBEROFFRAMES):
   WAVEDATA += chr(int(math.sin(x / ((BITRATE / FREQUENCY) / math.pi)) * 127 + 128))    

#fill remainder of frameset with silence
for x in xrange(RESTFRAMES): 
    WAVEDATA += chr(128)

p = PyAudio()
stream = p.open(
    format=p.get_format_from_width(1),
    channels=1,
    rate=BITRATE,
    output=True,
    )
stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()

2
应该是(2*math.pi)
jfs

我必须进行将来的划分和2 * math * pi才能使其正常工作。Python 2.8 32位
-chwi

Python 2.7以“平滑”的声音播放此声音,而Python 3.4则产生“更嗡嗡”的声音。为什么?我尝试添加____future____分区,但这没什么区别。
Ubuntourist 2015年

@Ubuntourist我不确定,但是我认为您的python 2.7使用8位编码,而您的Python 3.4使用UTF8,因此char()在Python 3.4上对某些值使用2字节,这不是我们想要的。
12431234123412341234123年

如果您使用字节串而不是python3的字符串,则应该会获得预期的效果
pizzapants184 '17

4

您可以使用python-pyaudio(至少在12.04中可用)来做到这一点:

from __future__ import division #Avoid division problems in Python 2
import math
import pyaudio
import sys

PyAudio = pyaudio.PyAudio
RATE = 16000
WAVE = 1000
data = ''.join([chr(int(math.sin(x/((RATE/WAVE)/math.pi))*127+128)) for x in xrange(RATE)])
p = PyAudio()

stream = p.open(format =
                p.get_format_from_width(1),
                channels = 1,
                rate = RATE,
                output = True)
for DISCARD in xrange(5):
    stream.write(data)
stream.stop_stream()
stream.close()
p.terminate()

感谢您的帮助。不幸的是,我在运行时遇到很多错误,对RATE或WAVE进行任何更改都不会产生声音。由于空间不足,未列出错误,但请参见“ ALSA lib”。我将如何更改a)消除错误,b)更改持续时间和频率?非常感谢,
user98415

我还收到一堆错误消息,但它运行正常。另外,更改WAVE给我不同的音调。你在用杰克吗?还是只是pulseaudio?
taneli,2012年

2
@ user98415:在顶部添加from __future__ import division以避免在Python 2上不必要的截断。–
jfs

@JFSebastian帮我解决了所有问题,谢谢
chwi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.