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.