Der RasPi hört aufs Wort [1. Post edit, bessere Lösungen sind da]

Begonnen von Rince, 29 Mai 2013, 18:00:46

Vorheriges Thema - Nächstes Thema

franky08

So, bin jetzt einen Schritt weiter. Hatte dummerweise die falsche Zeile editiert. Aufnahme geht jetzt:

Input File     : 'hw:1,0' (alsa)
Channels       : 2
Sample Rate    : 44100
Precision      : 24-bit
Sample Encoding: 24-bit Signed Integer PCM

In:0.00% 00:00:00.84 [00:00:00.00] Out:0     [      |      ]        Clip:0    Stille...
In:0.00% 00:00:01.86 [00:00:00.00] Out:0     [      |      ]        Clip:0    Stille...
In:0.00% 00:00:02.79 [00:00:00.00] Out:5.73k [   ===|===   ]        Clip:0    Aufnahme!
In:0.00% 00:00:03.81 [00:00:00.00] Out:21.3k [      |      ]        Clip:0    Aufnahme!
In:0.00% 00:00:04.92 [00:00:00.00] Out:21.3k [      |      ]        Clip:0    Abschicken
In:0.00% 00:00:05.02 [00:00:00.00] Out:21.3k [      |      ]        Clip:0   
Aborted.
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
Warning, using s16 intermediate sample format for resampling
size=      17kB time=0.50 bitrate= 284.3kbits/s   
video:0kB audio:9kB global headers:0kB muxing overhead 85.368377%

mplayer: could not connect to socket
mplayer: No such file or directory
Kein Kommando erkannt...
sox WARN alsa: can't encode 16-bit Signed Integer PCM


Jetzt stimmt mit dem mplayer noch etwas nicht.

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

das ist ja schon mal was :)

ich müsste mir jetzt das Skript mal ansehen - mach ich morgen mal.
Scheint als funktioniert die Aufnahme, allerdings das encoden in eine Datei nicht

ansonsten könnte es sein, dass evtl irgendwelche Rechte fehlen oder so...

vg
Kuzl

franky08

Ich denke mal das es mit dem Text2Speech Modul zusammenhängt. Das benutzt ja auch mplayer und zwei Instanzen können wahrscheinlich nicht auf das gleiche Device zugreifen.

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

Kann ich mir ehrlich gesagt nicht vorstellen man kann ja auch gleichzeitig mit 2 Instanzen 2 mp3s abspielen.
Kann man allerdings einfach durch kurzzeitiges auskommentiern/ausschalten von FHEM herausfinden ;)

franky08

#79
So, nachdem ich den Fehler in der mplayer.conf gefunden habe (norlirc geschrieben, statt nolirc=yes) funktioniert das ganze bis auf das der mplayer keine Audioausgabe macht. Gesprochene Befehle werden erkannt und ausgeführt aber "echo ... " bringt keine Ausgabe, eine ins Verzeichnis kopierte Test.wav wird auch nicht wiedergegeben. Da ich Text2Speech ebenfalls laufen habe, kommt die Audioausgabe darüber.

ZitatStream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
Warning, using s16 intermediate sample format for resampling
size=      23kB time=0.72 bitrate= 260.6kbits/s   
video:0kB audio:15kB global headers:0kB muxing overhead 54.265605%
Licht aus
Licht aus
sox WARN alsa: can't encode 16-bit Signed Integer PCM

Input File     : 'hw:1,0' (alsa)
Channels       : 2
Sample Rate    : 44100
Precision      : 24-bit
Sample Encoding: 24-bit Signed Integer PCM

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

Ok dann hast du ja dein Ziel schon erreicht :) ich glaub ich brauch das auch :D

Mit welchen Parametern wird denn der MPlayer beim abspielen aufgerufen?
zur Not kannst du das loglevel von Text2Speech auf 5 setzen und dann den Befehl aus dem log in das Skript kopieren

franky08

#81
Hallo, war ein Rechte Problem ! So geht es jetzt ersteinmal:
#!/bin/bash

# c't Hardware Hacks - Spracherkennung für den Raspberry Pi, GPL-Lizenz

count=1
lastsize=0
rec=0
first=1

# Der Soundchip des RPI erzeugt vor und nach der Wiedergabe ein Knacken. Deutlich bessere Ergebnisse liefert eine USB-Soundkarte, wie man sie bereits für rund fünf Euro bekommt. Damit mplayer die USB-Soundkarte benutzt, ändert man den Parameter "-ao alsa:device=hw=0.0" in "-ao alsa:device=hw=1.0".

function say {
sudo /usr/bin/mplayer -ao alsa:device=hw=0.0 -really-quiet -nolirc -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=$1";
}

sox -t alsa hw:1,0 test.wav silence 1 0 0.5% -1 1.0 1% &
sox_pid=$!


Leider hängt fhem, wenn ich das ganze über ein dummy oder von der Kommandozeile mit:
Spracherkennung:on {system('sudo /opt/fhem/contrib/ctvoice.sh&');;}

starte.
Hab das jetzt erstmal auf Eis gelegt, vieleicht gibt es ja in nächster Zeit mal ein Modul, so das es einfach in fhem eingebunden werden kann.

VG
Frank

Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Rince

Na ja, das hängt weil der Aufruf keinerlei Non-Blocking Mechanismen einsetzt.

Im Text2Speech Modul könnte man vielleicht abgucken, wie das gelöst wird. Dort wird der mplayer mit Non-Blocking genutzt.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Zephyr

Zitat von: koldomon am 04 Januar 2014, 15:42:48
Mal ne Frage,

ich bin da ein wenig Datenschutz Paranoid und hab da meine Bedenken, dass Google die Texte online übersetzt. Gibts sowas auch als "offline" Lösung? oder sprengt das den PI?

SEHR WICHTIGER Punkt!

Macht Japser jasperproject.github.io das vielleicht offline?
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

Rince

Jasper nutzt Pocketsphinx.
Das ist eine Offline Spracherkennung. Für Pocketsphinx würde es sich glatt lohnen, ein Modul für fhem zu basteln.
Aber ich möchte im Vorfeld anmerken, dass Pocketsphinx ein komplexes Programm ist, welches durchaus konfiguriert werden will.
So schnell mal ein get und ein make in die Kommandozeile tippen reicht nicht ;)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Kuzl

Oh ja das wär mal sehr interessant :)
dann könnte man auch mal eine "vernünftige" von handy und co. unabhängige sprachsteuerung machen :D

Rince

Pocketsphinx?
Vermutlich. Wobei vor 1 Jahr war es noch unsäglich langsam. Vielleicht ist es ja mittlerweile schneller.

Die Installationsanleitung findet sich bei Jasper. Was noch fehlt, ist die Grammatik für Deutsch. Das ist ein Pocketsphinx Ding. Es gibt wohl auch ein Modell zum Download irgendwo, aber das basiert auf 16KHz Daten, da muss man mit seiner Mikrofonkonfiguration aufpassen. Sonst geht es in die Hose.

Kuzl, magst du einen Thread aufmachen wo wir Pocketsphinx Sachen zusammen tragen können mit dem Ziel, ein fhem Modul draus zu basteln?
Du bist da eindeutig besser als ich :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)


forum-merlin

Hallo Fhem-Freunde!

Ich habe mich auch seit ein paar Tagen mit voicecommand von Steven Hickson befasst. Und gerade eben denke ich, habe ich das Problem lokalisert.
Ich hatte auch Probleme dass der SetupTeil fehlgeschlagen war. Das Setup sagte immer, ich hätte kein Mikrofon.

Zitat"I couldn't find a hardware device. You don't have a valid microphone

Ich hatte folgende Hardware ausprobiert:
1) uralte logitech quickcam communicate stx
2) JABRA USB Headset (relativ neu)
3) Logitech C510 HD Webcam (relativ neu)

Ich hatte es bei allen drei Devices geschafft, dass ich sie per arecord -l und arecord -L sehe.
Ich hatte es auch bei allen drei Devices geschafft, dass ich etwas aufnehmen konnte, und dann per aplay abspielen konnte.
Ich musste allerdings immer mit der Option -D und dann her HEX Device ID arbeiten.
Ausgabe also über die 3,5er Klinke und "Eingabe" per USB Device.


Wenn ich dann in der .commands.conf mit einem Editor oder per voicecommand -e die Config angepasst hatte, bin ich trotzdem immer daran gescheitert, dass voicecommand der Meinung war, dass ich kein richtiges valides Mic habe.

Ich habe mir dann mal alle Files angeschaut die zu voicecommand gehören.

Ich bin echt absolut kein Coder, Scripter, Programmierer und verzweifle auch sofort bei PERL.
aaaaber... Ich habe mir mal die voicecommand.cpp Datei in einem Editor wie Notepad++ oder ContextEDITOR angeschaut.
Habe die Highlighter für C++/C# eingeschaltet, und habe einfach mal geschaut ob ich da irgendwo eine Section finde wo die Hardware geprüft wird.

Hier der Teil den ich dann gefunden habe:

    printf("Do you want to set up and check the speech recognition options? (y/n)\n");
    scanf("%s",buffer);
    if(buffer[0] == 'y') {
        printf("First I'm going to make sure you have the correct hardware device\n");
        FILE *cmd;
        int card = -1,device = -1;
        cmd = popen("arecord -l | awk '/^card [0-9]/ {print $2}'","r");
        fscanf(cmd, "%d:",&card);
        cmd = popen("arecord -l | grep -o 'device [0-9]:' | grep -o  '[0-9]:'","r");
        fscanf(cmd, "%d:",&device);
        if(card == -1 || device == -1) {
            printf("I couldn't find a hardware device. You don't have a valid microphone\n");
            exit(-1);
        } else if(card != 1 || device != 0) {
            printf("I detected that you have a different audio card then I located, would you like me to fix that in the config file? (y/n)\n");
            scanf("%s",buffer);
            if(buffer[0] == 'y') {
                stringstream tmp;
                tmp << "plughw:";
                tmp << card;
                tmp << ",";
                tmp << device;
                recordHW = tmp.str();
                differentHW = true;
                write += "!hardware==";
                write += recordHW;
                write += "\n";
            }


Und siehe da...
Da wird doch tatsächlich ein
cmd = popen("arecord -l | awk '/^card [0-9]/ {print $2}'","r");
ausgeführt.
Wenn man jetzt auf seinem eigenen System mit Deutscher Sprachumgebung das arecord -l ausführt, dann kommt da KARTE zurück und nicht CARD. Und bei DEVICES kommt bei uns natürlich GERÄTE zurück.
Ich denke genau das ist der Fehler hier.
Was mich aber wundert ist, dass die .commands.conf die im User Home liegt garnicht richtig berücksichtigt wird.


Ich hatte schon probiert, die .cpp Datei anzupassen und dann mit DE weiterzumachen, aber ich habe es nicht hinbekommen.
Ich habe dann einfach meine DE Sprache deinstalliert und nun läuft voicecommand auch.

Jetzt muss ich nur noch mit der Konfiguration weiter rumspielen damit meine "Lucy" künftig auch in DE mit mir spricht.
Das sollte nämlich trotzdem weiterhin möglich sein.


Hoffe es hilft jemandem.

Gruß

der Merlin.
FHEM 5.8 auf RasPi3; CULv3-868; RFXtrx433; HM-Sec-SC-2; HM-CFG-LAN; HM-LC-Bl1-FM; HM-CC-RT-DN; HM-ES-PMSw1-Pl; HM-LC-Sw4-DR; Hunter Ventile; 8ch Relais; ENIGMA2; ONKYO_AVR; SONOS; Harmony; telegram; HM-PB-6-WM55; GPIO; HM-Sen-MDIR-O; HM-SEC-SD; HM-LC-Dim1L-Pl-3;