Ishidres
Anmeldungsdatum: 30. März 2015
Beiträge: Zähle...
|
Hey Leute! Ich hab heute mal probiert ein Soundaufnahmeprogramm zu programmieren! Dabei hab ich ein wenig gegoogelt und bin auf folgendes Beispielprogramm gestoßen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | import pyaudio
import sys
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, output = True, frames_per_buffer = chunk)
print("* recording")
for i in range(0, 44100 / chunk * RECORD_SECONDS):
data = stream.read(chunk)
# check for silence here by comparing the level with 0 (or some threshold) for
# the contents of data.
# then write data or not to a file
print("* done")
stream.stop_stream()
stream.close()
p.terminate()
|
Also hab ich das Modul PyAudio installiert und gleich mal probiert das Programm zum Laufen zu bringen! 👿 👿 👿 👿 👿 👿 👿 👿 👿 👿 👿 👿 👿 👿 👿 👿 👿 Doch so einfach macht mir das Python dann doch nicht: Fehlermeldung: | Traceback (most recent call last):
File "SoundRecord.py", line 1, in <module>
import pyaudio
ImportError: bad magic number in 'pyaudio': b'\x03\xf3\r\n'
|
Wisst ihr vielleicht was "bad magic number in 'pyaudio': b'\x03\xf3\r\n'" bedeutet? Über eine Antwort würde ich mich seeeeeehhhrrr freueen! 😀 VG Ishidres
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Ishidres schrieb: Also hab ich das Modul PyAudio installiert ...
Wie hast Du das denn gemacht ? Das sieht nämlich wie eine Win...- Datei aus: Traceback (most recent call last):
File "SoundRecord.py", line 1, in <module>
import pyaudio
ImportError: bad magic number in 'pyaudio': b'\x03\xf3\r\n'
track
|
Ishidres
(Themenstarter)
Anmeldungsdatum: 30. März 2015
Beiträge: 68
|
Also das hab ich über das Terminal gemacht! Und das wäre jetzt wohl ein zu langer Weg dies zu beschreiben! :/ Trotzdem danke für deine Antwort! 😀
|
Acer54
Anmeldungsdatum: 6. Juli 2011
Beiträge: 700
Wohnort: Bayern
|
der lange Weg über das Terminal sah so aus ?? : sudo apt-get install python-pyaudio Oder hast du es irgendwie "per Hand" installiert. EDIT: Hab da noch was bei stackoverflow gefunden: http://stackoverflow.com/questions/25776782/i-cannot-get-import-random-to-work-python-3 Anscheinend erzeugt Python diesen Fehler, wenn ein Python 2.7 Lib mit dem Python 3 Interpreter geladen wird.....
|
Ishidres
(Themenstarter)
Anmeldungsdatum: 30. März 2015
Beiträge: 68
|
Ok, Leute,
ich hab ein Tag davor mein Python auf die Version 3.4 upgedatet!
Gerade hab ich nochmal gegooglet und herausgefunden, dass das dann offensichtlich aus irgendeinem Grund nicht klappen kann (obwohl ich das Modul für Python 3 installiert habe)!
|
Ishidres
(Themenstarter)
Anmeldungsdatum: 30. März 2015
Beiträge: 68
|
Ähm, nein "der lange Weg" ( 😀 ) war echt ein längerer Weg als das!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Ishidres schrieb: Ähm, nein "der lange Weg" ( 😀 ) war echt ein längerer Weg als das!
Klingt irgendwie nicht richtig... 😉
|
Ishidres
(Themenstarter)
Anmeldungsdatum: 30. März 2015
Beiträge: 68
|
Ok, ich hab jetzt ganz einfach das Modul und meine Python-Version zurück auf Python 2 gestellt! Und tada: Es klappt sogar! Doch dafür ist da jetzt eine andere Meldung: | ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:947:(find_matching_chmap) Found no matching channel map
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
* recording
* done
������������������� ... und noch sehr viel weitere von diesen Zeichen!
|
Das war mein Benutzter Code-Block: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | import pyaudio
import sys
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 4
RATE = 44100
RECORD_SECONDS = 3
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, output = True, frames_per_buffer = chunk)
print("* recording")
for i in range(0, 44100 / chunk * RECORD_SECONDS):
data = stream.read(chunk)
# check for silence here by comparing the level with 0 (or some threshold) for
# the contents of data.
# then write data or not to a file
print("* done")
stream.stop_stream()
stream.close()
p.terminate()
print data // Daher kommen diese �-Zeichen
|
Weiss jemand vielleicht wiso vor "* recording" so eine art Fehlermeldung kommt? Und wenn ja, vielleicht auch sagen was da auf Deutsch Deutsch ( xD ) genau bedeutet. Denn ich kann das so nicht entziffern! :/ Ich würde mich über wirklich jeeeeddeeee Antwort seeeehr freuen! 😀 ☺ ☺ 😀 VG Ishidres
|
Acer54
Anmeldungsdatum: 6. Juli 2011
Beiträge: 700
Wohnort: Bayern
|
Ich habe mittlerweile auch einiges mit PyAudio und den Aufnahme Funktionalitäten gemacht ... ich hatte damals die gleiche "Fehlermeldung" wobei diese zu keinem echten Fehler führt, sondern nur das Debug-Fenster mit ein paar Zeilen füllte... Funktioniert bei dir irgendetwas nicht ? Oder stören dich nur die Meldungen an sich. Wenn es nur um die Meldungen geht, müsste man sich einen Error-Handler anschaffen, welcher die stderr Meldungen einfasch "schluckt". Wie dies in Python um zu setzen ist, ist hier beschrieben: http://stackoverflow.com/questions/7088672/pyaudio-working-but-spits-out-error-messages-each-time Gruß Matthias
|
Ishidres
(Themenstarter)
Anmeldungsdatum: 30. März 2015
Beiträge: 68
|
Nein, mich hat nur diese Meldung am Anfang irritiert. Danke für deine Antwort! 😀 Ich werd da später mal (bei deinem genannten Link) nachschauen! VG Ishidres P.S: Weißt du wie man den aufgenommenen Text wieder abspielt, oder in nem bestimmten Ordner abspeichert?
|
Acer54
Anmeldungsdatum: 6. Juli 2011
Beiträge: 700
Wohnort: Bayern
|
Hier ist ein schönes Beispiel: http://stackoverflow.com/questions/892199/detect-record-audio-in-python
Aber für Python Themen bitte dann einen neuen Thread eröffnen, oder an ein entsprechendes Forum wenden. ABER: Die Erfahrung mit Python zeigte... Google ist dort das Allheilmittel... dort findet sich zu sogut wie jedem Thema ein Beispiel. Allerdings ist Englisch Voraussetzung. Gruß
|
Ishidres
(Themenstarter)
Anmeldungsdatum: 30. März 2015
Beiträge: 68
|
|
Ishidres
(Themenstarter)
Anmeldungsdatum: 30. März 2015
Beiträge: 68
|
Jaaaah! Ich habs endlich hingekriegt! Danke, danke, danke, danke!!! Hier mein benutzter Code zum Aufnehmen von 3 Sekunden: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 | #Instead of adding silence at start and end of recording (values=0) I add the original audio . This makes audio sound more natural as volume is >0. See trim()
#I also fixed issue with the previous code - accumulated silence counter needs to be cleared once recording is resumed.
from array import array
from struct import pack
from sys import byteorder
import copy
import pyaudio
import wave
THRESHOLD = 500 # audio levels not normalised.
CHUNK_SIZE = 1024
SILENT_CHUNKS = 3 * 44100 / 1024 # about 3sec
FORMAT = pyaudio.paInt16
FRAME_MAX_VALUE = 2 ** 15 - 1
NORMALIZE_MINUS_ONE_dB = 10 ** (-1.0 / 20)
RATE = 44100
CHANNELS = 1
TRIM_APPEND = RATE / 4
def is_silent(data_chunk):
"""Returns 'True' if below the 'silent' threshold"""
return max(data_chunk) < THRESHOLD
def normalize(data_all):
"""Amplify the volume out to max -1dB"""
# MAXIMUM = 16384
normalize_factor = (float(NORMALIZE_MINUS_ONE_dB * FRAME_MAX_VALUE)
/ max(abs(i) for i in data_all))
r = array('h')
for i in data_all:
r.append(int(i * normalize_factor))
return r
def trim(data_all):
_from = 0
_to = len(data_all) - 1
for i, b in enumerate(data_all):
if abs(b) > THRESHOLD:
_from = max(0, i - TRIM_APPEND)
break
for i, b in enumerate(reversed(data_all)):
if abs(b) > THRESHOLD:
_to = min(len(data_all) - 1, len(data_all) - 1 - i + TRIM_APPEND)
break
return copy.deepcopy(data_all[_from:(_to + 1)])
def record():
"""Record a word or words from the microphone and
return the data as an array of signed shorts."""
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, output=True, frames_per_buffer=CHUNK_SIZE)
silent_chunks = 0
audio_started = False
data_all = array('h')
for i in range(129):
# 1 sec = 43
# 2 sec = 86
# 10 sec = 430
# usw...
# little endian, signed short
data_chunk = array('h', stream.read(CHUNK_SIZE))
if byteorder == 'big':
data_chunk.byteswap()
data_all.extend(data_chunk)
silent = is_silent(data_chunk)
if audio_started:
if silent:
silent_chunks += 1
if silent_chunks > SILENT_CHUNKS:
break
else:
silent_chunks = 0
elif not silent:
audio_started = True
sample_width = p.get_sample_size(FORMAT)
stream.stop_stream()
stream.close()
p.terminate()
data_all = trim(data_all) # we trim before normalize as threshhold applies to un-normalized wave (as well as is_silent() function)
data_all = normalize(data_all)
return sample_width, data_all
def record_to_file(path):
"Records from the microphone and outputs the resulting data to 'path'"
sample_width, data = record()
data = pack('<' + ('h' * len(data)), *data)
wave_file = wave.open(path, 'wb')
wave_file.setnchannels(CHANNELS)
wave_file.setsampwidth(sample_width)
wave_file.setframerate(RATE)
wave_file.writeframes(data)
wave_file.close()
if __name__ == '__main__':
print("Wait in silence to begin recording; wait in silence to terminate")
record_to_file('demo.wav')
print("done - result written to demo.wav")
|
Das ganze wird dann im selben Verzeichnis gespeichert wo auch das Python Programm gerade läuft, aber das weißt du sicher schon! 😀 Vielen Dank VG Ishidres
|