ソフトウェア自動マウス - 小さな音声シンセサイザー
これは、偉大なサムスピーチシンセサイザーのゴーポートです。それは基本的に、Cからの半自動の書き換えであり、アセンブリからCへの半自動の書き換えであったものです:)。したがって、これは読みやすいものではありません。
オリジナルレポ:https://github.com/vidarh/sam。このコミットに基づいています。
挑戦として、そしてただ楽しみのために。
Samは、Cで書かれた非常に小さなテキストからスピーチ(TTS)プログラムで、最も人気のあるプラットフォームで実行されます。これは、1982年に公開されたCommodore C64のSpeech Software SAM(Software Automatic Mouth)のCへの適応であり、Do n't Ask Software(現在のSoftVoice、Inc。)によって公開されています。これには、Reciterと呼ばれるテキスト間コンバーターと、最終出力のための音素からスピーチルーチンが含まれます。それは非常に小さいので、埋め込まれたコンピューターでも動作します。私のコンピューターでは、ディスクスペースの39kb未満(埋め込みデバイスでははるかに小さいデバイスでははるかに小さい)が必要であり、完全にスタンドアロンプログラムです。即時出力の場合、sdl-libraryを使用します。それ以外の場合は、.wavファイルを保存できます。
Windows用のオンラインバージョンと実行可能ファイルは、Webサイトにあります:http://simulationcorner.net/index.php?page=sam
コマンドプロンプトに「make」と入力するだけです。 SDLなしでコンパイルするために、ファイル「MakeFile」のCFLAGSおよびLFLAGS変数からSDLステートメントを削除します。
すべてのUNIXのようなオペレーティングシステムにコンパイルする必要があります。 Windowsには、CygwinまたはMingw( + libsdl)が必要です。
タイプ
./sam I am Sam
最初の出力用。
SDLを無効にしている場合は、試してみてください
./sam -wav i_am_sam.wav I am Sam
WAVファイルを取得します。このファイルは、PCで利用可能な多くのメディアプレーヤーが再生できます。
-pitch number -speed number -throat number -mouth番号などの他のオプションを試すことができます
元のマニュアルに記載されているいくつかの典型的な値は次のとおりです。
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
小さな例では、「歌う」ファイルを見ることもできます。
音素入力テーブルについては、wikiをご覧ください。
追加機能の説明は、元のマニュアルのhttp://www.retrobits.net/atari/sam.shtmlまたは同等のApple IIプログラムhttp://www.apple-iigs.info/newdoc/sam.pdfのマニュアルにあります。
このプログラムは、各アセンブラーオペコードを変換することにより、半自動に変換されました。例えば
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
次に、コード内のほとんどのジャンプと登録変数を削除し、変数を適切な名前に変更するために手動で書き直されました。以下の説明のほとんどは、この書き換えプロセスの結果です。
残念ながら、それはまだあまり読みにくいものではありません。しかし、あなたは私が始めた場所を見るべきです:)
まず第一に、私はここで非常に粗い説明に自分自身を制限します。ソースコードでは、説明しない非常に多くの例外が定義されています。また、私にとっては多くのコードが不明です。たとえば、Code47503。コードを完全に理解するには、より多くの時間が必要であり、特により多くの目がコードを見てみましょう。
Wikiに示されているルールセットによって、英語のテキストを音素に変更します。
ルール「ant(i)」、「ay」は、以前の文字「アリ」で「i」を見つけた場合、音素「ay」でiを交換することを意味します。
#& @ ^ +:%のようなこのルールには、ボーカルや子音などがなければならないことを意味する特別な兆候がいくつかあります。
-debugオプションを使用すると、対応するルールと結果の音素が取得されます。
これがサブルーチンの呼び出しの完全な木です:
sammain()parser1()parser2()insert()copystrestrestrestress()setphonemelength()code48619()code41240()insert()code48431()insert()()()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain()はエントリルーチンであり、すべてのルーチンをすべて呼び出します。 Parser1は音素入力を変換し、3つのテーブルPhonemeIndex [] Stress [] Phonemelength [](現時点ではゼロ)に変換します
このテーブルは変更されました:
Parser2は、他の音素によっていくつかの音素を交換し、新しく挿入します。 Copystrestrestrestrestressは、状況によっては、音素の長さをセットする状況では、ストレスに1を追加します。 Code48619変更音素長さCode41240がいくつか追加されます。コード48431にはいくつかの追加のルールがあります
Wikiには、考えられるすべての音素といくつかのフラグフィールドが表示されます。
これらのテーブルの最終コンテンツは、-debugコマンドで見ることができます。
function prepareoutput()では、これらのテーブルは部分的に小さなテーブルにコピーされます:phonemeIndexOutput [] stressOutput [] fonemelengthoutput [] for output。
いくつかの特別な音素を除き、出力は線形の組み合わせによって構築されます。
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
ここで、rectは罪と同じ周期性を持つ長方形の関数です。本当に奇妙に思えますが、これはほとんどの種類の音素にとって本当に十分です。
したがって、上記の音素は、いくつかのテーブルでピッチに変換されます[]頻度1 [] = f1 feucream2 [] = f2 feucream3 [] = f3 amplitude1 [] = a1 amplitude2 [] = a2 amplitude3 [] = a3
上記のフォーミュラは、1つの非常に優れたOmptimizedルーチンで計算されます。それは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]