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

user98415
la source
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()
user274527
la source
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()
taneli
la source
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