Como tocar um som de freqüência fixa usando o Python [closed]

8

Já experimentei várias formas de reproduzir um som de frequência fixa (por exemplo, 1000Hz) e nada funciona.

Eu fiz o download de "beep" e isso não faz barulho.

Eu tentei fazer interface com pyao, e isso não teve efeito.

Eu tentei a interface para audiere e recebi um erro de tempo de execução indicando que a biblioteca não foi encontrada, apesar de ter sido instalada a partir do centro de software.

Qualquer orientação para instalação de bibliotecas apropriadas e código relevante seria muito apreciada.

Não consigo gerar arquivos .mp3 / .wav para isso, mas preciso gerar os tons em tempo de execução.

Muito obrigado por você

    
por user98415 18.10.2012 / 06:37

2 respostas

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()
    
por user274527 26.04.2014 / 15:43
4

Você pode fazer isso com python-pyaudio (disponível pelo menos em 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()
    
por taneli 18.10.2012 / 09:46

Tags