Мониторинг DTMF через multimon, awk и espeak - PullRequest
3 голосов
/ 04 февраля 2010
  • Как прослушивать произносимую цифру DTMD каждый раз, когда звуковая карта захватывает одну?

Цель состоит в том, чтобы контролировать радио на моем компьютере и выполнять действия по интерфейсу, набирая тоны dtmf с помощью портативного трансивера.

Я использовал multimon для прослушивания тонов DTMF. Я пытался использовать awk для фильтрации цифр и действовать соответствующим образом.Например, если я наберу «0» по радио, система должна перезагрузиться и т. Д., Но сначала подтвердить операцию.«Компьютер перезагрузится, отправьте # для подтверждения» ...

Я попытался использовать espeak для голосового подтверждения на удаленном радио.Радио, подключенное к звуковой карте компьютера, принимает команды и передает ответы.

Я не просто знаю, как вкладывать multimon в awk в espeak.

Сам по себе Multimon не позволяет мне что-либо делать с егоstdout, потому что он работает (не прерывается после прослушивания цифры, что действительно правильно).

Было бы чрезвычайно полезно, если бы я знал, как просто произносить каждую цифру, не выходя из естественного цикла multimon.

Скажем, multimon -a DTMF |awk '{print}' espeak -stdin Если это просто сработало!

Возможно ли это сделать?Любая помощь приветствуется.

Прошло 3 года и до сих пор нет прогресса в декодировании DTMF в Linux.

После того, как я не увидел ни одного проекта DTMF Radio Controlling в Linux, я планирую опубликовать его, если смогу решить эту проблему.

Спасибо / Марио / Сан-Паулу, Бразилия

Ответы [ 3 ]

2 голосов
/ 21 декабря 2010

Я считаю, что мой ответ устарел, и, возможно, вы нашли, как решить эту проблему.

Я столкнулся с той же проблемой и понял, что проблема в multimon. Когда вы передаете стандартный вывод из multimon в другую программу, multimon не удаляет подробный вывод должным образом.

Попробуйте исправить и перекомпилировать multimon, добавив "fflush (stdout);", например так:

(unixinput.c, строка 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);
    }

С уважением,

-Eduardo

0 голосов
/ 04 февраля 2010

@ OP, мне не ясен ваш вопрос, но, увидев, что system () вас интересует, вот как вы вызываете внешнюю команду в awk

multimon -a DTMF | awk '{
  cmd="espeak "$0 #$0 comes from the multimon output
  system(cmd)
}
'
0 голосов
/ 04 февраля 2010

Вы можете использовать функцию system() для запуска espeak из вашего awk скрипта.

...