Cómo reproducir un sonido de frecuencia fija usando Python [cerrado]

8

He intentado varias formas de reproducir un sonido de frecuencia fija (por ejemplo, 1000Hz) y nada funciona.

He descargado "pitido" y eso no hace ruido.

Traté de interactuar con pyao, y eso no tuvo ningún efecto.

Intenté conectarme a audiere y recibí un error de tiempo de ejecución que indica que no se pudo encontrar la biblioteca, a pesar de instalarla desde el centro de software.

Cualquier guía para la instalación de bibliotecas apropiadas y código relevante sería muy apreciada.

No puedo generar archivos .mp3 / .wav para esto, pero necesito generar los tonos en tiempo de ejecución.

Muchas gracias por ti

usuario98415
fuente
Necesitas hacer WAVE un flotador. ¿Por qué no llamarlo FREQ? Además, la ecuación no es correcta. Pruebe esto: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128
Se pueden encontrar mejores implementaciones aquí: stackoverflow.com/questions/974071/…
Gringo Suave

Respuestas:

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()
usuario274527
fuente
2
debería ser(2*math.pi)
jfs
Tenía que tener una división futura y 2 * matemáticas * pi para que funcionara correctamente. Python 2.8 32 bit
chwi
Python 2.7 reproduce esto como un sonido "suave", mientras que Python 3.4 produce un sonido mucho más "zumbido". ¿Por qué? Intenté agregar la división ____futuro____, pero no hizo ninguna diferencia.
Ubuntourist
@Ubuntourist No estoy seguro, pero creo que su Python 2.7 usa una codificación de 8 bits y su Python 3.4 usa UTF8, por lo que char()usa 2 Bytes para algunos valores en Python 3.4, que no es lo que queremos aquí.
12431234123412341234123
Si usa cadenas de bytes en lugar de las cadenas de caracteres de python3, debería obtener el efecto deseado
pizzapants184
4

Puede hacerlo con python-pyaudio(disponible al menos 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
fuente
Gracias por tu ayuda. Desafortunadamente, recibo un montón de errores al ejecutar, y al hacer cualquier cambio en RATE o WAVE no se produce ningún sonido. Los errores no se enumeran debido a la falta de espacio, pero se refieren a "ALSA lib". ¿Cómo cambiaría a) para eliminar errores yb) para cambiar la duración y la frecuencia? Muchas gracias,
user98415
También recibo un montón de mensajes de error, pero funciona bien. Además, cambiar WAVE me da un tono diferente. ¿Estás usando Jack? O simplemente pulseaudio?
taneli
2
@ user98415: agregue en la parte superior from __future__ import divisionpara evitar el truncamiento innecesario en Python 2.
jfs
@JFSebastian Eso resolvió todo por mí, gracias
chwi