Mikrofonaufnahme und abspielen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Daffit
User
Beiträge: 1
Registriert: Samstag 1. Oktober 2016, 12:08

Hallo Zusammen,

ich versuche gerade von Matlab auf Python umzusteigen. Allerdings scheint mir Python etwas komplizierter zu sein, oder zumindestens scheinen mir die Funktionen etwas eingeschränkt! Ist das richtig?

Ich möchte gerade eine Aufnahme mit dem Mikrofon machen und würde es auch gerne im Anschluss abspielen lassen. Nach einer Internetrecherche habe ich folgenden code ausprobiert:

Code: Alles auswählen

import pyaudio
import wave
 
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "file.wav"
 
audio = pyaudio.PyAudio()
 
# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
                rate=RATE, input=True,
                frames_per_buffer=CHUNK)
print ("recording...")
frames = []
 
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print ("finished recording")
 
 
# stop Recording
stream.stop_stream()
stream.close()
audio.terminate()
 
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()
Leider mit Fehlermeldung: ImportError: No module named 'pyaudio'
Ich habe mir Python 3.5.2 runtergeladen. Fehlt mir da irgendein plugin? Über Hilfe freue ich mich sehr!!!!!!!!

Viele Grüße
Daffit



Nur mal zum Vergleich mit Matlab ist das eine kurze Sache:

[codebox=octave file=Unbenannt.txt]recObj = audiorecorder;
disp('Messung startet.')
recordblocking(recObj,5);
disp('Messung beendet.');

% Spielt die Aufnahme.
play(recObj);[/code]
Zuletzt geändert von Anonymous am Samstag 1. Oktober 2016, 16:07, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

python -m pip install pyaudio
Und nur mal so am Rande, nach 6 Monaten intensives Matlab kam ich zu dem Fazit: Nie wieder.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

mit `import` bindest du Module in dein Programm ein. Python hat zwar eine ganze Reihe an Bord, aber es gibt da noch ein paar Zehntausend mehr. Die musst du halt vorher installieren, wie schon gezeigt ist `pip` der Standardweg.

Gruß, noisefloor
BlackJack

@Daffit: Matlab als Sprache ist auf ein sehr spezielles Problemfeld spezialisiert. Python ist dagegen eine universelle Programmiersprache die für alles mögliche eingesetzt werden kann. Insofern würde ich sagen Python ist weniger eingeschränkt als Matlab. Versuch in Matlab mal ein Jump'n'Run-Spiel zu schreiben, oder eine Webanwendung, oder eine Mailinglisten-Software, oder Automatisierung von Serveradministration, oder… Selbst wenn das ein oder andere davon Matlab möglich ist, wird man schnell merken das die Sprache dafür nicht gedacht ist. Umgekehrt heisst das dann allerdings auch, dass die Sprache Syntax und Funktionen für die speziellen Probleme bietet, für die sie entwickelt wurde, und das dann eventuell kompakter und einfacher ist, als wenn man das in einer Programmiersprache schreibt, die nicht für diese Probleme optimiert ist.

`pyaudio` ist nicht Bestandteil der Standardbibliothek. Das ist eine Python-Anbindung an die PortAudio-Bibliothek und hat deshalb auch eine API die an diese Bibliothek angelehnt ist.

Deine beiden Beispiele machen nicht das gleiche. In Python wird nicht abgespielt und dafür aber in eine WAV-Datei geschrieben. Es ist auch ein bisschen umständlich geschrieben mit der `frames`-Liste und der Schleife. Hier mal aufnehmen und abspielen was in etwa das macht, was Dein Matlab-Code macht:

Code: Alles auswählen

from contextlib import closing
import pyaudio
 

def main():
    rate = 8000
    seconds = 5
    audio = pyaudio.PyAudio()

    print('recording...')
    with closing(audio.open(rate, 1, pyaudio.paInt8, input=True)) as stream:
        data = stream.read(rate * seconds)
    print('finished recording')

    with closing(audio.open(rate, 1, pyaudio.paInt8, output=True)) as stream:
        stream.write(data)
    
    audio.terminate()

 
if __name__ == '__main__':
    main()
`stop_stream()` muss man nicht aufrufen wenn man den `Stream` sowieso gleich danach schliesst. Das ist dafür gedacht wenn man das Aufnehmen anhalten und später mit `start_stream()` fortsetzen möchte ohne den `Stream` zwischendurch zu schliessen und dann neu zu öffnen.

Mit dem `sounddevice`-Modul gibt es noch eine andere Anbindung an PortAudio, vielleicht ist die interessanter für Dich, weil die a) einfachere Funktionen zum Aufnehmen und Abspielen bietet und b) keine `str`/`bytes`-Objekte verarbeitet sondern Numpy-Arrays. Falls Du mit den Daten ausser aufnehmen und abspielen noch irgend etwas ”mathematisches” anstellen möchtest.
Antworten