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!
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 weggelassenHeute 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 13: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
Lesezeichen