Como tocar um som de frequência fixa usando Python [fechado]

8

Eu tentei várias maneiras de reproduzir um som de frequência fixa (por exemplo, 1000Hz) e nada funciona.

Eu baixei "bip" e isso não faz barulho.

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

Tentei fazer interface com o audiere e recebi um erro de tempo de execução indicando que a biblioteca não foi encontrada, apesar de instalá-la 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ê

user98415
fonte
Você precisa fazer o WAVE flutuar. Por que não chamar FREQ? Além disso, a equação não está correta. Tente fazer o seguinte: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128 #
Melhores implementações podem ser encontradas aqui: stackoverflow.com/questions/974071/…
Gringo Suave

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()
user274527
fonte
2
deve ser(2*math.pi)
jfs 28/10
Eu tive que ter divisão futura e 2 * math * pi para fazê-lo funcionar corretamente. Python 2.8 32 bits
chwi
O Python 2.7 reproduz isso como um som "suave", enquanto o Python 3.4 produz um som muito "mais animado". Por quê? Tentei adicionar a divisão ____future____, mas não fez diferença.
Ubuntourist
@ Ubuntourist Eu não tenho certeza, mas acho que seu python 2.7 usa uma codificação de 8 bits e seu Python 3.4 usa UTF8, portanto, char()use 2 bytes para alguns valores em Python 3.4, que não é o que queremos aqui.
12431234123412341234123
Se você usar bytestrings em vez de charstrings de python3 você deve obter o efeito desejado
pizzapants184
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()
taneli
fonte
Obrigado pela ajuda. Infelizmente, recebo muitos erros ao executar e fazer alterações nos resultados RATE ou WAVE não produz som. Os erros não são listados devido à falta de espaço, mas consulte a "ALSA lib". Como eu mudaria a) para eliminar erros eb) para mudar a duração e a frequência? Muito obrigado,
user98415
Eu também recebo várias mensagens de erro, mas ele funciona muito bem. Além disso, mudar WAVE me dá um tom diferente. Você está usando jack? Ou apenas pulseaudio?
Taneli
2
@ user98415: add no topo from __future__ import divisionpara evitar truncamento desnecessária sobre Python 2.
JFS
@JFSebastian Que tudo resolvido para mim, obrigado
chwi