軟件自動口 - 微小的語音合成器
這是偉大的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]