NScripterでゆっくりしてみた……のかこれは?(もしくはluacallチュートリアルその3)
- 追記
- 以下は無視して、Lua用AquesTalkライブラリ - Atelier de Muguet 制作記録を参照せよ。
NSLua解説3.txt で紹介されていた NSOggIsPlaying(ch) を見て、できそうだと思ってやってみた。
00.txt
*define luacall tag luacall animation game *start [な/ん/な/の]なんなの?@/ [し/ぬ/の] しぬの?@ [と/り/あ/え/ず]とりあえず@ [き/み/わ/じ/つ/に/ば/か/だ/な/あ]きみはじつにばかだなあ@ end
system.lua
local letter = {} local voice_channel = 0 function NSCALL_tag(tag) if tag == "" then return true end NSLuaAnimationMode(false) NSOggClose(voice_channel) local all_tag = "/"..tag local count = 1 letter = {} for let in string.gmatch(all_tag, "/([^/]+)") do letter[count] = "voice_list\\"..let..".wav" count = count + 1 end NSLuaAnimationInterval(100) NSLuaAnimationMode(true) return true end function NSCALL_animation() if letter[1] == nil then NSLuaAnimationMode(false) elseif NSOggIsPlaying(voice_channel) == false then local let = table.remove(letter, 1) dwave(voice_channel, let) end return true end function dwave(c, f) local channel = c local file = f NSOggLoad(channel, file) NSOggPlay(channel, false) return ture end
その他必要なもの
※自己責任でやってください。
歌声合成ツールUTAU ダウンロードページに行って、UTAUをダウンロードして展開し、その中の「voice\oto」フォルダの中にある *.wav ファイを全部コピーし、NScr.exeと同じ場所に「voice_list」フォルダを作り、その中に *.wav をペーストしてください。
また、他に以下のdllが必要です。
- nslua.dll
- nsogg2.dll
使い方
タグ機能を使ってしゃべります。しゃべっているような気がします。00.txtを見ればやり方はわかるはずです。
わからなかったのは、「っ」とかはどうやってるんだろうなあ、と言う点です。無音.wavを作るべきかも知れません。
UTAUの声を使っていますが、生に近い形で使っていますので、むしろ超早口のゆっくりのように聞こえるでしょう。ゆっくりしたいよう!
解説
NSOggIsPlaying()につきます。
演奏する順番を配列の形で持ち、NSOggIsPlayingでチャンネルの状況を調べ、演奏していなければ配列の先頭を削り、その要素に記述されたファイルを演奏するだけです。
もうちょっと手を入れれば、複数の声が同時におしゃべりすることができるでしょう。(それがいるかどうかはおいといて)
タグにしゃべる内容を記述するため、それを取得できるようにluacall tagを使いました。
また、しゃべっているかどうかを常に見張るために、luacall animationも使いました。
応用
声よりも、音色を用意して簡易MIDIみたいにする方がマシかも知れません。
バグ
ああ、公式に伝えるべきか。
NSOggIsPlaying()の返り値の型が、数値型になっている件について。
●isplaying=NSOggIsPlaying(ch)
指定したチャンネルが演奏していればtrue していなければfalseが返ります。
となっているんですが、type(NSOggIsPlayng(ch))で"number"が戻ってくるんですよねえ。なんともはや。実はここで3時間くらいはまってました。
追記
http://www.nscripter.com/nsb/bs.cgi?ac=view&no=1063&mx=1062で返事があったので、boolean型にスクリプトを変更。