soundeffect_ja - noonworks/Nursery GitHub Wiki

SoundEffectプラグイン

SoundEffectプラグインは、Nurseryの読み上げ音声の後ろに音楽や効果音を流すプラグインです。

1. プラグインの有効化

標準で有効化されています。特に操作は必要ありません。

2. サンプル音声を鳴らす

標準で、サンプル音声がインストールされています。Nurseryが入室している際に、テキストチャットに以下の文字を入力すると、拍手の音が鳴ります。

se clap

もしくは

sound clap

3. コマンド一覧

3-1. se (名前) もしくは sound (名前)

音声を再生するコマンドです。(名前)の部分に音声の名前を入れます。

Bot宛てのメンションである必要はありません。また、通常のテキストチャットの文章の中に混ざっていても再生されます。

例えば以下のようにすると、音声は「今のすごかったです!」が読み上げられ、同時に拍手の音が鳴ります。

今のすごかったです! se clap

3-2. @nursery-bot selist もしくは @nursery-bot soundlist

登録されている音声を一覧表示するコマンドです。音声の名前を確認するときに使用します。

3-3. @nursery-bot sereload もしくは @nursery-bot soundreload

音声データを再読み込みするコマンドです。

通常、音声データはNursery起動時に自動で読み込まれるので、このコマンドを使用する必要はありません。ただし、Nursery起動中に音声の設定を変更した場合、変更した分は自動で再読み込みされません。その場合にこのコマンドを使って再読み込みします。

3-4. @nursery-bot sestop もしくは @nursery-bot soundstop

再生中の音声を停止するコマンドです。うるさいときに使用します。

4. 設定を変更する

サンプル音声を、clapに加えてse 888sound 888でも鳴るように変更してみます。

  1. Nurseryフォルダ内のsoundsフォルダを開きます。
  2. clapping_short2.jsonをメモ帳などで開きます。
  3. 以下のように編集します。(5行目末尾に,を追加し、6行目に"888"を追加)
    {
      "file": "clapping_short2.mp3",
      "volume": 0.5,
      "names": [
        "clap",
        "888"
      ]
    }
    
  4. 上書き保存してメモ帳を閉じます。
  5. Nurseryをボイスチャンネルに入室させた状態で、以下のコマンドを使って音声データを再読み込みします。(※bot名は各自で読み替えてください。)
    @nursery-bot sereload
    
  6. 新しい名前で拍手の音が鳴るか確認します。
    se 888
    

5. 好きな音声データを追加する

音声データ(.wavファイルや.mp3ファイル)を追加することができます。ここではoyasumi.wavというファイルを追加する例を解説します。

  1. Nurseryフォルダ内のsoundsフォルダに、oyasumi.wavをコピーします。

  2. 同じフォルダで、サンプルのclapping_short2.jsonをコピーしてoyasumi.jsonを作成します。

  3. oyasumi.jsonをメモ帳などで開きます。

  4. 以下のように編集します。(filenamesの内容を修正)

    {
      "file": "oyasumi.wav",
      "volume": 0.5,
      "names": [
        "oyasumi",
        "おやすみ"
      ]
    }
    
  5. 上書き保存してメモ帳を閉じます。

  6. Nurseryをボイスチャンネルに入室させた状態で、以下のコマンドを使って音声データを再読み込みします。(※bot名は各自で読み替えてください。)

    @nursery-bot sereload
    
  7. 新しい音が鳴るか確認します。

    se oyasumi
    

    もしくは

    se おやすみ
    

ヒント

  • 音声ファイルと.jsonファイルの名前に規則はありませんが、わかりやすさのため、同じ名前にしておくのがいいでしょう。
  • namesは複数の値を持つことができます。上記の例では2つにしましたが、それ以上にすることも可能です。
  • 上記の例のように、namesには日本語の文字や絵文字を含めることもできます。ただし、 空白(スペース)を含めることはできません。
  • namesにDiscord絵文字を含めることもできます。Discord絵文字は以下のようにIDを使って指定します。
    <:emoji_no_namae:419317757595746314>
    
    絵文字のIDは、Nurseryのemojiidコマンドを使って調べることができます。Nurseryが起動した状態で、以下のようにコマンドを実行します。(※bot名は各自で読み替えてください。)
    @nursery-bot emojiid :id_wo_shiritai_discord_no_emoji:
    

6. 音量を変更する

音源のファイルによって、音量が小さすぎたり大きすぎたりした場合は、音量を設定します。

  1. Nurseryフォルダ内のsoundsフォルダを開きます。
  2. 編集したい音声の.jsonファイルをメモ帳などで開きます。
  3. volumeの行を編集します。0.0~1.0までの小数で指定します。数字が大きいほど音量が大きくなります。
      "volume": 0.8,
    
  4. 上書き保存してメモ帳を閉じます。
  5. Nurseryをボイスチャンネルに入室させた状態で、以下のコマンドを使って音声データを再読み込みします。(※bot名は各自で読み替えてください。)
    @nursery-bot sereload
    
  6. 編集した音声を鳴らし、音量を確認します。

7. 音声ファイル全体の設定

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が終わるのを待ってから再生されます。

8. 高度な設定

8-1. チャットの文字に反応して鳴らす

sesoundのコマンドなしに、チャットの特定の文字列に反応して音を鳴らすことができます。以下の例では「注意!」の文字に反応して音が鳴るように設定しています。

{
  "file": "beep.wav",
  "volume": 0.5,
  "names": [
    "beep"
  ],
  "patterns": [
    {
      "pattern": "注意!",
      "type": "string"
    }
  ]
}

8-2. 正規表現で指定する(上級者向け)

正規表現を使って文字を指定することもできます。以下の例では「気を付けて」(ひらがなでも可)に反応するように設定しています。

{
  "file": "beep.wav",
  "volume": 0.5,
  "names": [
    "beep"
  ],
  "patterns": [
    {
      "pattern": "注意!",
      "type": "string"
    },
    {
      "pattern": "[気き]を[付つ]けて",
      "type": "regex"
    }
  ]
}

8-3. 関数で指定する(上級者向け)

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"
    }
  ]
}

9. 音声設定ファイル詳細仕様(上級者向け)

  • 設定ファイルは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"
    },
    ...
  ]
}

9-1. file

  • 音声ファイルのパスを文字列で指定します。
  • 相対パスで記述することができます。
  • フォルダパスを含める際は\をエスケープするのを忘れないようにしてください。
    "file": "subfolder\\sample.wav"
    

9-2. volume

  • 音量を小数で指定します。
  • 0.0~1.0の間で指定します。
  • 数字が大きいほど音が大きくなります。

9-3. names

  • se (名前) もしくは sound (名前) コマンドで使用される名前を、文字列の配列で指定します。
  • 0個以上の文字列を指定することができます。

9-4. patterns

  • 文章に反応する「パターン設定」を指定します。
  • 0個以上のパターン設定を指定することができます。
  • パターン設定には以下の3種類があります。
    • stringパターン
    • regexパターン
    • functionパターン

9-4-1. stringパターン

文字列で指定するパターン設定です。

    {
      "type": "string",
      "pattern": "pattern-string",
      "replace_to": "replace-string"
    }
  • type : "string" を指定します。
  • pattern : 反応する文字列を指定します。
  • replace_to : オプション。patternにマッチした文字列を、ここで指定した文字列に置き換えて読み上げます。""を指定すると文字の削除になります。replace_to項目が存在しない場合、置き換えは行われず、patternにマッチした文字列もそのまま読み上げられます。

9-4-2. regexパターン

正規表現で指定するパターン設定です。

    {
      "type": "regex",
      "pattern": "regex-string",
      "replace_to": "replace-string"
    }
  • type : "regex" を指定します。
  • pattern : 反応する正規表現を指定します。例えば、/[0-9]/にマッチさせたい場合は[0-9]と記述します。使用できる正規表現は.NET の正規表現に準拠します。
  • replace_to : オプション。patternにマッチした文字列を、ここで指定した文字列に置き換えて読み上げます。""を指定すると文字の削除になります。replace_to項目が存在しない場合、置き換えは行われず、patternにマッチした文字列もそのまま読み上げられます。

9-4-3. functionパターン

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から使用可能なインターフェースを参照してください。

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);
}

10. プラグインの無効化

  1. plugins\plugins.jsonをメモ帳などで開きます。
  2. Nursery.SoundEffectPlugin.で始まる行を削除します。
  3. 上書き保存してメモ帳を閉じます。
  4. 次回の起動時から、SoundEffectプラグインが無効になります。