- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 36

Thema: Soundverarbeitung mit dem Raspi

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    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! \/

  2. #2
    HaWe
    Gast
    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.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    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 13:49 Uhr)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  4. #4
    HaWe
    Gast
    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

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

  6. #6
    HaWe
    Gast
    3,3V ist bei allen ARM Boards Standard, auch bei den ARM Arduinos, dem Teensy, BeagleBone Black+Blue, Pine64...
    5V dagegen sind veraltet und stammen aus den AVR-Zeiten, viele Komponenten haben heute aber sogar bereits 1,8V Standard.
    Aber auf den Arduinos liegt alles sauber getrennt, nur bei den Spannungs- und gpio-Pins geht beim Raspi alles durcheinander wie Kraut und Rüben. Als ob man nicht erst einen Block mit 4 GND, dann 2x 5V und dann 2x3,3V hätte machen können - und dann erst die gpios hintendran. Also nee...

    Aber zurück zum Thema:
    hast du schon wavs abspielen und aufnehmen können?

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Ah so ist das. Alles klar! Danke für die Info.

    Nein. Aber immerhin kann ich die Soundkarte öffnen, initialisieren, die Parameter auslesen und das Ganze wieder schliessen. Es geht also voran

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Hallo,

    das ist der Trend. Kleinere Spannung=weniger strom=weniger Leistung. Nebenbei ist der Pegel schneller von GND auf 3V3 als auf 5V0. Die nächste Stufe ist dann 1V8. Die Ausgänge sind nur als Pegel zu verarbeiten. Maximal 3mA würde ich da fließen lassen.

    Mein Beispiel da oben ist nicht optimiert und soll veranschaulichen, wie man aplay steuern kann. Evtl. muss das Nice weggelassen werden, damit in aplaypipe die PID von aplay abgelegt wird. Die bräuchte man, wenn man mehrere Sounds gleichzeitig / versetzt / wie auch immer laufen hat und nicht alle auf einmal stoppen möchte. Das ist in meinem Beispiel nicht drin.

    Läuft immer nur ein Sound / WAV-Datei, dann kann man auch rein mit system arbeiten.

    Ungestetes Beispiel:
    Code:
    void stopp()
    {
        system("pkill aplay");
    }
    
    void wiedergabe(char dateiname[])
    {
        char befehl[512] ="";
        stopp();
        strcpy (befehl,"nice -1 aplay /var/musik/");
        strcat(befehl,dateiname);
        strcat(befehl," &");
        system(befehl);    
    }
    Geändert von peterfido (29.05.2016 um 19:49 Uhr)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  9. #9
    HaWe
    Gast
    kann man nice -1 nicht sowieso einfach rauslassen?
    prio == -20...+19, 0 ist ja standard, und -1 braucht auch noch root.

    system ("aplay /var/musik/dateiname &");


  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Also ich habe der Karte einen ziemlich fiesen Ton entlockt. Der Ton war so toll das ich ihn immer noch höre ^^.

    Also wo stehe ich. Ich kann mittels ALSA die Soundkarte öffnen, die Parameter abrufen, sie beliebig setzen und vorbereiten.

    An dieser Stelle käme dann das mit dem Sound. Da hatte ich den Fehler das ich nur einmal Daten gelesen habe und diese dann laufend zur Karte geschickt hatte. Lese ich das File komplett, oder auch stückweise gibt es gar keinen Ton von sich.

    Letzten Endes wird die Soundkarte dann auch wieder deaktiviert.

    Bliebe die Frage, wie bringe ich dem das mit den Audiodaten näher? Ich nehme an ich muss das Wav-File erst entsprechend verarbeiten. So mit Headern usw. Habe ich so aber noch nicht gemacht mit Audiodateien.

Ähnliche Themen

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

Berechtigungen

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

Solar Speicher und Akkus Tests