Comment jouer un son à fréquence fixe en utilisant Python [fermé]


8

J'ai essayé un certain nombre de façons de jouer un son à fréquence fixe (par exemple 1000 Hz) et rien ne fonctionne.

J'ai téléchargé "bip" et cela ne fait aucun bruit.

J'ai essayé de me connecter à pyao, et cela n'a eu aucun effet.

J'ai essayé de me connecter à audiere, et j'obtiens une erreur d'exécution indiquant que la bibliothèque est introuvable, malgré son installation à partir du centre logiciel.

Tout conseil pour l'installation des bibliothèques appropriées et du code pertinent serait le plus apprécié.

Je ne peux pas générer de fichiers .mp3 / .wav pour cela, mais je dois générer les tonalités au moment de l'exécution.

Merci beaucoup pour vous


Vous devez faire de WAVE un flotteur. Pourquoi ne pas l'appeler FREQ? De plus, l'équation n'est pas correcte. Essayez ceci: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128

De meilleures implémentations peuvent être trouvées ici: stackoverflow.com/questions/974071/…
Gringo Suave

Réponses:


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
il devrait être(2*math.pi)
jfs

Je devais avoir une future division et 2 * math * pi pour le faire fonctionner correctement. Python 2.8 32 bits
chwi

Python 2.7 joue cela comme un son "lisse" tandis que Python 3.4 produit un son beaucoup plus "buzzier". Pourquoi? J'ai essayé d'ajouter la division ____future____, mais cela n'a fait aucune différence.
Ubuntourist

@Ubuntourist Je ne suis pas sûr, mais je pense que votre python 2.7 utilise un encodage 8 bits et votre Python 3.4 utilise UTF8, donc char()utilisez 2 octets pour certaines valeurs sur Python 3.4, ce qui n'est pas ce que nous voulons ici.
12431234123412341234123

Si vous utilisez des bytestrings au lieu des charstrings de python3, vous devriez obtenir l'effet souhaité
pizzapants184

4

Vous pouvez le faire avec python-pyaudio(disponible au moins en 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()

Merci de votre aide. Malheureusement, je reçois beaucoup d'erreurs lors de l'exécution, et apporter des modifications à RATE ou WAVE ne produit aucun son. Les erreurs ne sont pas répertoriées en raison d'un manque d'espace, mais reportez-vous à "ALSA lib". Comment changer a) pour éliminer les erreurs et b) pour changer la durée et la fréquence? Merci beaucoup,
user98415

Je reçois également un tas de messages d'erreur, mais cela fonctionne très bien. De plus, changer WAVE me donne un ton différent. Utilisez-vous Jack? Ou tout simplement pulseaudio?
taneli

2
@ user98415: ajouter en haut from __future__ import divisionpour éviter une troncature inutile sur Python 2.
jfs

@JFSebastian Cela a tout résolu pour moi, merci
chwi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.