スックスクにし〜てあげる〜♪
初音ミクが気になっているのですけれど、何処もかしこも売り切れです。あぁ、ミックミクにされたいにゃ〜♪
というわけで、俄然コンピュータに歌わせることに興味が出てきたので、Squeak にちょっと歌わせてみました。Squeak で定番な歌うコードといえばコレです。
(DECTalkReader silentNightVoice1) playOn: KlattVoice new delayed: 1000
きよしこの夜を歌いだします。何かとデモに出てくる Squeak の定番機能ですが、以前はぜんぜん興味なかったので、どうなってるのかまったく知りません。とりあえず、曲のデータを作っている風な DECTalkReader class >> silentNightVoice1 を覗いてみます。
DECTalkReader class >> silentNightVoice1 " (DECTalkReader silentNightVoice1 pitchBy: 0.5) playOn: KlattVoice new delayed: 1000 " ^ self eventsFromString: 'sae<600,32>ay<200,34>leh<400,32>nt nae<600,29>ay<400>t. hxow<600,32>ow<200,34>liy<400,32> nae<600,29>ay<400>t. ao<600,39>l ih<200>z kaa<800,36>lm. ao<600,37>l ih<200>z bray<800,32>t. raw<600,34>nd yah<400>ng ver<600,37>er<200,36>jhah<400,34>n mah<600,32>dher<200,32> ae<400>nd chah<600,29>ay<200>ld. hxow<800,34>liy<400> ih<600,37>nfah<200,36>nt sow<400,34> teh<600,32>nder<400,34> ae<400,32>nd may<600,29>ld. sliy<600,39>p ah<400>n hxeh<400,42>vah<400,39>nliy<400,36> piy<1000,37>iy<800,41>s. sliy<400,37>iy<400,32>p ah<400,29>n hxeh<400,32>vah<400,30>nliy<600,27> piy<1800,25>s.'
なるほど、歌データはこんな感じですか。#eventsFromString: に渡している文字列を弄くればオリジナルの曲を歌わせられるようです。が、いまいちルールがわからない。
なので適当に打ち込んで do it してみると、エラーが。ふむふむ、発音の指定は、DECTalkReader の phonemes フィールドに入っているものの組み合わせで作るのね。
DECTalkReader new phonemes "Print it=>" a Dictionary('_'->sil 'aa'->aa 'ae'->ae 'ah'->ah 'ai'->ai 'ao'->ao 'aor'->aor 'aw'->aw 'ax'->ax 'ay'->ay 'b'->b 'ch'->ch 'd'->d 'dh'->dh 'dx'->dx 'ea'->ea 'eh'->eh 'el'->el 'em'->em 'en'->en 'er'->er 'ey'->ey 'f'->f 'g'->g 'h'->hh 'hh'->hh 'hx'->hh 'ia'->ia 'ih'->ih 'ix'->ix 'iy'->iy 'jh'->jh 'k'->k 'l'->l 'll'->ll 'lx'->l 'm'->m 'n'->n 'ng'->ng 'nx'->ng 'ow'->ow 'oy'->oy 'p'->p 'q'->q 'r'->r 'rr'->r 'rx'->rx 's'->s 'sh'->sh 'sil'->sil 't'->t 'th'->th 'u'->uw 'ua'->ua 'uh'->uh 'uw'->uw 'v'->v 'w'->w 'wh'->wh 'y'->y 'yx'->jh 'z'->z 'zh'->zh )
どうも <300,32> の部分が長さと音程のようです。簡単なのを作ってテスト。
| song | song := DECTalkReader eventsFromString: 'kao<300,30>ng<50,20>niy<200,32>tiy<200,32>waa<300,36>.'. song playOn: (KlattVoice new) delayed: 1000
最初の数字が音の長さ、後の数字が音の高低で、数字が大きいほど高いみたい。また、<300,30> 部分は前の発音文字列を修飾してるみたい、で、最後に ピリオドを置いておかないと、一つ前の音が出ないみたい。しかし、数字が具体的にどんな単位なのかよくわかんないなぁ。
とりあえずなんか曲をというわけで、簡単さに定評の有る「きらきら星」を。
"きらきら星" | song | song := DECTalkReader eventsFromString: 'kiy<300,26>raa<300,26>kiy<300,33>raa<300,33>hiy<300,35>kaa<300,35>ru<600,33>. ow<300,31>sow<300,31>raa<300,30>now<300,30>how<300,28>siy<300,28>yow<600,26>. maa<300,33>baa<300,33>taa<300,31>kiy<300,31>siy<300,30>teh<300,30>waa<600,28>. miy<300,33>ng<300,33>naa<300,31>wow<300,31>miy<300,30>teh<300,30>ru<600,28>. kiy<300,26>raa<300,26>kiy<300,33>raa<300,33>hiy<300,35>kaa<300,35>ru<600,33>. ow<300,31>sow<300,31>raa<300,30>now<300,30>how<300,28>siy<300,28>yow<600,26>.'. song playOn: (KlattVoice new) delayed: 1000
自分の耳を頼りにそれっぽく作成。うーん、音の高さとかちゃんとあってなさそう。当然といえば当然ですが、外国の人が無理やり歌っているよな日本語になりました(w
ほんとうは みくみくにしてあげる を歌わせてフィニッシュにするつもりでしたが、音感の無い猫の耳では、旋律を耳コピーするのすら難航してしまい、疲れはててしまったので今日はおしまい。(←根性なし)
タイトルに偽りありでごめんなさい。