-
        

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 36

Thema: Soundverarbeitung mit dem Raspi

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321

    Soundverarbeitung mit dem Raspi

    Anzeige

    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.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken DSC_0016.jpg  
    Geändert von hirnfrei (29.06.2016 um 10:25 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452
    da bin ich ja mal echt gespannt. Bis jetzt konnte ich mit tinyalsa ja noch NICHTMAL

    Ziel 0:
    nen wav sound ABSPIELEN !!

    (s. http://www.roboternetz.de/community/...e-und-Aufnahme)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321
    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!

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    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! \/

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452
    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....

    http://www.roboternetz.de/community/...e-und-Aufnahme
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    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?'
    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG-20150106-WA0005.jpg
Hits:	5
Größe:	37,7 KB
ID:	31652
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452
    Der Spracherkennung gebe ich nicht viel Erfolg.
    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).

    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.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    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.
    Code:
    options snd-usb-audio index=0
    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:
    #!/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
    Dann halt aplay von einem C-Programm aus fernsteuern. Ich nutze im Beispiel als Eingabe eine USB-Multimediatastaur.

    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;
    }
    Die WAV-Datei liegt bei mir unter /var/musik und heißt girlfriend.wav Die Rechte sollten auf 644 stehen.


    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! \/

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452
    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
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321
    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?

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. Pixy Cam an RasPi per C/C++?
    Von HaWe im Forum Raspberry Pi
    Antworten: 0
    Letzter Beitrag: 20.04.2016, 10:34
  2. ARM TrustZone und Raspi 3B
    Von Hellmut im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 0
    Letzter Beitrag: 12.04.2016, 16:06
  3. Raspi Kaufberatung?
    Von hirnfrei im Forum Raspberry Pi
    Antworten: 33
    Letzter Beitrag: 08.03.2016, 09:14
  4. Antworten: 63
    Letzter Beitrag: 18.02.2016, 08:43
  5. [ERLEDIGT] Raspi Club?
    Von pofoklempner im Forum Raspberry Pi
    Antworten: 16
    Letzter Beitrag: 09.07.2015, 07:20

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •