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ê


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()

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()

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.