da bin ich ja mal echt gespannt. Bis jetzt konnte ich mit tinyalsa ja noch NICHTMAL
Ziel 0:
nen wav sound ABSPIELEN !!
(s. https://www.roboternetz.de/community...e-und-Aufnahme)
Mahlzeit!
So los geht es mit der Erkennung von akustischen Geräuschen und deren Auswertung. Dazu setze ich die USB-Soundkarte von Conrad ein, ein Mikro von meinem Headset, den Raspberry Pi 3 und mal für den Anfang tinyalsa.
Edit: Tinyalsa ist vom Tisch. Es mag gut sein, aber bei derart mangelhafter Dokumentation für mich nicht zu gebrauchen. Weiter mit Alsa!
Ich hänge mal ein Bild an wie das aktuell aussieht. Da ist dann auch noch der Arduino dabei, der regelt eigentlich die Stromquelle vom Raspi, da aber derzeit die Akkus wegen dem schönen Wetter anderweitig im Einsatz sind und ich auch noch nicht ganz fertig bin (Ende des Monats ist das Geld meist knapp) bleibt der Teil jetzt erst einmal weg.
Ziel 0 (Durch die Anregung von HaWe):
Initialisieren einer wav-Datei und abspielen mittels Alsa.
Abgeschlossen 30.05.2016
Ziel 1:
tinyalsa dazu bringen das das was das Mikrofon aufnimmt auch nutzbar in den Raspberry gelangt. (Wegen tinyalsa verworfen)
Mein Code dazu bringen, Sound über das Mikrofon aufzunehmen und wieder abspielen
Abgeschlossen 02.06.2016
Ziel 2:
Eingegangene Daten so aufbereiten, dass sie für eine Spracherkennung mittels PocketSphinx nutzbar sind.
Geändert von hirnfrei (29.06.2016 um 10:25 Uhr)
da bin ich ja mal echt gespannt. Bis jetzt konnte ich mit tinyalsa ja noch NICHTMAL
Ziel 0:
nen wav sound ABSPIELEN !!
(s. https://www.roboternetz.de/community...e-und-Aufnahme)
Ich habe mich jetzt noch nicht so intensiv mit tinyalsa beschäftigen können (irgendwie wollen Kinder immer Zeit für sich haben), aber dokumentiert ist das ja gar nicht gut!
Hallo,
nein, in dem Paket steht auch etwas von Android. Da muss für das Raspi Debian wohl noch einiges angepasst werden. Da kann ich mehr schnellere Erfolge bei dem Code von aplay (und arecord) bei Eurem Vorhaben vorstellen. Das sollte sich als weiteren Thread gestartet auch relativ einfach so, wie es ist, steuern lassen. Von arecord aufgezeichnete Dateien müssen dann analysiert werden. Erstmal leise Geräusche rausfiltern, dann evtl. per mehreren Durchgängen das Aufgenommene entfeinern, bis sich ein Muster auch bei verschiedenen Aussprachen ergibt. Die Spitzen der verschiedenen Frequenzen lassen sich z.B. mittels FFT rausfinden. Das habe ich vor Jahren mal probiert, als ich für meinen Media-Player einen Sprectrum-Analyzer programmiert wollte. > Den habe ich dann einfach weggelassen Heute habe ich mehr Erfahrung und würde es in einigen Tagen auch hinbekommen, brauche ich aber nicht mehr.
Ich selbst spiele mittels MPD Audi-Dateien ab. Der bietet auch einige Schnittstellen. Aufnehmen tue ich nicht. Spracherkennung ist auch nicht so einfach mal eben selbst programmiert. Da haben einige Firmen Jahre für gebraucht und auch heute noch schicken Siri, Amazon und Google die Sounds in die Cloud und bekommen Text zurück. Evtl. gibt es da eine API, die sich nutzen lässt. Das bedeutet dann ständiges online sein.
Falls Ihr etwas fernsteuern möchtet, schlage ich statt Spracherkennung eine App vor. Das bedeutet eine neue Programmierumgebung. Soll es für Android und Apple sein, zwei Programmierumgebungen. Oder einen Webserver auf dem Raspi und auf dem Smartphone / Tablet per Browser. Mittels Ajax lässt sich da schon was optisch ansprechendes erstellen.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
hallo,
aplay und arecord das sind ja externe Programme, d.h. die müssten per system Befehl innerhalb des C programms abgespielt werden, was dann auch die Portierbarkeit des Codes sehr einschränkt (z.b: Win10, falls es das mal für Raspi gibt oder auch für ganz andere Plattformen).
Schade, dass es keine originalen und frei portierbaren C/C++ API libs dafür gibt.
Aber was haben wir für eine Wahl, wenn nur aplay / arecord zur Verfügung steht... :-/
Ich würde persönlich dann auch nicht den 2. Schritt vor dem 1. tun und erstmal einen Player implementieren, der automatisch das Soundfile Format beliebiger wavs erkennt und dann abspielt.
Ich führe den Player-Gedanken mal weiter in dem Player-Thread....
https://www.roboternetz.de/community...e-und-Aufnahme
Hallo,
der Code von aplay ist frei verfügbar. Der Spracherkennung gebe ich nicht viel Erfolg. Eben gerade mit der Hotline der Telekom telefoniert. Der dämliche 'Automat', zu Beginn des Telefonates, versteht nicht mal ein 'Ja', welches bequem ausreichend laut per Freisprechfunktion mit leisem Radio im Hintergrund gesagt wurde. Dann habe ich eben mal mit Google 'gesprochen'. Was der da so teilweise versteht, ist echt abenteuerlich. Lustig ist die Antwort auf 'OK Google - Wer bin ich?'
Wenn das Herz involviert ist, steht die Logik außen vor! \/
ich sehe das auch als extremste Herausforderung, aber mit dem Umweg über eine FFT, bei der "unwichtige Spikes", die für bestimmte Frequenzbereiche stehen, gelöscht werden (habe ich schon mal gemacht), kann man schon einmal recht gut "ähnliche" Sounds vergleichen (z.B. Zelle für Zelle über einen Vergleich mit bekannten Mustern per minimaler Summe der Quadratischen Abweichungen).Der Spracherkennung gebe ich nicht viel Erfolg.
Dennoch, erstmal müsste ein fertiger einfacher C Code existieren für Play und Record, die aplay man page ist mir da komplett unverständlich.
Hallo,
naja ein Programm (z.B. aplay) ist recht einfach zu starten.
Welche Parameter Du da abfragen willst, weiß ich nicht. Am besten den Mixer vorher einmalig einstellen. Dann braucht man das nicht mit aplay machen.
Z.B. eine USB-Soundkarte als Standard setzen: Die Datei /etc/modprobe.d/alsa-base.conf edititieren. Der USB-Eintrag muss auf 0, alle anderen auf -2 stehen. Dann ist nach einem Neustart eine evtl. vorhandene USB-Soundkarte immer Standard für Mixer und aplay.
Dann am besten in einem Autostart-Script (z.B. /etc/rc.local) den Mixer korrekt einstellen. Ich stelle die Lautstärke oft auf 80 Prozent, da hört man weniger Nebengeräusche. Sonst hört man evtl. durch den USB-Lautsprecher den Raspi arbeiten.Code:options snd-usb-audio index=0
Dann halt aplay von einem C-Programm aus fernsteuern. Ich nutze im Beispiel als Eingabe eine USB-Multimediatastaur.Code:#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi # export WIRINGPI_GPIOMEM=1 amixer cset numid=3 1 amixer -c 0 cset numid=2 on,off amixer set PCM 80% exit 0
Die WAV-Datei liegt bei mir unter /var/musik und heißt girlfriend.wav Die Rechte sollten auf 644 stehen.Code://Kompilieren: GCC -o /var/aptest/aptest /var/aptest/aptest.c -L/usr/local/lib -lpthread //Aufrufen mittels: nice -1 /var/aptest/aptest < /dev/input/event0 & #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <sys/sysinfo.h> #include <time.h> #include <linux/input.h> #include <pthread.h> int ziffer=0; int beenden=2; int zeit=0; int shiftl=0; int shiftr=0; int strgl=0; int strgr=0; int capsl=0; int apid=0; FILE* aplaypipe; /* Filehandle fuer die Pipe */ void stopp() { char befehl[12] =""; strcpy (befehl,"pkill aplay"); system(befehl); } void wiedergabe(char dateiname[]) { char befehl[1024] =""; strcpy (befehl,"nice -1 aplay /var/musik/"); strcat(befehl,dateiname); strcat(befehl," &"); stopp(); aplaypipe=popen(befehl, "r"); printf("pipe: %d\n",aplaypipe); pclose(aplaypipe); } void tastatur(void *name) { struct input_event event; while ((read(0, &event, sizeof(event)) > 0) && (beenden==2) ) { if (event.type != EV_KEY) continue; // if (event.value != EV_KEY) continue; //Nur Tastendrücke erkennen, kein Loslassen. 0=losgelassen, 1=gedrückt, 2=Wiederholung(lang gedrückt) printf("Typ: %d; Wert: %d; Code: %d\n",event.type,event.value,event.code); if(event.value != EV_KEY){ switch (event.code) { case 164:wiedergabe("girlfriend.wav");break;//Play case 166:stopp();break;//Stop case 62:stopp();beenden=0;break; //Close } } } beenden=0; pthread_exit((void *) 0); } int main(int argc, char** argv) { pthread_t t1; if(pthread_create(&t1, NULL, (void *)&tastatur, (void *)"Tastatur") != 0) { fprintf(stderr, "Fehler bei Tastatur......\n"); exit(0); } while (beenden > 0) { sleep(1); zeit++; if (zeit==30) { zeit=0; printf("Wieder 30 Sekunden um.\n"); } } usleep(50); printf("***********Ende************\n"); return 0; }
Edit:
Der Code wurd auf das Wesentliche gekürzt und enthält evtl. noch ungenutzte Variablen und Verweise.
Edit2:
Evtl. Fehler werden nicht abgefangen. (Z.B. falsch geschriebener Dateiname, falsche Dateirechte, etc)
Geändert von peterfido (29.05.2016 um 14:49 Uhr)
Wenn das Herz involviert ist, steht die Logik außen vor! \/
ganz herzlichen Dank, das werde ich baldmöglichst mal austesten.
Es ist ja wirklich recht komplex, aber trotzdem noch sehr überschaubar.
Fehler braucht man auch nicht abfangen, es ist ja für ein "fixes" C-programm mit fest vorgegebenen wav-Files.
Aktuell ist mein raspi durch eine Pinverwechslung (GND gegen gpio.26 PWM) durchgeschmort.
Ersatz ist aber geordert.
OT:
Meine Lehre daraus:
ich werde die Breadboards mit T-Cobbler weitgehend schassen und mir ein paar Bauteile auf Raspi-Shields mit durchgeschleiftem GPIO-Header fest verlöten (lassen). Das mit den GNDs überall dazwischen ist ja wirklich dämlich lebensgefährlich konstruiert (für den Pi).
/OT
Davor habe ich auch die ganze Zeit Schiss, dass ich da einen Pin wo dran klemme wo der Raspi es dann nicht verträgt. Daher meine Variante mit der Platine. Jede Strippe die an den Arduino geht ist beschriftet und wenn ich da was neues dran löte wird anschliessend erst getestet wie viel Spannung da wirklich drüber geht, bevor es dann mal wirklich an den Raspi gesteckt wird. Schiss hab ich dennoch immer und auch wenn ich nichts verändert habe, bevor ich den Arduino an mache gucke ich immer ob noch alle Kabel dort sind wo sie sein sollen.
Warum haben die beim Raspi nur 3,3V genommen?
Lesezeichen