12.20 追記
Xでポストしたところ思ったより反響があり、ソースコードを公開したので遊んでみたい方はご自身の環境でビルドしてお楽しみください〜
今年でクソアプリアドベントカレンダー参加 8 年目になります、黒神(@kokushing)と申します。
突然ですが、Discord のサウンドボード機能って知ってますか?
通話中に 🎉 ボタンを押すと出てくるコレです。
通話中に任意のタイミングでボタンを押すと、登録済みの音源を通話参加者に向けて再生できる機能です。
流行っているミーム音源で場を盛り上げたり、誰かが滑ったときにフォローできる神機能だと思っています。システムサウンドの設定も不要なので、誰でも簡単に使えるのが素敵ですね。
問題点
そんなサウンドボード機能ですが、いくつか不便だと感じる点があります。
- 無料サーバだと 8 個までしか登録できない
- ゲームに集中すると再生タイミングを逃す
- ショートカットキー設定が被る
- そもそも設定するのが面倒くさい
1 は仕方ないとして、2 は個人的にもったいないなーと感じています。個人差はあると思いますが、僕はいつも再生タイミングを逃してしまいます...。
ショートカットキー設定周りに関しては、まあ設定すれば良いんですけど、この機能のために貴重なショートカットキー枠を奪うほどでもないなぁ...という感じです。
これらの問題を解決しようとしたものが、今回ご紹介するクソアプリになります。
つくったもの
その名も 「Super Soundboard」 です。
実際に動作している映像がこちら (音声入っていませんが、実際には喋ってます)
Discord のアプリ拡張ではなく、Discord Bot という形でサウンドボード機能を再現しています。
このアプリを使えば、
- 音源を好きなだけ登録できる
- 発言中のワードを検出して音源を再生してくれる
- 自動再生なのでショートカット設定不要
といったことが実現可能です。
これでゲームに集中していても音声をトリガーにして場を盛り上げることができます!
技術的なところ
今回の実装で一番ネックになったところが Speech to Text によるワード検出の箇所です。
クソアプリに掛ける費用は最低限にすることが僕のモットーなので、有料 API を利用することはレギュレーション違反です。8 年目になると縛りプレイも楽しめるようになります。
そのためローカル LLM で実装しようと思ったのですが、手元には M1 Pro 環境しか無く faster-whisper を試してみましたが、いまいち精度と速度が出ませんでした。悲しい。
そこで Google Chrome に標準搭載されている Web Speech API を用いて実装することにしました。
この API を使えば、数行のコードで簡単に STT を実装することが可能です。
// 初期化
const rec = new SpeechRecognition();
rec.lang = "ja-JP";
rec.continuous = true; // 連続認識
rec.interimResults = true; // 途中結果も受け取る
// 結果イベント(確定 / 途中 を分けて取り出す)
rec.onresult = (e: SpeechRecognitionEvent) => {
let interim = "";
let appendedFinal = "";
for (let i = e.resultIndex; i < e.results.length; i++) {
const text = e.results[i][0].transcript;
if (e.results[i].isFinal) appendedFinal += text;
else interim += text;
}
// appendedFinal が「確定文字列」、interim が「途中文字列」
// setFinalText(prev => prev + appendedFinal)
// setInterimText(interim)
};
// 開始 / 停止
rec.start();
rec.stop();
文字起こしの精度と速度もいい感じで、API を見つけた当時はこのクオリティを無料で使えることに驚きました。
ちょうどクソアプリアドベントカレンダー主催のあんどさん(@ampersand_xyz)のポストがバズっていましたが、Prompt API のマルチモーダルの性能も良い感じですね。
この API を使ったクソアプリも面白そうです。
あとは、Discord Bot は公式の discord.js でサクッと実装。
WebSocket でクライアントと接続し、検出結果の音源データを Bot へ送信して再生させているだけです。
音源はこちらのサイトのものをお借りしました。
最後に
実際にこのアプリを使って友人と Apex Legends をプレイしたのですが、絶妙なタイミングで効果音を入れてくれるので、常時笑いが絶えない時間を過ごすことができました。
個人的には「武器大丈夫そ?」→「大丈夫だ、問題ない」→「ペイペイで買って」→「paypay♪」の流れが好きでした。
こういうアプリを思いつきでサクッと作れるのは本当に良い時代になりましたね...。
来年のクソアプリアドベントカレンダーも今から楽しみです!
