让 Linux 说话
“用户 root 现在已在线”。当人们不在终端前,并且没有进行其他登录时,这句话会令人恐惧。但是,当不在机器前时,如何了解机器上发生了什么?如果机器可以告诉你就好了。在本文中,我将讨论一种使您的机器能够做到这一点的工具。
这一切都始于一年前,当时,我翻阅一本奇怪的电子杂志,偶然看到一个小型语音合成器的广告。该设备本质上是一个低成本的基于串行的文本到语音合成器,使用 SPO256-AL2 芯片。我相信这与原版 Mattel “Speak & Spell” 玩具中使用的芯片相同。
几个月后,我再次考虑了一下,并决定我必须拥有它。当然,价格合适(大约 50.00 美元),并且我的主 Linux 机器上的串行端口像树上的树枝一样增长。所以我订购了一个。几周后,我打电话询问,被告知我的订单刚刚手工制作完成,将在几天内寄出。在现代社会找到手工制作的电子产品真是一种乐趣——几乎就像家具制造业涉及真正工艺的时代一样。
无论如何,该装置如期而至,附带原理图、装满 DOS 程序的磁盘和一本薄薄的手册。磁盘我还没看过;毕竟,这是用于 Linux 机器的。该板很容易滑入 PC 插槽。该卡仅使用 PC 插槽供电。背面的 RS-232 连接器连接到串行端口。单独的独立电源单元和外壳另售 29.00 美元。但是,再插一个电源包就足以让我晚上保持清醒。我可以负担得起一个插槽;尽管我现在预见到我将填满机器中所有八个插槽的时候。
该板有自己的内置扬声器和一个 RCA 插孔。我很快将 RCA 插孔改装为连接到我家 PBX 上的背景音乐 (BGM) 源。(好吧,严格来说,它实际上是一个松下数字混合键系统,尽管它有更大的野心。)我连接了串行端口,并在 DTR 升高时听到短暂的噪音。我很快了解到这应该是说“Okay”,但 RCA 插孔上的阻抗匹配很差。
接下来,我更改了端口上的 stty 设置以匹配我通过拨码开关为设备选择的速度,并且怀着很高的期望,我尝试了一个简单的测试
echo "Hello, my name is Rochester" >/dev/ttyS2
我收到的单调回应听起来有点像“Hewlo, my name is Rokheestar”,让我想起了我上次访问亚特兰大,在那里他们使用一种故意刺耳的赛博格声音在航站楼之间的穿梭列车上。嗯,也许是时候看看手册了,甚至可能看看那个磁盘……
几个限制和问题立即变得明显。第一个是文本到语音算法仅处理单词。数字只是作为一系列数字说出来。因此,91 变成了“nine one”,而不是“ninety-one”。这可以通过一些简单的查找表和文本替换来解决。
其次,虽然从技术上讲,该设备充当文本到语音设备,但没有任何特殊手段,例如控制或转义序列,允许直接访问设备可以产生的语音元素和声音;文本到语音代码隐藏了它们。第二个限制可以通过使用替代拼写来解决,尽管不一定是语音拼写,这些拼写使内部算法饱和以实现不同的语音选择。需要进行一些实验才能很好地了解设备实际上如何将文本转换为语音。
由于现在需要进行大量的表格替换,我考虑了下一个逻辑步骤;开发一个驱动程序作为设备的前端。理想情况下,任何驱动程序都应该能够像正常人一样阅读纯文本。首先,数字应该发音为数字而不是数字。同样,正常文本中使用的许多常见数字结构——例如货币金额、标准格式的日期和时间字段、百分比、电话号码等——都有我希望正确封装和模拟的发音规则。互联网有其自身的惯用语,如 x@y.z,应发音为“x at y dot z”。我决定涵盖所有这些,以及用于正确单词发音的内联文本替换。
最后,我决定使用一个位于 TCP 套接字上的服务器。服务器将接受来自已知端口上的用户应用程序的连接,并根据合理的规则集(如上所述)发音接收到的任何文本。我添加了一种转义模式,允许拼写单词和单数字公告模式。我可以与服务器建立一个简单的 telnet 会话,然后通过键入文本来测试设备。
TCP 服务器提供了另一个优势。一次只能由一个应用程序为设备提供服务——否则来自多个来源的语音会混杂在一起。TCP 会话的使用确保服务器只会接受一个连接并保持活动状态,直到客户端关闭连接。其他客户端应用程序可以在积压队列中阻塞,同时等待当前应用程序完成讲话。与使用锁文件相比,积压队列提供的简单性是我选择使用完整服务器而不是由 inetd 启动的任务的原因。
随着服务器的到位,语音合成普及其他系统服务只是时间问题。我对服务器的第一个用途是监控我的 BBS 系统。通过将其连接到用户登录配额管理器,我可以让设备在用户登录和注销时发出公告。同样,传统的系统管理员页面可以通过此设备进行传递。
最终,我将 SPO 服务器与我的 wall 命令实现联系起来,然后创建了其他实用程序来为我的互联网服务器提供口头监控。口头监控将监视并宣布我的新电子邮件,以及每小时的基本系统统计信息,例如正常运行时间和磁盘使用情况。由于所有这些语音在晚上可能会很烦人,因此我在服务器中添加了一个简单的静音计划。最令人好奇和有趣的是我用来替换 shutdown 的程序,简单地称为“down”。
对于系统监控,语音设备已被证明是一个非常有用的工具——而不是一种麻烦。开发服务器的目的是为了能够阅读书面文本并正确发音常见的用法和约定,虽然我最少地使用此功能,但其他人可能更多地需要它。发音词典可以根据需要在日常使用中识别出的更广泛的单词进行扩展。
有人向我建议该设备的一个用途是用作视障计算机用户的屏幕阅读器。我正在研究的另一个应用是在呼叫传入电话和通过电话系统寻呼或公告呼叫时使用。我一直希望该板包含一个 DTMF 音调发生器和一个 SLICK,因此我可能会考虑修改提供的原理图。
此处描述的 SPO-256-AL2 文本到语音板可以通过 B.G. Micro 购买,地址为 P.O. Box 280298, Dallas, TX 75228,电话号码为 (214) 271-5546。Computalker 的价格约为 50.00 美元(美国),作为 PC 卡,或 80.00 美元(美国),作为带有电源适配器的独立设备。芯片可以单独购买,我相信 Computalker 可以以套件形式购买。
虽然 SPO 是基于串行的,并且可以在几乎任何机器或操作系统上使用,但我最初购买它是为了在我的主服务器上使用,该服务器运行 Linux。因此,语音服务器是在 Linux 下开发和测试的。服务器最初是使用我的 BBS 包的库和部分代码库开发的,因此这些都包含在发布的源代码中。我正在开发一个更便携的公共源代码实现,它应该更容易且更广泛地兼容非 Linux 系统。我必须走了,因为我在被呼叫...
David Sugar 以 WorldVU(一个用于 Linux 的公共 BBS 系统)而闻名,他目前担任 Fortran Corp. 的软件工程总监,并将 Linux 用于商业电话开发。他维护着自己在 Linux 下的互联网服务器。