Come riprodurre un suono a frequenza fissa utilizzando Python [chiuso]


8

Ho provato diversi modi per riprodurre un suono a frequenza fissa (ad es. 1000Hz) e nulla funziona.

Ho scaricato "beep" e questo non fa rumore.

Ho provato a interfacciarmi con Pyao e questo non ha avuto alcun effetto.

Ho provato a interfacciarmi con l'audiere e ho riscontrato un errore di runtime che indica che la libreria non è stata trovata, nonostante l'installazione dal centro software.

Qualsiasi consiglio per l'installazione delle librerie appropriate e del codice pertinente sarebbe molto apprezzato.

Non posso generare file .mp3 / .wav per questo, ma ho bisogno di generare i toni in fase di esecuzione.

Mille grazie per te


Devi fare di WAVE un galleggiante. Perché non chiamarlo FREQ? Anche l'equazione non è corretta. Prova questo: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128

Migliori implementazioni sono disponibili qui: stackoverflow.com/questions/974071/…
Gringo Suave,

Risposte:


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
dovrebbe essere(2*math.pi)
jfs,

Ho dovuto avere una divisione futura e 2 * matematica * pi per farlo funzionare correttamente. Python 2.8 32 bit
chwi

Python 2.7 riproduce questo suono come "liscio" mentre Python 3.4 produce un suono molto "più forte". Perché? Ho provato ad aggiungere la divisione ____future____, ma non ha fatto differenza.
Ubuntourist,

@Ubuntourist Non ne sono sicuro, ma penso che il tuo Python 2.7 usi una codifica a 8 bit e il tuo Python 3.4 usi UTF8, quindi char()usa 2 Byte per alcuni valori su Python 3.4 che non è quello che vogliamo qui.
12431234123412341234123

Se usi i bytestring invece dei charstring di python3 dovresti ottenere l'effetto desiderato
pizzapants184

4

Puoi farlo con python-pyaudio(disponibile almeno in 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()

Grazie per l'aiuto. Sfortunatamente, ricevo molti errori durante l'esecuzione e apportare modifiche a RATE o WAVE non produce alcun suono. Gli errori non sono elencati a causa della mancanza di spazio ma si riferiscono a "ALSA lib". Come cambierei a) per eliminare gli errori eb) per modificare la durata e la frequenza?
Mille

Ricevo anche un sacco di messaggi di errore, ma suona bene. Inoltre, cambiare WAVE mi dà un tono diverso. Stai usando Jack? O semplicemente pulseaudio?
taneli,

2
@ user98415: aggiungi in alto from __future__ import divisionper evitare troncamenti inutili su Python 2.
jfs

@JFSebastian Questo mi ha risolto tutto, grazie
chwi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.