NScripterでゆっくりしてみた……のかこれは?(もしくはluacallチュートリアルその3)

NScripterでボイス作成 - 永字八法の続き。

追記
以下は無視して、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型にスクリプトを変更。