So spielen Sie einen Sound mit fester Frequenz mit Python [geschlossen]

8

Ich habe verschiedene Möglichkeiten ausprobiert, um einen Sound mit fester Frequenz (z. B. 1000 Hz) abzuspielen, und nichts funktioniert.

Ich habe "Beep" heruntergeladen und das macht keine Geräusche.

Ich habe versucht, eine Schnittstelle zu Pyao herzustellen, und das hatte keine Auswirkung.

Ich habe versucht, eine Schnittstelle zu audiere herzustellen, und habe einen Laufzeitfehler erhalten, der darauf hinweist, dass die Bibliothek trotz der Installation über das Softwarecenter nicht gefunden wurde.

Jede Anleitung zur Installation geeigneter Bibliotheken und relevanten Codes wäre sehr dankbar.

Ich kann hierfür keine MP3 / WAV-Dateien generieren, muss aber die Töne zur Laufzeit generieren.

Vielen Dank an dich

user98415
quelle
Sie müssen WAVE zu einem Float machen. Warum nennst du es nicht FREQ? Auch die Gleichung ist nicht richtig. Versuchen Sie dies: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128
Bessere Implementierungen finden Sie hier: stackoverflow.com/questions/974071/…
Gringo Suave

Antworten:

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
quelle
2
es sollte sein(2*math.pi)
jfs
Ich musste eine zukünftige Teilung und 2 * math * pi haben, damit es richtig funktionierte. Python 2.8 32 Bit
Chwi
Python 2.7 spielt dies als "weichen" Sound ab, während Python 3.4 einen viel "summenderen" Sound erzeugt. Warum? Ich habe versucht, die Abteilung ____future____ hinzuzufügen, aber es machte keinen Unterschied.
Ubuntourist
@Ubuntourist Ich bin mir nicht sicher, aber ich denke, Ihr Python 2.7 verwendet eine 8-Bit-Codierung und Ihr Python 3.4 verwendet UTF8, also char()verwenden Sie 2 Bytes für einige Werte in Python 3.4, was wir hier nicht wollen.
12431234123412341234123
Wenn Sie Bytestrings anstelle der Zeichenfolgen von Python3 verwenden, sollten Sie den gewünschten Effekt erzielen
pizzapants184
4

Sie können dies mit python-pyaudio(mindestens ab 12.04 verfügbar) tun :

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
quelle
Danke für deine Hilfe. Leider werden beim Ausführen viele Fehler angezeigt, und Änderungen an RATE oder WAVE führen zu keinem Ton. Die Fehler werden aus Platzgründen nicht aufgelistet, sondern beziehen sich auf "ALSA lib". Wie würde ich a) ändern, um Fehler zu beseitigen und b) Dauer und Häufigkeit ändern? Vielen Dank,
user98415
Ich bekomme auch eine Reihe von Fehlermeldungen, aber es spielt sich gut. Wenn ich WAVE ändere, habe ich auch eine andere Tonhöhe. Verwenden Sie Jack? Oder einfach nur pulseaudio?
Taneli
2
@ user98415: oben hinzufügen from __future__ import division, um unnötiges Abschneiden auf Python 2 zu vermeiden.
jfs
@JFSebastian Das hat alles für mich gelöst, danke
chwi