速く鳴らすための設計
Sound Magicは最速で音楽を流します。 そのために何をしているかをまとめました。
対応している音楽サービス
URLの貼り付けと、曲名・アーティスト名での検索の両方に対応しています。
| サービス | URL の入力 | 役割 |
|---|---|---|
| YouTube Music | 対応 | 再生ソースとして最優先で使用 |
| YouTube | 対応 | 再生ソース |
| SoundCloud | 対応 | 再生ソース |
| Spotify | 対応 | 楽曲情報の取得。再生は他ソースへ振り替え |
| Apple Music | 準備中 | 楽曲情報の取得。再生は他ソースへ振り替え |
| Tidal | 準備中 | 楽曲情報の取得。再生は他ソースへ振り替え |
| Deezer | 準備中 | 楽曲情報の取得 / 条件により再生ソース |
| Qobuz | 準備中 | 楽曲情報の取得 / 条件により再生ソース |
曲が見つからないと言われた場合はYouTubeのURLで再生することで確実に再生できますよ!
曲を特定するまで
入力の種類によってたどる道が変わります。
URLを貼ったとき
再生可能なサービスのURLであれば、そのまま再生に進みます。これが最短で確実な方法です。
曲名で検索したとき
複数のサービスのAPIを同時に叩いて、返ってきた候補をタイトル・アーティスト・収録時間で採点します。基準を満たした候補が出た時点で確定します。
ISRCが分かるとき
Spotifyなどから取得したISRCで一致を確認できた候補を優先します。同名異曲やカバーの誤選択を減らせます。
誤った候補をはじく
収録時間が大きくずれるもの、ライブ・カバー・リミックスが意図せず混ざったものなどを除外する条件を設けています。
再生中の体験
キューと先読み
次に再生する曲を事前に準備しておくため、曲間の待ちが発生しにくくなります。
ほぼない合間
曲の切り替わりで生じる無音を最小限に抑えます。
プレイリストの遅延読み込み
長いプレイリストでも全曲の解決を待たず、1 曲目から再生を始めます。
ループ
1曲のみ / キュー全体 / オフ の3モードを切り替えられます。
オートプレイ
キューが空になったとき、直前の曲と関連する曲を続けて再生します。特定のサービスの推薦機能だけに依存しません。
キューの復元
再生中のキューは外部ストレージに同期しているため、Bot の再起動が起きても状態を復元できます。
止まりにくくするための仕組み
ソースの自動切り離し
エラー率などに合わせてソースを自動で切り離して別のサービスに頼ることで速度を安定させます。
再生ノードの冗長化
音楽再生用のノードは複数あり、万が一、一つがダウンしても他のノードが再生を続けます。
リージョン親和性
Discordのボイスサーバーに近いノードを選ぶことで音声の遅延と途切れを抑えます。
締め切り付きの解決
曲の検索にはリミットがあるので最速で取得できます。
状況別の目標時間
P50 は「半数がこの時間以内」、P95 は「95% がこの時間以内」を意味します。
| 状況 | 大体(P50) | ほとんど(P95) |
|---|---|---|
| コマンドへの最初の応答 | — | 150ms |
| VC 参加済み / キャッシュあり | 400ms | 800ms |
| VC 参加済み / キャッシュなし | 800ms | 1.5s |
| VC 未参加 / キャッシュあり | 1.0s | 2.0s |
| VC 未参加 / キャッシュなし | 1.5s | 3.0s |
これらは設計上の目標値であり、実測値や品質の保証ではありません。
特に検索などは外部に依存するため目標値を超えることがあります。