多年来,计算机用户都能够运行处理器密集型的语音识别应用程序来基于声音处理执行命令,但这常常需要进行大量的配置。虽然处理能力及算法中的最新进展使独立于用户的语音识别减少了错误率,但是有些时候仍然需要使用基于简单音调模式的识别系统。
最近发布的 sndpeek 程序可用来进行复杂的处理,借助它,我们只需运行一个简单的 Perl 程序来生成音调代码。另外,本文还提供 Perl 脚本以允许用户定制音调的输入及检测的环境。
要求硬件需要一个能够处理声音输入的系统,虽然能够生成离散音调事件的任何声源都可以满足要求,但最好还是选用功能齐全的麦克风。例如,通过麦克风向计算机吹口哨就为计算机添加了除了键盘和鼠标之外的第三种用户输入途径,但是如果配置正确,则通过输入插孔回放 MP3 播放器的输出也可以获得同样的效果。本文中的代码是在配有 900 MHz 处理器和 1GB RAM 的 IBM® ThinkPad® T42p 上开发及测试的。配置不如它的系统应当也能够轻松地使用本文中提供的代码,因为 sndpeek 是主要的资源消耗者,而它是一个极为高效的程序。
软件需要一个有效的声音处理软件来访问麦克风硬件。虽然声音配置和故障排除超出了本文的范围,但是在 Vector Linux Live CD 上测试这段代码可能会很有用,Vector Linux Live CD 具有运行许多不同的声音硬件所必需的大多数驱动程序和组件。至少需要安装 sndpeek 程序的一半功能,因为 3-D 显示部分的代码是可选项,可以不安装。
在 中,有一个指向 sndpeek Web 页面的链接。下载代码,然后在 src/sndpeek/sndpeek.cpp 文件中找到以下部分:
清单 1. 修改 sndpeek1
2
3
4
| fprintf( stdout, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f ",
mfcc(0), mfcc(1), mfcc(2), mfcc(3), mfcc(4), mfcc(5), mfcc(6),
mfcc(7), mfcc(8), mfcc(9), mfcc(10), mfcc(11), mfcc(12) );
fprintf( stdout, "\n" );
|
通过直接输出,确保程序的输出写在每个打印窗口的末尾。更改以上部分使之如下所示:
清单 2. 第二次修改 sndpeek1
2
3
4
5
| fprintf( stdout, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f ",
mfcc(0), mfcc(1), mfcc(2), mfcc(3), mfcc(4), mfcc(5), mfcc(6),
mfcc(7), mfcc(8), mfcc(9), mfcc(10), mfcc(11), mfcc(12) );
fprintf( stdout, "\n" );
fflush(stdout);
|
现在运行典型的 ./configure; make; make install 命令在 Linux 上构建并安装 sndpeek。对于 Windows,确保正确地构建程序。在 Windows 上构建应用程序有许多选择,这不在本文讨论范围之内。如果需要查看 cmdWhistle 怎样工作,建议使用 Vector Linux Live CD。
接下来是为命令行窗口控制安装 xwit 应用程序。查阅 获得 xwit 下载链接,只需安装而无需对源代码做任何更改。现在您就可以开始创建一些简单的音调了。
示例设置和配置创建简单的音调序列下载 源代码并找到 cmdWhistle.pl 脚本。这是 Perl 主程序,允许您创建音调序列,侦听特定音调序列及 run 命令。本文将先向您介绍 cmdWhistle.pl 程序的用户空间使用和配置,然后再说明各个功能。
用以下命令运行 cmdWhistle.pl 程序:sndpeek --print --nodisplay | perl cmdWhistle.pl -c。此命令将启动侦听麦克风的 sndpeek 程序并将输出打印到 Perl 程序。此程序运行后,请生成一些简单的口哨声 —— 稳定的单音调或具有 1-3-2 停顿的音调。注意,您必须在噪声相对较少的环境中运行此程序,因此请插入耳机并确保 CD 驱动器盘片停止旋转。如果膝上型电脑的电池着火,请在运行此程序之前先拔掉感烟探测器。
用不同的速度和音调做试验来感受 cmdWhistle 程序捕捉事件的能力。体验程序的音调检测过程的微妙对于创建重复的复杂音调序列来说很重要。第一个音调序列应当很简单:两声低音哔哔,间隔为 0.5 秒。运行 sndpeek --print --nodisplay | perl cmdWhistle.pl -c,当看到 “enter a tone sequence” 时,吹两声口哨,音调之间有 0.5 秒延迟。自动超时将在 4 秒钟(可配置)后发生,并且将打印出类似以下示例的音调序列:25.00 25.00 _#_ 0 500000 _#_ <command here> _#_ <comment here>。
命令设置和音调序列检测让我们来仔细研究该行:音调值、分隔符、时间值、分隔符、命令区域、分隔符和注释区域。下一步是要将这一行复制到 cmdWhistle.pl 程序的默认配置文件中:{$HOME}/.toneFile,也可能是 /home/<username>/.toneFile。用以上音调序列行创建 ~/.toneFile 之后,可以修改该行来运行程序。将命令区域文本更改为 /bin/echo "two low" 并将注释区域修改为描述性内容,如 25.00 25.00 _#_ 0 500000 _#_ /usr/bin/echo "two low" _#_ two low tones。
现在您已经修改了配置文件来给出通知,用命令 sndpeek --print --nodisplay | perl cmdWhistle.pl 以守护进程模式运行 cmdWhistle.pl 脚本。程序将在背景中静静地侦听来自 ~/.toneFile 列表的任何事件。尝试以同样的时间间隔并以相同的音调吹两声低音调口哨,您将看到文本 “two low” 打印到屏幕上。如果需要详细查看运行中的 cmdWhistle.pl 脚本,请用命令 sndpeek --print --nodisplay | perl cmdWhistle.pl -v 以守护进程模式运行该脚本。如果系统支持图形显示,请删除 --nodisplay 选项以获得声音输入的优秀 3-D 视觉效果。
使用 xwit 进行窗口管理的示例设置创建升高、降低和图标化序列用来模仿键盘快捷键或鼠标移动的音调输入可通过很多方式实现。以下示例专门提供了窗口管理函数以使用户的手保持在原位,但同时窗口又能被放置到用户需要的位置。有关这种扩展的输入方法的更多用途,请参阅 “附加示例” 部分。
用 sndpeek --print --nodisplay | perl cmdWhistle.pl -c 命令以 “create” 模式运行 cmdWhistle.pl 程序。需要为快速窗口管理函数创建一些可以轻松重建的简单音调。建议对于 “降低” 使用低音调,对于 “升高” 使用高音调,对于 “图标化” 使用中音调。确保选用您能一直准确执行的东西。虽然可以修改控制精度的参数,但是修改时需要输入音调序列(包括音调和时间),而且要匹配有问题的音调或精确计时可能会很困难。广泛用于定调的三种方法综合了命令的灵活性和简单性,非常适合像我们这样唱不好卡拉 OK 的人。下面是带有这三个命令的样例 ~/.toneFile:
清单 3. 带有三个命令的样例 ~/.toneFile1
2
3
4
5
6
7
8
9
| 20.00 _#_ 0 _#_ /usr/bin/xwit -pop -names rxvt _#_ raise rxvt windows
#
#
40.00 _#_ 0 _#_ /usr/bin/xwit -pop
-names nathan _#_ raise xterms starting with nathan@localhost
#
#
25.00 25.00 _#_ 0 500000 _#_ /usr/bin/xwit -iconify
-names nathan _#_ iconify nathan@localhost~
|
用 echo 替换 xwit 命令并在实际使用之前先练习。
可从 shell 脚本访问的 xwit - X 函数虽然针对 X Window System 的命令行窗口控制有很多种方法,但是 xwit 是其中一种较为简单且可移植的方法,适合于许多窗口管理程序。下载并安装 xwit,然后执行 xwit -iconify 命令以确保程序运行正常(这将使当前窗口最小化)。虽然 xwit 没有 “降低” 功能,但是我们可以通过升高其他窗口来实现“降低”的目的。对于本示例,我们使用单个高音 (40.00) 来升高标题开头为 “nathan” 的窗口。设置 xterms 的标题是一种适用于典型编程类型任务的识别模式。使用单个低音 (20.00) 升高其他窗口(如果开头为 rxvt)。之间有半秒钟延迟的两个中音 (25.00) 则会使所有标题开头为 “nathan” 的窗口图标化。有关具体的示例,请参阅 。
此设置的主要优点之一是能够持续在一个窗口中键入的同时还可以看见另一个窗口。这对构建子例程架构的同时还要在显著位置打开文档参考以获得 API 信息来说很有用。事实上,计算可以比键入更快 —— 因为可以同时键入和管理窗口环境。
升高和降低窗口的 Windows shell 脚本为了在 Microsoft 操作系统中控制窗口,升高窗口的简单方法之一是使用 WshShell.AppActivate 命令。例如,如果我们需要升高 “gvim” 应用程序,则需要用以下代码创建一个名为 “gvimActivate.vbs” 的文件:
1
2
| Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate "gvim";
|
以上文件就绪后,我们要做的就是执行该文件,之后 “gvim” 窗口将被突出显示并被放在显著位置。如果是在 Windows 上运行,请将 ~/.toneFile 中的简单高音命令更改为 40.00 _#_ 0 _#_ gvimActivate.vbs _#_ raise gvim window。 |