見出し画像

ティラノスクリプト おしゃべりプラグイン

ティラノスクリプトには、speak 系のタグがあるのに何を今さらですが、つまりは、細かいことをしたい訳です。
ティラノスクリプトを知って、最初にしたのが、ゲームではなくてプラグインの自作とは。
このプラグインは、インストールすると以下のタグが使えるようになります。おしゃべりさせるテキストをいちいちパラメータで渡すなど、本末転倒ですが、私の悪い癖です。
技術的には、SAPIを利用してテキストを指定しておしゃべりさせられます。
ティラノスクリプトの機能と違い、内容をパラメータで指定します。
また、話者を名前で指定出来ます。
事前にその名前を確認して置く必要があります。
使い方は、data/others/plugin
フォルダーにspeakフォルダを作り、以下のコードをコピーし init.ks 名で保存して、
first.ks の最初の辺で
[plugin name="speak"]
を記述します。

タグ一覧

[speak_voice]
機能:
話者を指定する
パラメータ:
voice :話者名
例:
[speak_voice voice="Haruka"]
これで、以降Harukaが喋る

[speak_set]
機能:
喋らせるためのパラメータを登録する
パラメータ:
text :喋らせる内容をテキストで渡す
voice:話者名
volume:音量(0-1)
rate :再生の速さ(0.1-10)1が標準
pitch:音程(0-2)1が標準
例:
[speak_set volume=1 rate=2]
音量を標準、速さを二倍で再生する
その他のパラメータは変更しない

[speak]
機能:
実際に喋る
パラメータ:
なし
例:
[speak]

[speakw]
機能:
喋り、喋り終わるまで待つ
パラメータ:
skip :"true"でマウスクリックで再生を終わらせる。
例:
[speak ski="true"]

[wait_speak_end]
機能:
現在喋り中の場合、終わるまで待つ。
パラメータ:
skip :speakwと同じ
例:
[wait_speak_end]

[speak_cancel]
機能:
現在喋り中の場合、それを停止する。
パラメータ:
なし
例:
[speak_cancel]

[speak_pause]
機能:
現在喋り中の場合、それを一時中断する。
パラメータ:
なし
例:
[speak_pause]

[speak_resume]
機能:
一時中断中の内容を再開する
パラメータ:
なし
例:
[speak_resume]

技術的情報
 ロード後、変数 sf.voices の中にそのシステムの全話者の名前が格納されてます。

敢えて言いますが、最初に作ったプラグインで、javascript も初めて覚えた状態です。興味がある人だけ覗いてください。

以下に中身をお見せしますので、各自ダウンロードして、init.ks の名前でspeak 名のフォルダに保存してください。

; スピーチ初期化
;*speak_init
[eval exp="sf.speak_utterance"]
[eval exp="sf.synth = window.speechSynthesis]
; 話者をsf.voicesに登録
[eval exp="sf.voices=window.speechSynthesis.getVoices()"]
[eval exp="sf.speaking=true"]
[iscript]
// 発言を作成
sf.speak_utterance = new SpeechSynthesisUtterance();
// 文章 (コンストラクタの引数以外に、この方法でも指定できます)
sf.speak_utterance.text = "日本語";
// 話者
//sf.speak_utterance.voice = sf.voices[0];
//"Microsoft Haruka Desktop - Japanese"
// 言語 (日本語:ja-JP, アメリカ英語:en-US, イギリス英語:en-GB, 中国語:zh-CN, 韓国語:ko-KR)
sf.speak_utterance.lang = "ja_JP";
// 速度 0.1-10 初期値:1 (倍速なら2, 半分の倍速なら0.5)
sf.speak_utterance.rate = 1.0;
// 高さ 0-2 初期値:1
sf.speak_utterance.pitch = 1;
// 音量 0-1 初期値:1
sf.speak_utterance.volume = 1.0;
[endscript]
; 話者をsf.voicesに登録
[eval exp="sf.voices=sf.synth.getVoices()"]
[eval exp="sf.speak_utterance.voice = sf.voices[0]"]
; 引数は、voice=で渡す.
[macro name=speak_voice]
[iscript]
var voice = sf.synth.getVoices().find(function(v){
return v.name.indexOf(mp.voice) > -1;
});
// 取得できた場合のみ適用する
if(voice){
sf.speak_utterance.voice = voice;
}
[endscript]
[endmacro]

;[speak_set text="話す内容" voice="話者名" volume=音量(0-1) rate=速度(0.1-10) pitch=音程(0-2)]で実行
; 設定パラメータがない場合は、それは変更しない
[macro name="speak_set"]
[if exp=mp.text]
;テキストあり [emb exp=mp.text][r]
[eval exp="sf.speak_utterance.text = mp.text"]
[endif]
[if exp=mp.voice]
;話者あり [emb exp=mp.voice][r]
[iscript]
var voice = sf.synth.getVoices().find(function(v){
return v.name.indexOf(mp.voice) > -1;
});
// 取得できた場合のみ適用する
if(voice){
sf.speak_utterance.voice = voice;
}
[endscript]
[endif]
[if exp=mp.volume]
;音量あり [emb exp=mp.volume][r]
[eval exp="sf.speak_utterance.volume = mp.volume"]
[endif]
[if exp=mp.rate]
;速度あり [emb exp=mp.rate][r]
[eval exp="sf.speak_utterance.rate = mp.rate"]
[endif]
[if exp=mp.pitch]
;音程あり [emb exp=mp.pitch][r]
[eval exp="sf.speak_utterance.pitch = mp.pitch"]
[endif]
[endmacro]

; 設定内容を喋る
[macro name="speak"]
[iscript]
sf.synth.speak(sf.speak_utterance);
[endscript]
[endmacro]
; 設定内容を喋っておわるまで待つ
[macro name="speakw"]
[if exp="mp.skip"]
[speak]
[wait_speak_end skip="true"]
[else]
[speak]
[wait_speak_end]
[endif]
[endmacro]

; 喋りが終わるまで待つ
[macro name="wait_speak_end]
__wait_speak_end_loop
[wait time=300]
[if exp="sf.synth.speaking==true"]
; チェック:[emb exp="mp.skip"][r]
[if exp="mp.skip=='true'"]
; チェック2:[emb exp="mp.skip"][r]
[iscript]
$("#tyrano_base").on('click', function(){
sf.synth.cancel(sf.speak_utterance);
sf.speak_utterance.text ="";
$("#tyrano_base").off('click')
})
[endscript]
[endif]
[jump target="__wait_speak_end_loop"]
[endif]
[endmacro]

; 喋りを停止
[macro name=speak_cancel]
[iscript]
sf.synth.cancel(sf.speak_utterance);
[endscript]
[endmacro]
; 喋りを中断
[macro name=speak_pause]
[iscript]
sf.synth.pause(sf.speak_utterance);
[endscript]
[endmacro]
; 喋りを再開
[macro name=speak_resume]
[iscript]
sf.synth.resume(sf.speak_utterance);
[endscript]
[endmacro]
; speaking
[macro name=is_speaking]
[iscript]
sf.speaking=sf.synth.speaking
[endscript]
[endmacro]


この記事が気に入ったらサポートをしてみませんか?