早期的Research Edition Unix版本具有一个程序,该程序可以将ASCII文本流转换为语音合成器可以播放的语音。该程序的源代码丢失了多年。这是我如何重获新生的故事。
Unix(1973年初)的第三个研究版记录了一个程序,该程序可以接收ASCII文本作为输入并将其转换成音素,然后由联邦Screw Works的Vocal接口部制造的Votrax语音合成器播放。该程序由M. D. McIlroy编写,他在详细的技术报告中记录了该程序的运行。
尽管该程序出现在1975年第六研究版之前的Unix手册页中,但是仍然存在的档案中缺少其源代码。即使是其作者也没有副本。
幸运的是,在2011年,乔纳森·格瓦里亚胡(Jonathan Gevaryahu)在第六研究版磁盘转储的未分配空间中找到了程序源代码的大部分内容。 (这意味着该代码曾经存储在磁盘上,但是后来被删除了,并且它所在的部分从未分配给其他用途。)甚至更好的是,他可以重建程序中缺少的单个块。编译版本,也可用。基于这些发现,我将语音源代码和语音规则添加到我维护的Unix历史的GiHub存储库中。
为了查看程序的工作方式,我尝试使其运行和编译。由于该程序是用古老的C语言编写的,而且不太可能移植,因此我首先尝试使其能够在SIMH PDP-11仿真器上运行的第六版Unix上运行。这项尝试很快失败了,因为控制台不够可靠,无法让我通过复制粘贴来传输代码。
然后,我在同一台模拟器上运行PDP-11 2.11 BSD Unix,该模拟器提供基本的Internet连接功能。配置.rhosts文件以允许远程复制(要获得远程访问后,只需添加远程主机和用户名),我便能够将代码移至该计算机上。
在初始化常量中插入一个赋值运算符(int tflag 0;成为int tflag = 0; —我什至不知道这种形式曾经存在过),
在那个阶段程序可以编译,但是当我尝试运行它时崩溃了。鉴于2.11 BSD缺少gdb且通常运行缓慢且难以使用,我决定将该程序移植到现代Unix / Linux上。我还添加了更多的声明,包括用于查找其他问题的全功能原型。 (在C的早期版本中,在使用它之前不需要声明一个函数。)然后我有条不紊地删除了所有编译器警告,这使我可以查明一个声明为指针但用作整数的变量。通过更正其声明,我修复了最初的崩溃。
现在,我有了一个可以编译并运行的程序,但在某些情况下仍然崩溃,并且没有产生正确的输出。为此,需要进一步的更改。
我用一个以字节序中性的方式初始化该值的宏替换了初始化为字符对的整数(例如' u1')。
完成这些更改后,程序便能够编译规则文件并生成Votrax音素代码。
Votrax语音合成器及其后代芯片(似乎使用类似的音素代码)已不再销售。为了听生成的声音,我需要一种解决方法。我的第一次尝试是使用votrax-speak GitHub存储库中的示例。将音素Votrax代码转换为它们的助记符名称,并将相应的示例文件作为参数传递给SoX,使我能够创建一个由一起播放的音素组成的声音文件。但是,生成的声音文件几乎无法理解。正如我稍后阅读的那样,Votrax合成器的一大优势是它们如何将音素合并为连续的语音,而我的方法却并非如此。
我的第二次尝试涉及使用espeak-ng程序的音素输出功能。为此,我在Votrax音素代码和相应的espeak音素之间创建了一个映射,然后将其编码到sed脚本中,该脚本将espeak与Unix语音的输出一起提供。通过这种方法,我终于能够通过管道产生一些可理解的语音,例如以下内容。
阅读和发表评论,或通过分享