软件自动口 - 微小的语音合成器
这是伟大的SAM演讲合成器的港口。基本上,这是从C到从组装到C的半自动重写的半自动重写。:)。因此,这并不意味着可读。
原始仓库:https://github.com/vidarh/sam。基于此提交。
作为挑战,只是为了娱乐。
SAM是用C编写的非常小的文本到语音(TTS)程序,它在大多数流行的平台上运行。这是对Commodore C64的演讲软件SAM(软件自动口)的改编,该Commodore C64于1982年发表,由Dot ask Software(现为SoftVoice,Inc。)。它包括一个称为Retiter的文本到音量转换器,以及最终输出的音素对语音例程。它很小,以至于它也可以在嵌入式计算机上工作。在我的计算机上,磁盘空间不需要39kb(在嵌入式设备上要小得多),并且是一个完全独立的程序。为了立即输出,它使用SDL-library,否则可以保存.wav文件。
可以在网站上找到Windows的在线版本和可执行文件:http://simulationcorner.net/index.php?page=SAM
只需在命令提示符中键入“ make”。为了不用SDL编译,请从CFLAGS和文件“ MakeFile”中的lflags变量中删除SDL语句。
它应该在每个类似Unix的操作系统上编译。对于Windows,您需要Cygwin或mingw( + libsdl)。
类型
./sam I am Sam
对于第一个输出。
如果您已禁用SDL尝试
./sam -wav i_am_sam.wav I am Sam
获取WAV文件。该文件可以由许多可用于PC的媒体播放器播放。
您可以尝试其他选项,例如-pitch号码-speed号码-Throat号码-Mouth Number
原始手册中写的一些典型值是:
DESCRIPTION SPEED PITCH THROAT MOUTH
Elf 72 64 110 160
Little Robot 92 60 190 190
Stuffy Guy 82 72 110 105
Little Old Lady 82 32 145 145
Extra-Terrestrial 100 64 150 200
SAM 72 64 128 128
它甚至可以唱歌,以查看文件“ Sing”的文件。
对于音素输入表,Wiki中的外观。
可以在http://www.retrobits.net/atari/sam.shtml或等价Apple II程序手册http://wwwwww.apple-iigs.info/newdoc/sam.pdf中找到其他功能的描述。
通过转换每个汇编程序操作码,将该程序转换为C中的C。例如
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
然后,手动重写以删除大多数跳跃并在代码中注册变量,并将变量重命名为专有名称。下面的大多数描述是此重写过程的结果。
不幸的是,它仍然不是很好的可读性。但是你应该看到我从哪里开始:)
首先,我将在这里将自己限制在非常粗糙的描述中。我不会解释的源代码中定义了很多例外。同样,许多代码对我来说是未知的,例如Code47503。为了完全了解代码,我需要更多的时间,尤其是更多的眼睛,请查看代码。
它通过Wiki中显示的规则集将英文文本更改为音素。
规则“ ant(i)”,“ ay”意味着,如果他找到了一个“ i”,带有以前的字母“ ant”,请通过音素“ ay”交换i。
此规则中有一些特殊的迹象,例如#& @ ^ +:%,这可能意味着必须有声音,辅音或其他东西。
使用-Debug选项,您将获得相应的规则和结果音素。
这是子例程呼叫的完整树:
sammain()parser1()parser2()insert()copyStress()setPhoneMeLength()code48619()code41240()insert()code48431()insert()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain()是条件例程,并调用所有其他例程。 Parser1转换音素输入并将其转换为三个表PhoneMIndex []应力[] PhoneMeLength [](目前为零)
现在,该表已更改:
Parser2交换了其他人的一些音素,并插入了新的。在某些情况下,编号为应力添加了1个音素长度。 Code48619更改音素长度代码41240添加了一些其他音素Code48431具有一些额外的规则
Wiki显示所有可能的音素和一些标志字段。
这些表的最终内容可以使用-debug命令可以看到。
在函数prepareOutput()中,这些表被部分复制到小表中:PhoneMeIndexOutput [] porthemeLengtion [] phoneMeLengthOutput []用于输出。
除了一些特殊的音素外,输出是通过线性组合构建的:
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
其中rect是具有与罪相同周期性的矩形函数。这似乎真的很奇怪,但是对于大多数类型的音素来说,这确实足够了。
因此,上面的音素用一些表转换为螺距[]频率1 [] = f1频率2 [] = f2频率3 [] = f3 Amplitude1 [] = a1 amplitude2 []
上面的公式是在一个非常好的量程格式中计算的。它仅由26个命令组成:
48087: LDX 43 ; get phase
CLC
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl1,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
STA 56 ; store
LDX 42 ; get phase
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl2,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC Var56 ; add with previous values
STA 56 ; and store
LDX 41 ; get phase
LDA 42496,x ; load rect value (high 4 bits)
ORA TabAmpl3,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC 56 ; add with previous values
ADC #136
LSR A ; get highest 4 bits
LSR A
LSR A
LSR A
STA 54296 ;SID main output command
其余的以特殊的方式处理。目前,我无法以哪种方式弄清楚。但是似乎它使用具有随机值的表使用一些噪声(例如“ S”)。
该软件是30年前发布的商业软件的反向工程版本。当前的版权持有人是SoftVoice,Inc。(www.text2speech.com)
任何与公司联系的尝试都失败了。该网站最后一次更新于2009年。因此,原始软件的状态可以最好地描述为放弃软件(http://en.wikipedia.org/wiki/abandonware)
只要情况,我就不能将代码放在任何特定的开源软件许可证下使用它自身的风险。
如果您有疑问,请不要犹豫问我。如果您发现有关代码的一些新知识,请邮寄我。
塞巴斯蒂安·麦克(Sebastian Macke)电子邮件:[email protected]