天音結歌とは
天音結歌(あまね ゆいか)は、「Discordを手軽に彩る音楽Bot」を目指して作った、私の自作Discord用音楽Botです。ボイスチャンネルで音楽を再生する、いわゆる音楽Botなのですが、操作の入り口はスラッシュコマンドだけではありません。ブラウザから操作できるWebUIと、ボイスチャンネル内から起動してみんなで触れるDiscord Activityの画面を持っているのが特徴で、amane.c1n.app で公開しています。対応している音源はYouTube、YouTube Music、SoundCloud、Spotify。プレイリストの作成や共有、よく聴かれている曲のランキング表示など、音楽Botとしての基本機能も一通りそろっています。
名前は、音楽や音にまつわる漢字を当てて付けました。そして「結」という字には、人と人を結ぶ橋渡しになってほしい、という願いを込めています。友達同士で通話しながら同じ曲を聴く時間って、それ自体がコミュニケーションだと思うんです。
使ってくれているのは、私自身と身内のサーバー、そして身内のフレンドたちです。面識のない方も含めて、身近な人たちが日常的に使う道具として、少
しずつ育ててきました。

なぜ作ったか
きっかけはとてもシンプルで、既存の音楽Botが使いづらかったからです。再生もスキップもキューの確認も、全部コマンドを覚えて打たないといけない。「この曲かけて」と頼まれた人が、まずコマンドを思い出すところから始まるのって、音楽を手軽に楽しむための道具としてはちょっと違うなと感じていました。
それなら、コマンドを打たなくても操作できる音楽Botを自分で作ってしまおう。聴きたい曲を探して、押して、流れる。そんな当たり前の流れを目指したのが、天音結歌の出発点です。
開発の歩み
開発は2026年6月にスタートして、紹介動画をYouTubeに公開した同年10月5日までが、一区切りの制作期間でした。その後も改善は続いていて、コミットは10月末までに180件になりました。ここからは時系列で振り返ってみます。
6月:土台づくり。 再生とキューの管理、音源のキャッシュ、自動アップデートといった基盤を固めて、検索のサジェスト改善やPWA対応、Misskey連携もこの時期に入りました。月末には、WebUIからキャッシュ済みの音声を再生する「ブラウザ再生」まで届いています。
7月:WebUIの充実と、Activityの誕生。 アーティストページやSpotifyプレイリストの取り込みが入りました。そして7月12日には、SQLiteのデータベースを用途別の4ファイルに分割する大きな改修と、Discord Activityの実装を一気に進めています。共有のNow Playing画面から、再生コントロール、検索と追加、お気に入りやプレイリストからの追加まで、この日にPhase 4まで実装しました。
8月:機能の大型追加。 同期歌詞の表示、オートプレイ、音声エフェクト、そしてAIが依頼文から選曲するAIミックスを、まとめて追加しました。同時に、後ほど触れる「軽量化」の取り組みもこの頃から始まっています。
9月:デザインの作り込み。 コミット数は56件で、全期間でいちばん多い月でした。Discord ActivityをFigmaのデザインに合わせて実測値で全面再構築し、WebUIも「Quiet Stage」というデザインに刷新しました。この頃には本番環境で実際に使われながら直していくフェーズに入っていて、「本番で見つかった不具合の修正」がコミットに並ぶようになります。
10月:運用機能とAI選曲の作り直し。 管理画面にサーバーごとの統計やフィードバック機能が入って、10月25日にはAI選曲を大規模に再構築しました。選曲の既定をClaudeにする方式へ切り替えて /mix を作り直し、キューが尽きそうになると関連曲をAIが選んで足し続けてくれる「インフィニティ再生」が、従来のオートプレイを引き継ぎました。
こだわり:コマンド不要の操作
一番のこだわりは、やっぱり「コマンド不要」です。Discord Activityでは、ボイスチャンネルに参加している全員が同じ画面を見て、再生やスキップ、曲の追加をその場で操作できます。コマンドを知っている人がいなくても、誰でもDJになれる。そんな場所にしたかったんです。
そして、その前に作ったのがWebUIでした。Activityができる前から「Webで操作させたかった」ので、まずブラウザ側の操作画面を用意したんです。WebUIには管理画面としての役割に加えて、もう一つの目的があります。それ
は、「みんなが音楽をどんなふうに聴いているかを知る」こと。再生履歴やランキングを見れば、そのサーバーの音楽の傾向が見えてきます。聴き方を目に見える形にするのも、WebUIの大事な仕事です。

技術構成
中身はPythonで作っています。Bot本体はdiscord.py、WebUIとAPIはFastAPI + Uvicorn + Jinja2、データ保存はSQLiteで、用途別に4ファイルへ分割してATTACHで一本化しています。音源の取得にはyt-dlpとytmusicapi、再生にはFFmpegを使いました。AI選曲にはAnthropicのClaude API、歌詞の同期表示にはLRCLIBのデータを照合して使っています。パッケージ管理はuvで、実行環境はPterodactylのような常駐環境を前提にしています。リポジトリには主要機能を対象にした単体テストもそろっていて、「作って終わりにしない」運用を支えてくれています。
重さとの戦い
開発で一番詰まったのは、動作の重さでした。機能が増えるにつれて処理が膨らんでいって、だんだん快適さが損なわれていくんです。そこで、重い処理は別タスクに分離して本体の応答を軽く保つようにして、あわせてサーバー自体の性能も引き上げました。コミット履歴にも「軽量化Phase」が何期にもわたって並んでいて、8月に始まった取り組みは9月のPhase 5まで続いています。速さって、一度直して終わりではなくて、機能追加のたびに向き合い続けるテーマなんだなと実感しました。
今後
今後の予定として、WebUIのログインを自作のSSO基盤「chokoID」へつなぐことを考えています。自分のサービス同士を連携させて、認証を一本化していく計画です。そして軽量化とUXの改善は、これからも続けていくテーマです。「コマンド不要で、押せば流れる」という最初の理想に、少しずつ近づけていけたらと思っています。
次回予告
第2回は「WebUIとDiscord Activity編」です。ブラウザ再生とDiscord再生の引き継ぎ、Figma実測でのActivity再現、同期歌詞の仕組みなど、画面まわりを深掘りします。お楽しみに。
コメント