Gambar pidato: Software Automatic Mouth

Saya menyimpulkan artikel tahun lalu "Kami menggambar suara" dengan mengenali: "Apakah mungkin untuk menggambar suara dari lembaran kosong tanpa melacak spektrogram rekaman audio? Terus terang, saya tidak berhasil. " Tetapi saya baru-baru ini belajar tentang SAM - dirilis pada tahun 1982 oleh Don't Ask Software, itu adalah program sintesis pidato PC pertama yang sukses secara komersial. Pada pertengahan tahun 2000-an, penilai demo Jerman Tobias Korbmacher dan Sebastian Macke mengambil daftar SAM yang dikumpulkan untuk Commodore 64 dan mengubahnya menjadi kode C yang tidak bisa dibaca, tetapi bisa diterapkan; kemudian pada tahun 2014 British Vidar Hokstad mencoba untuk membawa kode C ke dalam bentuk yang dapat dibaca - secara manual memberikan variabel nama yang bermakna dan menggantigotopada loop dan cabang; dan akhirnya, pada 2017 kode Christian Schiffler Jerman lainnya menulis ulang dari C ke JavaScript. Anda dapat mencobanya dalam aksi sebagai "kotak hitam" di discordier.imtqy.com/sam .

Menurut pendapat saya, synthesizer ucapan JavaScript primitif adalah model eksperimental yang paling nyaman bagi mereka yang ingin memahami cara kerja sintesis ucapan secara umum. Garpu SAM saya dengan kode yang dibersihkan secara substansial dan komentar tersedia di github.com/tyomitch/sam . Sayangnya, penulis sebelumnya berhasil memudar minat pada SAM, dan sekarang mereka tidak punya waktu untuk menganalisis permintaan tarik untuk proyek hobi lama.

SAM terdiri dari empat komponen fungsional:

  1. Reciter menerjemahkan teks bahasa Inggris ke dalam catatan fonem: misalnya, "A LITTLE TOO LOW" (contoh dari program demo yang dilampirkan ke SAM ) berubah menjadi "AH LIHTUL TUW5 LOW".
  2. Parser mengubah rekaman fonemik menjadi rekaman fonetis: dari "AH LIHTUL TUW5 RENDAH" ternyata " AH, ,L,IH,DX,AX,LX, ,T,*,*,UX,WX, ,L,OW,WX". Untuk setiap latar belakang yang ditampilkan, Parser juga mengatur durasi dan nada.
  3. Renderer membangun serangkaian frekuensi, amplitudo, dan karakteristik akustik lainnya dari rekaman fonetik;
  4. Terakhir, komponen anonim (fungsi ProcessFrames) mengubah array frekuensi dan amplitudo menjadi aliran PCM untuk output audio.

Pada artikel ini, saya akan menganalisis keempat komponen pada gilirannya.

Tukang deklamasi


Reciter dilampirkan ke SAM sebagai program terpisah: pencipta menyatakan bahwa aturan pengucapan Reciter 469 yang diletakkan dalam Reciter dengan benar menuliskan sekitar 90% dari kata-kata bahasa Inggris. Ini berarti bahwa transkripsi setiap kata kesepuluh memerlukan pengeditan manual sebelum mengirimkannya ke input komponen berikut.

SAM menggunakan sistem transkripsi sendiri , di mana fonem bahasa Inggris ditunjukkan oleh karakter yang terpisah dari satu set [A-Z/]atau berpasangan dari dua karakter tersebut:
FonemPenunjukanFonemPenunjukanFonemPenunjukanFonemPenunjukan
/ b /B/ p /P/ v /V/ f /F
/ d /D/ t /T/ z /Z/ s /S
/ dʒ /J/ tʃ /CH/ ʒ /ZH/ ʃ /SH
/ g /G/ k /K/ j //H/ ð /DH
/ m /M/ n /N/ ŋ /NX/ θ /TH
/ l /L/ r /R/ j /Y/ w /W
/ æ /AE/ ɛ /EH/ ɪ /IH/ i /IY
/ ʌ /AH/ ɔ /AO/ ʊ /UH/ u /UX
/ ɒ /OH/ ɑ /AA/ ə /AX/ ɜ /ER
/ eɪ /EY/ aɪ /AY/ ɔɪ /OY/ aʊ /AW
/ oʊ /OW[l̩]UL[m̩]UM[n̩]UN
Selain fonem, angka 1-8 digunakan dalam transkripsi SAM untuk menunjukkan stres dan nada : 1 berarti stres "sangat emosional", 4 berarti stres normal, 6 berarti nada netral, 8 berarti "penurunan nada ekstrem".

Pembaca diatur secara sederhana: aturan peka konteks dari daftar diterapkan secara bergantian ke baris input , misalnya aturan " (IR)#=AYR" menggantikan teks ⟨ir⟩ sebelum vokal dengan / aɪr /; aturan " .(S) =Z" menggantikan ⟨s⟩ antara konsonan bersuara dan spasi (akhir kata) dengan / z /; aturan " (U)^^=AH5" menggantikan ⟨u⟩ di depan dua konsonan berturut-turut dengan / ʌ /, dan membuat suku kata ditekankan. Penting untuk dicatat bahwa dalam banyak kata Reciter tidak menekankan huruf vokal apa pun, dan dalam beberapa kata mencatat beberapa vokal sekaligus: misalnya,kata ⟨provoking⟩ berubah menjadi "PRUW4VOW5KIHNX", yaitu / ˈpruˈvoʊkɪŋ /. Pembaca yang penuh perhatian akan memperhatikan bahwa tekanan yang tidak perlu bukanlah satu-satunya kesalahan dalam transkripsi ini.

Saya memutuskan bahwa transkripsi adalah bagian yang paling tidak menarik dari synthesizer ucapan; dan memberikan kualitas transkripsi yang relatif rendah pada output Reciter, saya memutuskan Ada beberapa layanan Internet yang tersedia secara bebas untuk menyalin kutipan teks bahasa Inggris, alih-alih aturan heuristik, layanan ini menggunakan kamus yang agak besar. Dalam pengalaman saya, transkripsi kualitas terbaik adalah untuk tophonetics.com dan photransedit.com; pada saat yang sama, yang kedua memiliki sejumlah kelemahan: ia menggunakan notasi fonem yang tidak terlalu standar, mencatat bahkan dalam kata-kata bersuku kata satu, dan apa yang paling merepotkan - itu ditulis dalam ASP.NET dan membutuhkan nilai yang benar dalam permintaan POST __VIEWSTATEdan __EVENTVALIDATION, yang mempersulit penggunaannya dari pihak ketiga situs. Oleh karena itu, dalam peragaan perangkat dan karya SAM saya, tersedia di tyomitch.imtqy.com , saya menggunakan transliterasi melalui https://cors-anywhere.herokuapp.com/https://tophonetics.com/

Parser


Tidak seperti Reciter, yang disebut oleh pencipta SAM, komponen Parser dan Renderer diberi nama oleh para insinyur Jerman, sehingga nama-nama ini tidak cukup akurat mencerminkan tujuan dari komponen-komponen ini.

Parser memiliki tiga tugas utama:

  1. «» (, ) . ( ) «-» UL, UM, UN, [l̩, m̩, n̩]. , /əl, əm, ən/; Parser , AXL, AXM, AXN .
  2. , .. . «AH LIHTUL TUW LOW» , /t/ [ɾ] (DX) [t] (T,*,*) . ( .) , /l/ [ɫ] (LX) , [l] (L) .
  3. .

SAM mendukung 81 latar belakang, 61 di antaranya memiliki nama dan dapat digunakan dalam rekaman fonem untuk "mengecoh" Parser dan segera mengatur suara yang diinginkan. 20 latar belakang yang tersisa tidak bernama; 18 di antaranya hanya dapat muncul sebagai hasil karya Parser, dan latar belakang dengan kode 46 dan 47 tidak dapat muncul dengan cara apa pun, dan mungkin tetap tidak ditentukan oleh pengawasan pengembang SAM.

Latar belakang dengan kode 0-4 ( .?,-) sesuai dengan keheningan; sisanya dirangkum dalam tabel berikut:
KodePenunjukanSuaraKodePenunjukanSuara
5IY[saya]42CH[t] dalam komposisi / tʃ /
6IH[ɪ]43*[ʃ] sebagai bagian dari / tʃ /
7EH[ɛ]44J[d] dalam komposisi / dʒ /
8AE[æ]45*[ʒ] dari / dʒ /
9AA[ɑ]48EY~ [ɜ] di / eɪ /
10AH[ʌ]49AY~ [ɑ] di / aɪ /
sebelasAO[ɔ]lima puluhOY[ɔ] dari / ɔɪ /
12UH[ʊ]51AW[ɑ] di / aʊ /
tigabelasAX[ə]52OW[ɔ] sebagai bagian dari / oʊ /
14IXlebih pendek [ɪ]53UW~ [u]
lima belasER[ɜ]54B[b]
enambelasUX[u]55*
17OH[Hai]56*
delapan belasRX[ɹ]57D[d]
sembilan belasLX[ɫ]58*
dua puluhWXsingkat [ʊ] dalam diftong59*
21YXsingkat [ɪ] dalam diftong60G[gʲ]
22WHlebih lama [w]61*
23R[ɹ̠]62*
24L[l]63GX[g]
25W[w]64*
26Y[j]65*
27M[m]66P[p]
28N[n]67*
Tanggal 29NX[ŋ]68*
tigapuluhDX[ɾ]69T[t]
31Q[ʔ]70*
32S[s]71*
33SH[ʃ]72K[kʲ]
34F[f]73*
35TH[θ]74*
36/H[ç]75KX[k]
37/X[h]76*
38Z[z]77*
39ZH[ʒ]78UL[l̩]
40V[v]79UM[m̩]
41DH[ð]80UN[n̩]

Tindakan yang dilakukan oleh Parser terdiri dari tujuh langkah:

  1. Parsing sendiri: daftar kode latar belakang dan daftar paralel nada yang diberikan oleh angka di jalur input dibentuk pada jalur input.
  2. Menerapkan seperangkat dua lusin aturan ke daftar latar belakang: misalnya, pergantian / t / + / r / → [tʃ] + [ɹ̠] dan / k / + / vokal non-depan / → [k] + [vokal]. (/ k / di depan vokal depan tetap tidak berubah dan cocok dengan latar belakang [kʲ].)
  3. CopyStress: Nada yang diset untuk vokal yang ditekan meluas ke konsonan yang mendahului mereka.
  4. SetPhonemeLength: durasi diganti untuk setiap latar belakang (dalam "bingkai" bersyarat). Dua tabel bujur latar belakang digunakan - satu untuk suku kata yang ditekan dan satu untuk yang tanpa tekanan.
  5. AdjustLengths: Menerapkan seperangkat tujuh aturan untuk menyesuaikan durasi latar belakang. Misalnya, vokal sebelum konsonan bersuara diperpanjang satu setengah kali, dan konsonan eksplosif berurutan dibelah dua.
  6. ProlongPlosiveStopConsonants: konsonan eksplosif di depan vokal, konsonan halus dan frikatif dibagi menjadi tiga kali lipat latar belakang. Latar belakang pertama dalam tiga sesuai dengan intensitas suara yang lebih rendah, yang kedua ke intensitas penuh, yang ketiga untuk keheningan.
  7. InsertBreath: frasa dibagi .?,-menjadi "pernafasan" oleh latar belakang "sunyi" ( ) hingga 232 bingkai (ini sekitar 2½ detik). Dalam implementasi SAM untuk PC retro, partisi seperti itu diperlukan untuk menghemat memori; dalam versi JavaScript tidak masuk akal, dan dalam garpu saya itu dihapus.

Parser mengeluarkan tiga daftar paralel: kode latar belakang, nada, dan durasinya.

Renderer


Komponen ini bertanggung jawab untuk sintesis ucapan dalam arti kata yang sempit. Pada input, ia menerima daftar latar belakang dengan nada dan durasi yang ditentukan, serta parameter yang memengaruhi suara yang disintesis. Pada output, ia menghasilkan delapan daftar paralel: frekuensi forman F 1 –F 3 , intensitasnya (amplitudo), frekuensi utama F 0 (nada suara), dan nilai-nilai sampledConsonant, yang akan dijelaskan secara lebih rinci di bawah ini.

Dengan mengacu pada instruksi SAM , contoh berikut dari nilai parameter suara disediakan :
PilihKecepatanNadaTenggorokanMulut
Peri7264110160
Robot kecil9260190190
Pria pengap8272110105
Wanita tua kecil8232145145
Ekstra-terestrial10064150200
SAM7264128128
Dalek120100100200
Perlu dicatat bahwa parameter Kecepatan digunakan tidak dalam Renderer, tetapi sudah pada tahap pembuatan audio: durasi suara yang dihasilkan untuk satu frame tergantung pada parameter ini. Selain parameter Kecepatan, durasi frame juga tergantung pada jenis suara, seperti yang akan dijelaskan di bawah ini.

Sintesis ucapan Formant didasarkan pada fakta bahwa setiap latar belakang dikaitkan dengan frekuensi dan amplitudo dari beberapa forman pertama. Untuk sintesis vokal, penggunaan dua forman cukup - misalnya, grafik frekuensi forman khas vokal bahasa Inggris yang diambil dari situs web Universitas Manitoba :


Untuk mensintesis konsonan, diperlukan forman tambahan. Selain itu, seperti yang saya sebutkan di artikel tahun lalu , konsonan yang berisik ditandai dengan "semburan" di pita frekuensi yang luas:



Ini "semburan" tidak dapat diperoleh dengan sintesis forman murni, oleh karena itu SAM mereproduksi suara konsonan berisik dari tabel sampel. Nilai-nilai yang disebutkan di atas sampledConsonantmemilih bagian dari tabel yang sesuai dengan konsonan berisik tertentu.

Tindakan yang dilakukan oleh Renderer terdiri dari lima langkah:

  1. SetMouthThroat: Untuk vokal dan sonor latar belakang (kode 5-29 dan 48-53), nilai-nilai tabulasi frekuensi F 1 dan F 2 yang dikalikan dengan parameter Mulut dan Tenggorokan, masing-masing.
  2. CreateFrames: . , (1–8) Pitch (1 → −32, 6 → 0, 8 → +12). , ( 30 ) , .
  3. CreateTransitions: F0–F3 F1–F3 . , , .
  4. F0 F1, «pitch contour», .
  5. , () , PCM.


Dari sudut pandang fisik, ucapan adalah kereta pulsa glotis yang diciptakan oleh pita suara (lihat Gambar), yang sepanjang jalan keluar melewati mulut dan hidung ( jalur bicara ), dan yang seperti resonator memperkuat harmonik tertentu dalam gelombang laring. Frekuensi gelombang laring - ini adalah frekuensi utama dari suara F 0 . Sebagai aturan, nilainya antara 100 dan 400 Hz: lebih rendah untuk pria, lebih tinggi untuk wanita, bahkan lebih tinggi untuk anak-anak. Model suara yang digunakan dalam sintesis formant adalah bahwa beberapa filter band-pass diterapkan pada gelombang laring, yang masing-masing membedakan satu forman. Lebar pita yang dialokasikan tergantung pada frekuensi formant, dan menurut data eksperimental, hingga 200 Hz: Dalam demonstrasi SAM saya di tyomitch.imtqy.com







pendekatan ini digunakan: dengan nilai default dari parameter Bandwidth = 3, setiap formant memperkenalkan harmonisa F 0 ke dalam sinyal audio yang dihasilkan dalam ± 5,9% dari frekuensi formant. Ini kira-kira sesuai dengan grafik di atas: formant dengan frekuensi 3 KHz mengalokasikan lebar pita 177 Hz. Dalam implementasi SAM klasik, pembangkitan jumlah harmonik yang diperlukan didekati dengan lebih invasif: untuk setiap forman satu gelombang dihasilkan, tetapi fase gelombang ini dipusatkan dengan frekuensi F 0 . Dalam demo saya, Anda dapat beralih ke mode yang mensintesis satu gelombang untuk setiap forman (tetapi tanpa memusatkan fase) dengan menghapus centang pada parameter Pitch.

Fungsi ProcessFramesdalam SAM klasik memproses tuli dan menyuarakan konsonan bising secara terpisah dari semua latar belakang lain:

  • . , Speed. ([s]) 105 , ([p] [t]) — 10.4 .
  • Speed16250PCM-, : () F1 F2, ( ) F3. , Speed=72 10.6 .
  • , , 34Speed16250PCM-, . , Speed . , Pitch=64, 1.6 , .. 9.5 .

Untuk konsonan bising, lima tabel sampel digunakan: satu untuk alveolar ([t, s, z]), satu untuk chamber-alveolar ([ʃ, ʒ]), satu untuk labial dan gigi ([p, f, v, θ, ð ]), dan satu untuk [ç] dan [h]. Sampel yang terkait dengan tabel yang sama berbeda satu sama lain hanya dalam durasi dan intensitas.

Dalam demo saya, demi kesederhanaan, suara dengan durasi yang sama dihasilkan untuk semua frame, dan durasi ini hanya bergantung pada parameter Kecepatan: pada nilai defaultnya, satu frame sesuai dengan suara 10,4 ms. Seperti yang diperlihatkan percobaan, "rata-rata" ini sesuai dengan SAM klasik, meskipun sehubungan dengan itu, suara individu dalam frasa yang disintesis dapat "bergerak keluar" untuk beberapa ms maju atau mundur.

Sebagai kesimpulan, saya akan menunjukkan tiga spektogram dari frasa sambutan yang dibuat oleh generator audio SAM klasik dan generator audio saya dengan sintesis nada dihidupkan dan dimatikan:



Seperti yang Anda lihat, mematikan sintesis nada menghasilkan kompromi antara kualitas suara dan visibilitas forman pada spektrogram.

All Articles