Linux 通过multimon、awk和espeak进行DTMF监控 如何在声卡每次捕获一个DTMD数字时收听语音

Linux 通过multimon、awk和espeak进行DTMF监控 如何在声卡每次捕获一个DTMD数字时收听语音,linux,bash,radio,telephony,dtmf,Linux,Bash,Radio,Telephony,Dtmf,目标是通过手持收发器,通过无线电控制我的电脑和拨号dtmf音 我用多音多频来听DTMF音 我尝试使用awk来过滤数字,并进行相应的处理。 例如,如果我从无线电输入“0”,系统必须重新启动,等等,但首先要确认操作。“计算机将重新启动,发送#以确认” 我试着用espeak对远程收音机进行语音确认。 连接到pc声卡的收音机接收命令并发送响应 我不知道如何在espeak中的awk中嵌套multimon Multimon本身不允许我对其标准输出做任何事情,因为它正在运行(不要在听到数字后终止,这确实是正确

目标是通过手持收发器,通过无线电控制我的电脑和拨号dtmf音

我用多音多频来听DTMF音 我尝试使用awk来过滤数字,并进行相应的处理。 例如,如果我从无线电输入“0”,系统必须重新启动,等等,但首先要确认操作。“计算机将重新启动,发送#以确认”

我试着用espeak对远程收音机进行语音确认。 连接到pc声卡的收音机接收命令并发送响应

我不知道如何在espeak中的awk中嵌套multimon

Multimon本身不允许我对其标准输出做任何事情,因为它正在运行(不要在听到数字后终止,这确实是正确的)

如果我知道如何只说出每个数字,而不退出自然的多月循环,那将非常有帮助

比如说,multimon-a DTMF | awk{print}espeak-stdin 如果这真的奏效了

有可能吗?任何帮助都会来的

3年过去了,linux DTMF解码仍然没有进展

一旦我在Linux中没有看到任何DTMF无线电控制项目,我计划发布这篇文章,我可以解决这个问题


谢谢/Mario/sao paulo basicu

您可以使用
system()
函数从
awk
脚本启动
espeak

@OP,我不清楚您的问题,但是看到system()让您感兴趣,下面是您在awk中调用外部命令的方式

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

我相信我的答案已经过时了,也许你已经找到了解决这个问题的方法

我也遇到了同样的问题,我发现问题出在多月模式。当您将标准输出从multimon传输到另一个程序时,multimon无法正确刷新详细输出

尝试修补并重新编译multimon,添加一个“fflush(stdout);”,如下所示:

(unixinput.c,第71行附近)

void verbprintf(int-verb_-level,const-char*fmt,…)
{
va_列表参数;
va_启动(参数、fmt);

如果(verb_level,而不是您现在使用的软件堆栈,我将使用星号;声卡支持、DTMF检测、文本到语音以及您需要的其他组件都可用或包括在内。谢谢!我想星号对我来说太多了。我觉得我快到了,缺少一个神奇的词了!谢谢,我将学习此功能。你有简单的考试吗对于一个思维短浅的我来说,我想评论一下,multimon在终端中输出文本。它能很好地解码DTMF音调,我读取输出(DTMF 1、DTMF 2等),但无法获取此输出文本!它变得毫无用处。非常感谢,我相信这是一个神奇的词!现在我遇到了另一个问题:multimon本身拒绝在PCLINUXOS上安装(手动或通过synaptic-非回购),所以我不得不回到ubuntu尝试你的答案。现在下载。我会带着结果回来的。爱德华多,我必须感谢你,你的答案没有过时。事实上,我不得不把Linux远程控制项目停在上帝知道的地方多久……直到你出现。我要回到windows去听铃声,并把这种羞耻隐藏在某台电脑里在一些表格下。现在我有另一个问题:如何实现您的解决方案?我的知识停留在软件上,我做一些脚本编写,但从未编译过PC软件(嗯,我编译到PIC微处理器).你有这个新的multimon可供使用吗?或者一步一步地介绍如何编译它?我真的不知道这是否要求太多,但现在你表达了我的希望,我会开始承诺让这个项目再次投入使用。无论如何,谢谢你花了这么多时间。我能解决它吗?我会给你一个很大的荣誉。谢谢你!我试图用perl脚本监控它的输出,这对我来说非常有效,干杯:D
    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);
    }