Software Automatic Mouth - Synthesizer Pidato Kecil
Ini adalah port go dari Synthesizer Pidato Sam Besar. Ini pada dasarnya adalah penulisan ulang semi-otomatis dari C untuk pergi dari apa yang, pada gilirannya, penulisan ulang semi-otomatis dari perakitan ke C :). Akibatnya, ini tidak dimaksudkan untuk dapat dibaca.
Repo asli: https://github.com/vidarh/sam. Berdasarkan komit ini.
Sebagai tantangan dan hanya untuk bersenang -senang.
SAM adalah program Text-to-Speech (TTS) yang sangat kecil yang ditulis dalam C, yang berjalan di sebagian besar platform populer. Ini adalah adaptasi dengan C perangkat lunak ucapan SAM (Mulut Otomatis Perangkat Lunak) untuk Commodore C64 yang diterbitkan pada tahun 1982 oleh Don't Ask Software (sekarang SoftVoice, Inc.). Ini termasuk konverter teks-ke-phonem yang disebut Reciter dan rutinitas fonem-ke-ucapan untuk output akhir. Sangat kecil sehingga akan bekerja juga pada komputer tertanam. Di komputer saya dibutuhkan kurang dari 39kb (jauh lebih kecil pada perangkat tertanam karena overhead yang dapat dieksekusi tidak diperlukan) ruang disk dan merupakan program yang sepenuhnya berdiri sendiri. Untuk output langsung ia menggunakan SDL-Library, jika tidak dapat menyimpan file .wav.
Versi online dan executable untuk windows dapat ditemukan di situs web: http://simulationcorner.net/index.php?page=sam
Cukup ketik "buat" di prompt perintah Anda. Untuk mengkompilasi tanpa SDL, hapus pernyataan SDL dari variabel CFLAGS dan LFLAGS dalam file "Makefile".
Ini harus dikompilasi pada setiap sistem operasi seperti UNIX. Untuk Windows Anda membutuhkan Cygwin atau Mingw ( + Libsdl).
jenis
./sam I am Sam
untuk output pertama.
Jika Anda telah menonaktifkan SDL, coba
./sam -wav i_am_sam.wav I am Sam
untuk mendapatkan file wav. File ini dapat dimainkan oleh banyak pemutar media yang tersedia untuk PC.
Anda dapat mencoba opsi lain seperti -Pitch Number -Peed Number -mthrroat Number -Mouth Nomor
Beberapa nilai khas yang ditulis dalam manual asli adalah:
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
Bahkan dapat menyanyikan melihat file "bernyanyi" untuk contoh kecil.
Untuk tabel input fonem, lihat wiki.
Deskripsi fitur tambahan dapat ditemukan di manual asli di http://www.retrobits.net/atari/sam.shtml atau dalam manual program Apple II yang setara http://www.apple-iigs.info/newdoc/sam.pdf.pdf.pdf
Program ini dikonversi semi-otomatis menjadi C dengan mengubah setiap opcode assembler. misalnya
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
Kemudian ditulis ulang secara manual untuk menghapus sebagian besar lompatan dan mendaftarkan variabel dalam kode dan mengganti nama variabel menjadi nama yang tepat. Sebagian besar deskripsi di bawah ini adalah hasil dari proses penulisan ulang ini.
Sayangnya ini masih dapat dibaca yang tidak terlalu bagus. Tapi Anda harus melihat dari mana saya mulai :)
Pertama -tama saya akan membatasi diri saya di sini untuk deskripsi yang sangat kasar. Ada banyak pengecualian yang ditentukan dalam kode sumber yang tidak akan saya jelaskan. Juga banyak kode tidak diketahui bagi saya misalnya kode47503. Untuk pemahaman lengkap tentang kode, saya membutuhkan lebih banyak waktu dan terutama lebih banyak mata yang melihat kode.
Ini mengubah teks bahasa Inggris menjadi fonem dengan aturan yang ditunjukkan dalam wiki.
Aturan "semut (i)", "ay", berarti bahwa jika dia menemukan "aku" dengan huruf "semut" sebelumnya, bertukar i dengan fonem "ay".
Ada beberapa tanda khusus dalam aturan ini seperti # & @ ^ +: % yang dapat berarti bahwa harus ada vokal atau konsonan atau yang lainnya.
Dengan opsi -debug Anda akan mendapatkan aturan yang sesuai dan fonem yang dihasilkan.
Ini adalah pohon lengkap panggilan subrutin:
Sammain () parser1 () parser2 () insert () copystress () setPhonemeLength () code48619 () code41240 () insert () code48431 () insert ()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain () adalah rutinitas entri dan memanggil semua rutinitas lebih lanjut. Parser1 mengubah input fonem dan mengubahnya menjadi tiga tabel phonemeIndex [] stres [] fonemelength [] (nol saat ini)
Tabel ini sekarang diubah:
Parser2 bertukar beberapa fonem dengan yang lain dan menyisipkan baru. Copystress menambahkan 1 pada stres dalam beberapa keadaan setPhonemelength set panjang fonem. Code48619 Mengubah Panjang Fonem Code41240 Menambahkan beberapa fonem tambahan Code48431 memiliki beberapa aturan tambahan
Wiki menunjukkan semua fonem yang mungkin dan beberapa bidang bendera.
Konten akhir dari tabel ini dapat dilihat dengan perintah -debug.
Dalam fungsi persiapan output () Tabel ini sebagian disalin ke dalam tabel kecil: phonemeIndexoutput [] stressoutput [] phonemeLengthOutput [] untuk output.
Kecuali beberapa fonem khusus output dibangun dengan kombinasi linier:
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
di mana Rect adalah fungsi persegi panjang dengan periodisitas yang sama seperti dosa. Tampaknya sangat aneh, tetapi ini benar -benar cukup untuk sebagian besar jenis fonem.
Oleh karena itu fonem di atas dikonversi dengan beberapa tabel ke pitch [] frekuensi1 [] = f1 frekuensi2 [] = frekuensi f23 [] = f3 amplitudo1 [] = A1 amplitudo2 [] = A2 amplitudo3 [] = A3
Formula di atas dihitung dalam satu rutinitas yang sangat baik. Itu hanya terdiri dari 26 perintah:
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
Sisanya ditangani dengan cara khusus. Saat ini saya tidak tahu cara mana. Tetapi tampaknya ia menggunakan beberapa noise (misalnya untuk "S") menggunakan tabel dengan nilai acak.
Perangkat lunak ini adalah versi rekayasa terbalik dari perangkat lunak komersial yang diterbitkan lebih dari 30 tahun yang lalu. Pemegang hak cipta saat ini adalah SoftVoice, Inc. (www.text2speech.com)
Setiap upaya untuk menghubungi perusahaan gagal. Situs web ini terakhir diperbarui pada tahun 2009. Status perangkat lunak asli karenanya dapat digambarkan sebagai Abandonware (http://en.wikipedia.org/wiki/abandonware)
Selama ini adalah kasus saya tidak dapat meletakkan kode saya di bawah lisensi perangkat lunak open source tertentu menggunakannya dengan risiko Anda sendiri.
Jika Anda memiliki pertanyaan, jangan ragu untuk bertanya kepada saya. Jika Anda menemukan beberapa pengetahuan baru tentang kode, silakan kirimkan saya.
Email Sebastian Macke: [email protected]