Jak odtwarzać dźwięk o stałej częstotliwości za pomocą Pythona [zamknięte]

8

Wypróbowałem wiele sposobów odtwarzania dźwięku o stałej częstotliwości (np. 1000 Hz) i nic nie działa.

Pobrałem „sygnał dźwiękowy” i nie powoduje to żadnego hałasu.

Próbowałem połączyć się z pyao, ale to nie przyniosło efektu.

Próbowałem interfejsu do audiere i otrzymałem błąd czasu wykonania wskazujący, że nie można znaleźć biblioteki, pomimo zainstalowania jej z centrum oprogramowania.

Wszelkie wskazówki dotyczące instalacji odpowiednich bibliotek i odpowiedniego kodu będą bardzo mile widziane.

Nie mogę wygenerować plików .mp3 / .wav, ale muszę wygenerować dźwięki w czasie wykonywania.

Wielkie dzięki za ciebie

użytkownik98415
źródło
Musisz sprawić, by WAVE był zmiennoprzecinkowy. Dlaczego nie nazwać tego FREQ? Równanie jest również nieprawidłowe. Spróbuj tego: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128
Lepsze implementacje można znaleźć tutaj: stackoverflow.com/questions/974071/…
Gringo Suave

Odpowiedzi:

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()
użytkownik274527
źródło
2
powinno być(2*math.pi)
jfs
Musiałem mieć przyszły podział i 2 * matematyki * pi, aby działało poprawnie. Python 2.8 32 bit
chwi
Python 2.7 gra to jako „gładki” dźwięk, podczas gdy Python 3.4 generuje znacznie bardziej „brzęczący” dźwięk. Dlaczego? Próbowałem dodać podział ____future____, ale to nie miało znaczenia.
Ubuntourist,
@Ubuntourist Nie jestem pewien, ale myślę, że twój Python 2.7 używa kodowania 8-bitowego, a twój Python 3.4 używa UTF8, więc char()użyj 2 bajtów dla niektórych wartości w Pythonie 3.4, co nie jest tutaj tym, czego chcemy.
12431234123412341234123
Jeśli użyjesz bajtowania zamiast znaków python3, powinieneś uzyskać pożądany efekt
pizzapants184
4

Możesz to zrobić za pomocą python-pyaudio(dostępnego co najmniej w 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
źródło
Dziękuję za pomoc Niestety dostaję mnóstwo błędów podczas uruchamiania, a wprowadzanie jakichkolwiek zmian w RATE lub WAVE powoduje brak dźwięku. Błędy nie są wymienione z powodu braku miejsca, ale odnoszą się do „ALSA lib”. Jak mam zmienić a), aby wyeliminować błędy i b) zmienić czas trwania i częstotliwość? Wielkie dzięki,
user98415,
Dostaję też mnóstwo komunikatów o błędach, ale gra dobrze. Ponadto zmiana WAVE daje mi inny ton. Używasz Jacka? A może po prostu pulseaudio?
taneli
2
@ user98415: dodaj u góry, from __future__ import divisionaby uniknąć niepotrzebnego obcięcia w Pythonie 2.
jfs
@JFSebastian To rozwiązało dla mnie wszystko, dziękuję
chwi 10'15