Hallo.
Da mir das jetzt ein bisschen zu kompliziert ist, wollte ich mal Fragen ob jemand eine Lösung hat.
Ich habe bis jetzt eine USB Soundkarte am Pi, an der Lautsprecher und Mikrofon sind. Läuft soweit top. Jetzt habe ich ein besseres USB Mikrofon bekommen. Das heißt ich müsste jetzt das USB Mikrofon als Standardmikrofon haben. Die Anleitungen die ich gefunden habe, waren immer das gleich alles auf das neue Gerät gepolt wird. Und Fragen nach Ausgang auf USB Soundkarte und Eingang auf anderem Gerät blieben unbeantwortet.
Kann hier jemand die entsprechende Einstellung sagen?
USB Mikrofon und USB Soundkarte jeweils als Standardgerät
- HeAdLeSs
- Thread is marked as Resolved.
-
-
Das hatten wir zum Beispiel im ersten Teil dieses Threads: USB-Mikrofon einrichten
Wenn du mehr Hilfe benötigst, wären die Ausgaben von
interessant und ob du mit mehreren Anwendungen gleichzeitig wiedergeben (und eventuell aufnahmen) willst oder nicht.
-
Ok, ich habe es jetzt hinbekommen. Aber nur um sicherzugehen das es so auch richtig ist (nicht das es 'zufällig' funktioniert.
Aplay -l
Code
Display Morepi@RPI2:~ $ aplay -l **** Liste der Hardware-Geräte (PLAYBACK) **** Karte 1: Device [USB Audio Device], Gerät 0: USB Audio [USB Audio] Sub-Geräte: 1/1 Sub-Gerät #0: subdevice #0 Karte 2: ALSA [bcm2835 ALSA], Gerät 0: bcm2835 ALSA [bcm2835 ALSA] Sub-Geräte: 8/8 Sub-Gerät #0: subdevice #0 Sub-Gerät #1: subdevice #1 Sub-Gerät #2: subdevice #2 Sub-Gerät #3: subdevice #3 Sub-Gerät #4: subdevice #4 Sub-Gerät #5: subdevice #5 Sub-Gerät #6: subdevice #6 Sub-Gerät #7: subdevice #7 Karte 2: ALSA [bcm2835 ALSA], Gerät 1: bcm2835 ALSA [bcm2835 IEC958/HDMI] Sub-Geräte: 1/1 Sub-Gerät #0: subdevice #0
arecord -l
Codepi@RPI2:~ $ arecord -l **** Liste der Hardware-Geräte (CAPTURE) **** Karte 0: DeviceEEPROM [USB PnP Audio Device(EEPROM)], Gerät 0: USB Audio [USB Audio] Sub-Geräte: 1/1 Sub-Gerät #0: subdevice #0 Karte 1: Device [USB Audio Device], Gerät 0: USB Audio [USB Audio] Sub-Geräte: 1/1 Sub-Gerät #0: subdevice #0
.asoundrc
Code#defaults.ctl.card 0 #defaults.pcm.card 0 pcm.!default { type asym playback.pcm "plughw:2" capture.pcm "plughw:0" }
Es gibt also das USB Mikrofon, die USB Soundkarte und die interne Soundkarte. Das Mikrofon ist für Input (Mikrofon der Soundkarte brauche ich nicht), die Ausgabe erfolgt über USB Soundkarte und eigentlich hätte ich gern das Espeak über die interne Soundausgabe spricht. Aber das ist jetzt nicht sooo wichtig. Bin erst einmal glücklich das es mit der Ein- bzw Ausgabe über getrennte Geräte funktioniert.
Ist die .asoundrc so korrekt? -
Wenn es funktioniert stimmt es auch ☺
Nur passt es nicht ganz zu deinem Eingangspost. Zur Wiedergabe hast du nun den Onboardsound (hw:2) auserkoren, obwohl dort die Rede von der USB-Soundkarte (hw:1) als Wiedergabegerät war.
Außerdem ist es meiner Erfahrung nach auf lange Sicht verlässlicher bzw. pflegeleichter die Namen statt der Nummern zu verwenden, weil die Nummern – ganz besonders bei USB-Geräten – ohne jeden Anlass nach einem Neustart anders sein können. Du könntest die Angaben folgendermaßen ändern:
- onboard: plughw:2 → plughw:ALSA
- usbmikrofon: plughw:0 → plughw:DeviceEEPROM
- usb-soundkarte: plughw:1 → plughw:Device
Das andere ist, das du nun die Wiedergabe/Aufnahme ohne weitere Plugins über plughw:X läuft. Es kann also nur eine Anwendung gleichzeitig auf eine Soundkarte zugreifen, ob dich das stört oder ob es gar gewünscht ist, weiß ich natürlich nicht.
[…]Das Mikrofon ist für Input (Mikrofon der Soundkarte brauche ich nicht), die Ausgabe erfolgt über USB Soundkarte und eigentlich hätte ich gern das Espeak über die interne Soundausgabe spricht. […]
Das ist eigentlich kein Problem.
Du musst ja nirgends den besonderen Namen default verwenden. Du kannst den Absatz mit "pcm.meineSoundkarte { ..." beginnen und dann in der Anwendung "meineSoundkarte" als Alsagerät einstellen/angeben.
Genauso kannst du in einer Anwendung direkt, zum Beispiel bei der Aufnahme "plughw:DeviceEEPROM" einstellen und so komplett auf einen Eintrag in der .asoundrc oder asound.conf verzichten. Nur wenn eine Anwendung keine einfache Möglichkeit bietet die Alsageräte auszuwählen, dann hat man es mit (pcm.)default einfacher. (Bei mehreren Anwendungen zur Aufnahme und Wiedergabe ist es aber unwahrscheinlich, dass man dieses Pech für alle Anwendungen hat.)
-
Hallo Smutbert.
So, zurück zu dieser Baustelle. Du hast recht, die IDs haben sich nach dem Neustart schon geändert. Damit gehen die Probleme weiter.
In der .asoundrc kann - und habe - ich die Device Namen verwenden. Das funktioniert soweit gut.
Nur nutze ich in Python die Bibliothek alsaaudio. Dort habe ich noch nicht rausgefunden wie ich den Namen statt der ID eingeben kann. Ich glaube das funktioniert da nicht. Auch beim amixer kann ich nur über die ID angeben... oder habe die Einstellung für den Namen noch nicht gefunden. z.B. sudo amixer -c0 -- sset Speaker 50%Auch hast du recht das nur ein Programm gleichzeitig auf den Speaker zugreifen kann. Spiele ich jetzt Musik ab und möchte gleichzeitig mit ESpeak etwas 'sagen' lassen, dann geht es nicht. Das ist natürlich wiederum doof. Wie kriege ich es hin das mehrere Programme gleichzeitig die Ausgabe benutzen dürfen. (Eingabe kann bei einem bleiben, da gibt es nur Jasper der am Mikro lauscht)
-
-
Moin HeAdLeSs,
doch das geht.
Quotepi@bernd-test:~ $ amixer
Simple mixer control 'Mini',0
Hier habe ich den Namen des Mixer's
Quotepi@bernd-test:~ $ amixer set Mini 40%
Simple mixer control 'Mini',0
Capabilities: volume
Playback channels: Front Left - Front Right
Capture channels: Front Left - Front Right
Limits: 0 - 255
Front Left: 102 [40%]
Front Right: 102 [40%]
Und mit dem Befehl habe ich die Lautstärke verändert.
Gruss Bernd
-
amixer kennt auch die Namen und auch wenn ich nicht weiß wie, bin ich mir ziemlich sicher, dass auch in python geht
zur Wiedergabe mit mehreren Anwendungen musst du in den Weg, den die Audiodaten bei der Wiedergabe gehen das dmix-Plugin einbauen:
Code
Display Morepcm.!default { type plug slave.pcm "duplex" } ctl.!default { type hw card Device } pcm.duplex { type asym playback.pcm "dmixer" capture.pcm "hw:DeviceEEPROM" } pcm.dmixer { type dmix ipc_key 1234 slave.pcm "hw:Device" }
kurz zur Erklärung
Ich habe jedem Schritt, den die Audiodaten durchlaufen einen eigenen Namen gegeben, in der Hoffnung, dass es dadurch etwas übersichtlicher wird - es ist aber auch sonst so manchmal praktischer.
-
pcm.!default, ctl.!default
Das sind nur die default-Geräte, wobei ctl.default nur das default-Gerät für die Lautstärkeregelung definiert. Das ! sorge übrigens dafür, dass mit der Konfigurationsdatei eine bereits existierende Definition des default-Geräts überschrieben bzw. überstimmt wird.
In diesem Fall bietet pcm.default lediglich das plug-Plugin, das eventuell notwendige Konvertierungen des Sampleformates, der Samplerate und der Zahl der Kanäle übernimmt, abgesehen davon aber nur weiterleitet und zwar an -
pcm.duplex
Das dient der Kombination von Wiedergabe- und Aufnahmegeräten unterschiedlicher Soundkarten. Der Aufnahmezweig wird an DeviceEEPROM, also das USB-Mikrofon weitergeleitet (also eigentlich nicht weitergeleitet, sondern umgekehrt die Aufnahmedaten werden von dort gelesen) – nun absichtlich mit hw statt plughw, weil bereits pcm.default das plug-Plugin beinhaltet.
Der Wiedergabezweig wird dagegen nur nur weitergeleitet an -
pcm.dmixer
dmix übernimmt das Mischen der Audioausgabe mehrerer Anwendungen und will nur direkt an die Soundkarte ausgeben, daher hier wieder hw statt plughw (und wie gesagt plug steckt bereits in der Definition von pcm.default drin).
-
pcm.!default, ctl.!default
-
Hallo ihr beiden.
Danke für eure Antworten und mühen. Aber es will irgendwie noch nicht.
Das Problem mit pyalsaaudio habe ich umgangen. Eine direkte Lösung konnte ich nicht finden. Der Workaround:Codedef init_alsa(): card_info = {} for device_number, card_name in enumerate(alsaaudio.cards()): card_info[card_name] = device_number return alsaaudio.Mixer(cardindex=int(card_info["Device"]), control='Speaker') #, control='Speaker'
So komme ich an den 'richtigen' Cardindex. Eine direkte Angabe des Kartennamens im Mixer Aufruf konnte ich nicht finden. Es gibt zwar, lt Handbuch, einen Parameter 'Device', der war aber nicht aufrufbar.
Quotereturn alsaaudio.Mixer(device="Device") # , control='Speaker'
TypeError: 'device' is an invalid keyword argument for this function
Zum dmixer Thema. Leider auch hier keinen Erfolg.
Ich bekomme immer den Fehler das die Resource schon belegt ist.
Muss ich noch etwas ändern als die .asoundrc? Den MPC habe ich schon wie folgt angepasst:
Codeaudio_output { type "alsa" name "Device" #device "hw:0,0" # optional #format "44100:16:2" # optional mixer_device "default" # optional #mixer_control "PCM" # optional #mixer_index "0" # optional mixer_type "software" # optional }
Habe gerade noch was anderes mit aplay probiert, geht auch nicht:
Quotepi@RPI2:~ $ sudo amixer -D hw:Device -- sset Speaker 50%; sudo pico2wave --wave /tmp/pico.wav -l de-DE "Hallo. Ich mache jetzt die Heizung an. Ok?"; sudo aplay -f S16_LE -D plug:dmix /tmp/pico.wav; sudo rm /tmp/pico.wav
Simple mixer control 'Speaker',0
Capabilities: pvolume pswitch pswitch-joined
Playback channels: Front Left - Front Right
Limits: Playback 0 - 37
Mono:
Front Left: Playback 19 [51%] [-18.00dB] [on]
Front Right: Playback 19 [51%] [-18.00dB] [on]
ALSA lib pcm_dmix.c:1052:(snd_pcm_dmix_open) unable to open slave
aplay: main:788: Fehler beim Öffnen des Gerätes: Das Gerät oder die Ressource ist belegt
-
-
Gerade ist mir noch etwas aufgefallen:
Du schreibst du hast eine ~/.asoundrc erstellt, aber du verwendest mpd. mpd läuft als Dienst normalerweise unter seinem eigenen Benutzeraccount, bekommt also von der ~/.asoundrc gar nichts mit. In dem Fall wäre es besser du schreibst das stattdessen in die /etc/asound.conf und löscht die ~/.asoundrc wieder (oder benennst sie um).
Damit hättest du mit der asound.conf für alle Benutzer das Defaultgerät festgelegt und könntest in mpd schreiben:
oder alternativ sollte sogar das noch kürzere
funktionieren (schließlich habe wir das selbst definierte „Gerät“ in der .asoundrc bzw. jetzt asound.conf zum Default gemacht).
Die Wiedergabe der Sprache sollte dann ebenfalls ohne weitere Parameter funktionieren
Codeamixer -D hw:Device -- sset Speaker 50% pico2wave --wave /tmp/pico.wav -l de-DE "Hallo. Ich mache jetzt die Heizung an. Ok?" aplay -f S16_LE /tmp/pico.wav rm /tmp/pico.wav
(root-Rechte/sudo sollten hier wirklich nicht notwendig sein!)
-
-
Hallo smutbert.
Funktioniert wunderbar.
Stimmt, geht auch ohne root Rechte.Danke Dir!
-
Moin HeAdLeSs,
kannst du, bei Gelegenheit, dein Thema als erledigt markieren.
Danke!!
Gruss Bernd