-
Notifications
You must be signed in to change notification settings - Fork 9
soundeffect_ja
SoundEffectプラグインは、Nurseryの読み上げ音声の後ろに音楽や効果音を流すプラグインです。
標準で有効化されています。特に操作は必要ありません。
標準で、サンプル音声がインストールされています。Nurseryが入室している際に、テキストチャットに以下の文字を入力すると、拍手の音が鳴ります。
se clap
もしくは
sound clap
音声を再生するコマンドです。(名前)
の部分に音声の名前を入れます。
Bot宛てのメンションである必要はありません。また、通常のテキストチャットの文章の中に混ざっていても再生されます。
例えば以下のようにすると、音声は「今のすごかったです!」が読み上げられ、同時に拍手の音が鳴ります。
今のすごかったです! se clap
登録されている音声を一覧表示するコマンドです。音声の名前を確認するときに使用します。
音声データを再読み込みするコマンドです。
通常、音声データはNursery起動時に自動で読み込まれるので、このコマンドを使用する必要はありません。ただし、Nursery起動中に音声の設定を変更した場合、変更した分は自動で再読み込みされません。その場合にこのコマンドを使って再読み込みします。
再生中の音声を停止するコマンドです。うるさいときに使用します。
サンプル音声を、clap
に加えてse 888
やsound 888
でも鳴るように変更してみます。
- Nurseryフォルダ内の
sounds
フォルダを開きます。 -
clapping_short2.json
をメモ帳などで開きます。 - 以下のように編集します。(5行目末尾に
,
を追加し、6行目に"888"
を追加){ "file": "clapping_short2.mp3", "volume": 0.5, "names": [ "clap", "888" ] }
- 上書き保存してメモ帳を閉じます。
- Nurseryをボイスチャンネルに入室させた状態で、以下のコマンドを使って音声データを再読み込みします。(※bot名は各自で読み替えてください。)
@nursery-bot sereload
- 新しい名前で拍手の音が鳴るか確認します。
se 888
音声データ(.wav
ファイルや.mp3
ファイル)を追加することができます。ここではoyasumi.wav
というファイルを追加する例を解説します。
-
Nurseryフォルダ内の
sounds
フォルダに、oyasumi.wav
をコピーします。 -
同じフォルダで、サンプルの
clapping_short2.json
をコピーしてoyasumi.json
を作成します。 -
oyasumi.json
をメモ帳などで開きます。 -
以下のように編集します。(
file
とnames
の内容を修正){ "file": "oyasumi.wav", "volume": 0.5, "names": [ "oyasumi", "おやすみ" ] }
-
上書き保存してメモ帳を閉じます。
-
Nurseryをボイスチャンネルに入室させた状態で、以下のコマンドを使って音声データを再読み込みします。(※bot名は各自で読み替えてください。)
@nursery-bot sereload
-
新しい音が鳴るか確認します。
se oyasumi
もしくは
se おやすみ
- 音声ファイルと
.json
ファイルの名前に規則はありませんが、わかりやすさのため、同じ名前にしておくのがいいでしょう。 -
names
は複数の値を持つことができます。上記の例では2つにしましたが、それ以上にすることも可能です。 - 上記の例のように、
names
には日本語の文字や絵文字を含めることもできます。ただし、 空白(スペース)を含めることはできません。 -
names
にDiscord絵文字を含めることもできます。Discord絵文字は以下のようにIDを使って指定します。絵文字のIDは、Nurseryの<:emoji_no_namae:419317757595746314>
emojiid
コマンドを使って調べることができます。Nurseryが起動した状態で、以下のようにコマンドを実行します。(※bot名は各自で読み替えてください。)@nursery-bot emojiid :id_wo_shiritai_discord_no_emoji:
音源のファイルによって、音量が小さすぎたり大きすぎたりした場合は、音量を設定します。
- Nurseryフォルダ内の
sounds
フォルダを開きます。 - 編集したい音声の
.json
ファイルをメモ帳などで開きます。 -
volume
の行を編集します。0.0~1.0までの小数で指定します。数字が大きいほど音量が大きくなります。"volume": 0.8,
- 上書き保存してメモ帳を閉じます。
- Nurseryをボイスチャンネルに入室させた状態で、以下のコマンドを使って音声データを再読み込みします。(※bot名は各自で読み替えてください。)
@nursery-bot sereload
- 編集した音声を鳴らし、音量を確認します。
plugins
フォルダ内のNursery.SoundEffectPlugin.SoundEffectCommand.json
に、SoundEffectプラグイン全体の設定が記述されています。
{
"dir": "sounds",
"memory_max": 31457280,
"parallel_max": 5
}
-
dir
: 音声ファイルと音声設定ファイルを置くフォルダ。標準はsounds
です。 -
memory_max
: 音声ファイル読み込みに使うメモリ量の目安(Byte単位)。標準は31457280
(30MB)です。SEプラグインは素早く音声を鳴らすためによく使われる音声ファイルのデータをメモリ上に保持します。そのメモリの最大値の目安です。(音楽が同時に再生される場合などでは、一時的にこれより多くのメモリを使用することもあります。) -
parallel_max
: 同時に再生する音声の数。標準は5
です。この数を超えるSEはすぐに再生されず、前のSEが終わるのを待ってから再生されます。
se
やsound
のコマンドなしに、チャットの特定の文字列に反応して音を鳴らすことができます。以下の例では「注意!」の文字に反応して音が鳴るように設定しています。
{
"file": "beep.wav",
"volume": 0.5,
"names": [
"beep"
],
"patterns": [
{
"pattern": "注意!",
"type": "string"
}
]
}
正規表現を使って文字を指定することもできます。以下の例では「気を付けて」(ひらがなでも可)に反応するように設定しています。
{
"file": "beep.wav",
"volume": 0.5,
"names": [
"beep"
],
"patterns": [
{
"pattern": "注意!",
"type": "string"
},
{
"pattern": "[気き]を[付つ]けて",
"type": "regex"
}
]
}
JavaScriptの関数を使ってマッチ条件を指定することもできます。以下の例では「ドカベン」(順不同、空白許容)に反応するように設定しています。
{
"file": "beep.wav",
"volume": 0.5,
"names": [
"beep"
],
"patterns": [
{
"pattern": "注意!",
"type": "string"
},
{
"pattern": "[気き]を[付つ]けて",
"type": "regex"
},
{
"pattern": "function dokaben_wav_func_1(obj) { var doka = /([ドカベン])[ \\t]*([ドカベン])[ \\t]*([ドカベン])[ \\t]*([ドカベン])/g; var sounds = []; while (true) { var m = doka.exec(obj.message.Content); if (m == null) { break; } if (m[1] != m[2] && m[1] != m[3] && m[1] != m[4] && m[2] != m[3] && m[2] != m[4] && m[3] != m[4]) { sounds.push('beep'); } else { if (m.index + 1 >= obj.message.Content.length) { break; } doka.lastIndex = m.index + 1; } } return new ReplaceResult(obj.message.Content, sounds); }",
"type": "function",
"function_name": "dokaben_wav_func_1"
}
]
}
- 設定ファイルはJSON形式です。
- 必要に応じて
"
や\
などはJSON形式のエスケープをしてください。
{
"file": "file-name",
"volume": 0.5,
"names": [
"name1",
"name2",
"name3",
...
],
"patterns": [
{
"type": "string",
"pattern": "pattern-string",
"replace_to": "replace-string"
},
{
"type": "regex",
"pattern": "regex-string",
"replace_to": "replace-string"
},
{
"type": "function",
"pattern": "function-string",
"function_name": "function-name"
},
...
]
}
- 音声ファイルのパスを文字列で指定します。
- 相対パスで記述することができます。
- フォルダパスを含める際は
\
をエスケープするのを忘れないようにしてください。"file": "subfolder\\sample.wav"
- 音量を小数で指定します。
- 0.0~1.0の間で指定します。
- 数字が大きいほど音が大きくなります。
-
se (名前)
もしくはsound (名前)
コマンドで使用される名前を、文字列の配列で指定します。 - 0個以上の文字列を指定することができます。
- 文章に反応する「パターン設定」を指定します。
- 0個以上のパターン設定を指定することができます。
- パターン設定には以下の3種類があります。
- stringパターン
- regexパターン
- functionパターン
文字列で指定するパターン設定です。
{
"type": "string",
"pattern": "pattern-string",
"replace_to": "replace-string"
}
-
type
:"string"
を指定します。 -
pattern
: 反応する文字列を指定します。 -
replace_to
: オプション。pattern
にマッチした文字列を、ここで指定した文字列に置き換えて読み上げます。""
を指定すると文字の削除になります。replace_to
項目が存在しない場合、置き換えは行われず、pattern
にマッチした文字列もそのまま読み上げられます。
正規表現で指定するパターン設定です。
{
"type": "regex",
"pattern": "regex-string",
"replace_to": "replace-string"
}
-
type
:"regex"
を指定します。 -
pattern
: 反応する正規表現を指定します。例えば、/[0-9]/
にマッチさせたい場合は[0-9]
と記述します。使用できる正規表現は.NET の正規表現に準拠します。 -
replace_to
: オプション。pattern
にマッチした文字列を、ここで指定した文字列に置き換えて読み上げます。""
を指定すると文字の削除になります。replace_to
項目が存在しない場合、置き換えは行われず、pattern
にマッチした文字列もそのまま読み上げられます。
JavaScriptの関数で指定するパターン設定です。
- 関数は
pattern
もしくはfunction_file
のどちらかで指定します。 - 関数が長い場合、
function_file
を使った方が管理が楽になります。
{
"type": "function",
"pattern": "function-string",
"function_file": "function-file-path",
"function_name": "function-name"
}
-
type
:"function"
を指定します。 -
pattern
: JavaScriptコードを文字列で指定します。エスケープを忘れないよう注意してください。関数の仕様は後述します。function_file
が指定されていた場合、pattern
は無視されます。 -
function_file
: JavaScriptコードの記述されたファイルのパスを文字列で指定します。関数の仕様は後述します。 -
function_name
: 関数名を文字列で指定します。pattern
もしくはfunction_file
で指定したJavaScriptコードのうち、ここで指定した関数が呼ばれます。
function function_name(obj) {
// ...
return new ReplaceResult(message, sounds);
}
- 関数は、
IJSArgument
型の引数1つを受け取り、ReplaceResult
型の結果を返します。 - nullを返すと「マッチしなかった」扱いとなります。
-
IJSArgument
型、ReplaceResult
型およびそのメンバの型についてはJavaScriptから使用可能なインターフェースを参照してください。
設定ファイルと関数ファイルのセットをsounds
フォルダに保存します。
- 設定ファイル
dokaben_wav_func_1.json
{
"type": "function",
"function_file": "dokaben_wav_func_1.js",
"function_name": "dokaben_wav_func_1"
}
- 関数ファイル
dokaben_wav_func_1.js
// 「ド」「カ」「ベ」「ン」の4文字が重複せず連続して出現する(間に空白があるのは許容する)文字列に反応し、beep音声を鳴らす関数
function dokaben_wav_func_1(obj) {
// マッチに使う正規表現を定義
var doka = /([ドカベン])[ \t]*([ドカベン])[ \t]*([ドカベン])[ \t]*([ドカベン])/g;
// 戻り値に使う、音声の names 用配列を定義
var sounds = [];
while (true) {
// 正規表現マッチを試行
var m = doka.exec(obj.message.Content);
// マッチしなかった場合はループを出る
if (m == null) { break; }
// マッチした場合、4文字が重複しないことを確認
if (m[1] != m[2] && m[1] != m[3] && m[1] != m[4]
&& m[2] != m[3] && m[2] != m[4] && m[3] != m[4]) {
// 重複がなければ音声を追加して検索を続ける
sounds.push('beep');
} else {
// 重複があった場合、検索場所をマッチした文字列から1文字進めて検索を続ける
if (m.index + 1 >= obj.message.Content.length) { break; }
doka.lastIndex = m.index + 1;
}
}
// 戻り値を返す。
// 文字列の変換はしないので、Resultとしては元のobj.message.Contentをそのまま渡す。
// SoundNamesには見つかった`beep`の配列を渡す。
return new ReplaceResult(obj.message.Content, sounds);
}
-
plugins\plugins.json
をメモ帳などで開きます。 -
Nursery.SoundEffectPlugin.
で始まる行を削除します。 - 上書き保存してメモ帳を閉じます。
- 次回の起動時から、SoundEffectプラグインが無効になります。