Как воспроизвести звук с фиксированной частотой, используя Python [закрыто]

8

Я пробовал несколько способов воспроизведения звука с фиксированной частотой (например, 1000 Гц), и ничего не работает.

Я скачал "Beep", и это не шумит.

Я попытался связаться с pyao, и это не имело никакого эффекта.

Я попытался подключиться к audiere, и получил ошибку времени выполнения, указывающую, что библиотека не может быть найдена, несмотря на ее установку из центра программного обеспечения.

Любое руководство по установке соответствующих библиотек и соответствующего кода будет наиболее полезным.

Я не могу сгенерировать .mp3 / .wav файлы для этого, но мне нужно генерировать тоны во время выполнения.

Большое спасибо за вас

user98415
источник
Вы должны сделать WAVE поплавком. Почему бы не назвать это FREQ? Также уравнение не верно. Попробуйте это: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128
Лучшие реализации можно найти здесь: stackoverflow.com/questions/974071/…
Gringo Suave

Ответы:

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
источник
2
это должно быть(2*math.pi)
JFS
Я должен был иметь будущее разделение и 2 * математика * пи, чтобы заставить его работать правильно. Python 2.8 32 бит
чуи
Python 2.7 воспроизводит это как «плавный» звук, в то время как Python 3.4 производит гораздо более «шумный» звук. Почему? Я попытался добавить раздел ____future____, но это не имело никакого значения.
Убунтурист
@ Ubuntourist Я не уверен, но я думаю, что ваш Python 2.7 использует 8-битную кодировку, а ваш Python 3.4 использует UTF8, поэтому char()используйте 2 байта для некоторых значений в Python 3.4, что здесь не то, что нам нужно.
12431234123412341234123
Если вы используете строки байтов вместо charstrings в python3, вы должны получить желаемый эффект
pizzapants184
4

Вы можете сделать это с python-pyaudio(доступно по крайней мере в 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
источник
Спасибо за помощь. К сожалению, я получаю множество ошибок при запуске, и внесение любых изменений в RATE или WAVE не приводит к звуку. Ошибки не перечислены из-за нехватки места, но ссылаются на «ALSA lib». Как бы я изменил а) чтобы устранить ошибки и б) изменить продолжительность и частоту? Большое спасибо,
user98415
Я также получаю кучу сообщений об ошибках, но он играет просто отлично. Кроме того, изменение WAVE дает мне другую высоту звука. Ты используешь джек? Или просто pulaudio?
танели
2
@ user98415: добавьте вверху, from __future__ import divisionчтобы избежать ненужного усечения в Python 2.
jfs
@JFSebastian Это все решило для меня, спасибо
chwi