2 Stimmen

DTMF-Überwachung über multimon, awk und espeak

  • Wie kann man die gesprochene DTMD-Ziffer jedes Mal anhören, wenn die Soundkarte eine erfasst?

Das Ziel ist es, meinen PC über Funk zu steuern und Schnittstellenaktivitäten, die dtmf-Töne über ein Handfunkgerät wählen.

Ich habe multimon verwendet, um DTMF-Töne zu hören Ich habe versucht, mit awk Ziffern zu filtern und entsprechend vorzugehen. Zum Beispiel, wenn ich "0" aus dem Radio das System neu starten muss, usw., aber zunächst die Bestätigung der Operation. "Der Computer wird neu gestartet, senden Sie # zur Bestätigung"...

Ich habe versucht, espeak für eine Sprachbestätigung an das Funkgerät zu verwenden. Das an die PC-Soundkarte angeschlossene Funkgerät empfängt die Befehle und sendet die Antworten.

Ich weiß einfach nicht, wie man multimon in awk in espeak verschachtelt.

Multimon selbst lässt mich nichts mit seinem stdout tun, weil es läuft (es wird nicht beendet, nachdem ich eine Ziffer gehört habe, was ja auch richtig ist).

Es wäre äußerst hilfreich, wenn ich wüsste, wie ich jede einzelne Ziffer sprechen kann, ohne die natürliche Multimon-Schleife zu verlassen.

Sprich, multimon -a DTMF | awk'{print}' espeak -stdin Wenn das einfach funktionieren würde!

Ist es möglich, dies zu tun? Jede Hilfe ist willkommen.

3 Jahre sind vergangen und immer noch kein Fortschritt bei der Linux-DTMF-Dekodierung.

Sobald ich kein DTMF-Funksteuerungsprojekt unter Linux gesehen habe, plane ich, dieses zu veröffentlichen, wenn ich dieses Problem lösen kann.

Danke / Mario/ sao paulo brasilien

2voto

Eduka Punkte 21

Ich glaube, meine Antwort ist veraltet, und vielleicht haben Sie eine Lösung für dieses Problem gefunden.

Ich hatte das gleiche Problem und fand heraus, dass das Problem in multimon liegt. Wenn Sie die stdout-Ausgabe von multimon an ein anderes Programm weiterleiten, gibt multimon die ausführliche Ausgabe nicht korrekt aus.

Versuchen Sie, multimon zu patchen und neu zu kompilieren, indem Sie ein "fflush(stdout);" hinzufügen, etwa so:

(unixinput.c , um Zeile 71 )

    void verbprintf(int verb_level, const char *fmt, ...)
    {
            va_list args;

            va_start(args, fmt);
            if (verb_level <= verbose_level) {
                    vfprintf(stdout, fmt, args);

                    fflush(stdout); //ADD THIS LINE!!!!!!!!!!!!!!!

                    }
            va_end(args);
    }

Mit freundlichen Grüßen,

-Eduardo

0voto

caf Punkte 224189

Sie können die system() Funktion zum Starten espeak von Ihrem awk Drehbuch.

0voto

ghostdog74 Punkte 305138

@OP, ich bin mir über Ihre Frage nicht im Klaren, aber da system() Sie interessiert, sehen Sie hier, wie Sie einen externen Befehl in awk aufrufen

multimon -a DTMF | awk '{
  cmd="espeak "$0 #$0 comes from the multimon output
  system(cmd)
}
'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X