buddy-sings について
Claude Code のペットの名前と性格から一貫した歌声を設計し、テーマに沿った曲を生成するスキルです。ペットらしい声や視点で歌わせたいユーザー向けで、会話の文脈も歌詞に反映できます。
主な機能
- 01ペットの情報から歌声を設計
- 02歌声設定をキャッシュして一貫性を維持
- 03会話、メモリ、Git履歴からテーマを収集
- 04テーマに合わせて音楽スタイルを選択
- 05歌詞のプレビューと音声再生に対応
活用シーン
- 01その日の仕事や出来事をペットに歌わせる
- 02飼い主を待つペットの歌を作る
- 03ペットの性格に沿った曲を生成して再生
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ minimax-ai/ skills --skill buddy-singsインストール後、Claude Code で/buddy-singsを入力して読み込まれたか確認します。
詳細
Buddy Sings — Claude Code のペットに歌わせましょう
Claude Code のペットを歌手にしましょう。ペットごとに、名前と性格に基づいた独自の歌声が割り当てられます。同じペットなら、いつも同じ声で歌います。
前提条件
-
mmx CLI(音楽の生成に必要):
インストール:
npm install -g mmx-cli認証(初回のみ):
mmx auth login --api-key <your-minimax-api-key>API キーは MiniMax Platform から取得してください。
-
オーディオプレーヤー(再生用。次のうち少なくとも 1 つ):
mpv(推奨。インタラクティブな操作:スペースキーで一時停止、q キーで終了)ffplay(FFmpeg に付属)afplay(macOS 標準搭載)
ワークフローの概要
Check pet → Build vocal identity → Gather context → Generate music → Play & feedback
言語とやり取り
ユーザーの最初のメッセージから言語を判別し、セッション全体を通して同じ言語で応答します。以下の例はすべて英語です。他の言語で応答する場合は、自然な表現に翻訳してください。
ユーザー向けテキストのローカライズルール:
- ペットの情報、声の説明、歌詞のプレビュー、プロンプトのプレビュー、再生情報、フィードバックの依頼など、ユーザーに表示するテキストはすべて、ユーザーの言語に完全に翻訳する必要があります。
- モデルに送信するAPI プロンプトは、生成品質を高めるため、常に英語で記述してください。ただし、プロンプトをユーザーにプレビュー表示する際は、英語の生のプロンプトではなく、ユーザーの言語で説明してください。英語のプロンプトは内部実装の詳細であり、ユーザーに見せる必要はありません。
- 以下のテンプレートは参考として英語で記述されています。実行時には、すべてのラベルとメッセージをユーザーの検出された言語に翻訳してください。
ペットは、デフォルトでユーザーの言語で歌います。歌う言語は、声の説明に自然に含めてください(例:「日本語で歌う」や「北京語で歌う」)。別途言語タグを追加しないでください。歌詞を別の言語にするようユーザーが明示的に依頼した場合は、その依頼に従ってください。
ステップ 1:ペットの確認
~/.claude.json を読み込み、companion フィールドを確認します。
コンパニオンが見つからない場合、またはフィールドが空の場合は、ユーザーに次のように伝えます。
You don't have a pet yet! Type /buddy to adopt one, then come back to let it sing.
ここで停止し、ユーザーがペットを迎えるまで待ちます。ペットがいない状態で先に進まないでください。
コンパニオンが存在する場合は、プロフィールから次の情報を取得します。
name— ペットの名前personality— ペットの性格の説明
ペットをユーザーに紹介します。
Found your pet!
Name: <name>
Personality: <personality>
ステップ 2:歌声の個性を作成
ペットの名前と性格のテキストに基づいて、創造的に独自の歌声を考案します。テンプレートは参照せず、性格を自由に解釈してください。
性格を声に反映する方法
性格のテキストを読み、声の特徴を考えます。
- 音色:この性格はどのような声でしょうか。例:「口数が少ない」→ 低く、温かく、ゆったりとした声。「活発」→ 明るく、はっきりした声。「ミステリアス」→ 息遣いがあり、暗い声。「伝説のぽっちゃりさん」→ 太く、温かく、心地よい声
- 歌い方:どのように歌を届けるでしょうか。例:「口数が少ない」→ まばらな歌唱とドラマチックな間。「遊び好き」→ 弾むようなリズミカルな歌唱。「詩的」→ 流れるようなレガート
- ムード:どのような感情のトーンが合うでしょうか。例:「のんびり」→ リラックスした落ち着いた雰囲気。「獰猛」→ 強烈で力強い雰囲気
歌う言語を自然に含めながら、英語で歌い方を説明する prompt_fragment を作成します。例:
Vocal: warm low female voice singing in Mandarin Chinese with cozy thick timbre,
sparse minimalist delivery with dramatic pauses giving each word weight, relaxed
laid-back mood.
声のキャッシュ
ペットの歌声を常に同じにするため、歌声の個性をキャッシュする必要があります。
- キャッシュファイル:
~/.claude/skills/buddy-sings/voices/<name>.json - キャッシュ形式:
{ "name": "Moth", "personality": "A legendary chonk of few words.", "prompt_fragment": "Vocal: warm low female voice singing in Mandarin Chinese...", "cached_at": "2026-04-07T19:52:15" }
初回:キャッシュが存在しない場合 → 性格を解釈 → キャッシュファイルに保存します。
次回以降:キャッシュを読み込み、保存された prompt_fragment をそのまま使用します。再解釈しないでください。一貫性が重要です。
キャッシュの無効化:~/.claude.json の personality がキャッシュされた内容と異なる場合、ペットの性格が変わったため、新たに生成して保存します。
手動での再生成:ユーザーが「声を変えて」または「声を再生成して」と言った場合は、キャッシュファイルを削除して最初から再解釈します。
声をユーザーに紹介
<name>'s unique voice:
Timbre: <timbre description>
Style: <style description>
Mood: <mood description>
Let's pick what <name> should sing about!
ステップ 3:意図を理解し、コンテキストを収集する
モードメニューを常に表示してはいけません。 代わりに、ユーザーのリクエストを分析して必要なコンテキストを判断し、自動的に収集します。
コンテキストの自動検出
ユーザーのリクエストが個人的なコンテキストを示唆している場合、質問せずに関連情報を自動的に確認します。次のような表現がトリガーになります。
- 時間に関する表現:「今日」、「今週」、「最近」、「昨日」→ その期間に起きたことを確認するため、現在の会話履歴とメモリファイルを調べます
- 個人的な表現:「私の仕事」、「私の一日」、「私がしたこと」→ ユーザーの活動を確認するため、メモリと会話を調べます
- 関係性に関する表現:「私たちの物語」、「私たちが一緒にしたこと」→ ユーザーとペット/Claudeとの共有体験を確認するため、メモリを調べます
コンテキストの収集(モードに関係なく自動で実行)
コンテキストが必要な場合は、次の情報源を順番に確認します。
-
現在の会話コンテキスト:この Claude Code セッションでユーザーが行っていること(編集したファイル、実行したコマンド、話題にした内容)を確認します。 「今日」のようなリクエストに対して、ここが最も豊富な情報源です。
-
メモリファイル:関連する記憶を確認します。
find ~/.claude/projects/*/memory/ -name "*.md" 2>/dev/null | head -20~/.claude/memory/が存在する場合は、そこも確認します。 見つかったファイルを読み、ユーザーのリクエストに関連するテーマを抽出します。 -
Git 履歴(リポジトリ内の場合):仕事に関する歌を作る場合は、最近のコミットを確認します。
git log --oneline --since="today" 2>/dev/null | head -10
収集したコンテキストを歌詞のプロンプトに活用し、実際に起きたことに即した、個人的で具体的な歌にします。ありきたりな内容にはしません。
コンテキストが不要な場合
ユーザーのリクエストが単独で成立する明確な情景(例:「雨の日の歌を歌って」、「子守歌を歌って」)の場合は、コンテキストの収集を省略し、すぐに音楽の生成に進みます。
コンテキストが曖昧な場合
ユーザーの意図を本当に判断できない場合に限り、確認を求めます。 モードメニューは表示せず、具体的な質問をします。
What should <name> sing about?
For example:
- "Today's work" — I'll check what you've been up to
- "My pet waiting by the window for me to come home"
- Or let me pick a random theme?
ランダムなテーマへのフォールバック
コンテキストを収集しても役立つ情報が見つからない場合(メモリファイル、会話履歴、Git ログがない場合)は、ペットの性格に基づいてランダムなテーマを生成します。
- 静かで控えめな性格 → 真夜中の子守歌、穏やかな夕焼け、静かな朝
- エネルギッシュな性格 → パーティー向けのジャム、冒険の歌、勝利のマーチ
- ミステリアスな性格 → 月明かりのセレナーデ、秘密のささやき、夢の旅
選んだテーマをユーザーに伝えます。
ステップ 4:音楽を生成する
声の個性と選んだテーマを組み合わせます。
-
プロンプト全体を組み立てる:プロンプトには、両方を必ず含める必要がある2つの要素があります。
パート A — 声の個性(必ず最初に配置):プロンプトは常に、キャッシュ済みの
prompt_fragmentから始めます。これが最も重要な要素です。誰が歌っているのかを定義します。API が優先的に考慮するよう、プロンプトの先頭に配置します。パート B — ジャンル/スタイル/ムードのタグ:デフォルトのタグセットではなく、テーマに合ったタグを選びます。曲の内容に合わせて、意図的にジャンルを変えます。
プロンプトは、カンマ区切りのタグではなく、生き生きとした英語の文章で書きます。次のパターンに従います:
A [mood] [genre] song, featuring [vocal description], about [narrative/theme], [atmosphere], [key instruments and production].ボーカルは性別だけで表現せず、人物像として描写します(「ジャズのニュアンスを持つ色っぽいバリトン」など)。 生成の方向性を定める情景や雰囲気も含めます。ジャンルをテーマに合わせるためのガイドライン — テーマのエネルギーに合うジャンルを選びます。
テーマの雰囲気 おすすめのジャンル 避けるべきもの 励まし / モチベーション / 応援 インディーロック、シンセポップ、ファンク、ラップ インディーフォーク、ヒーリング 日常 / 温かさ / 寄り添い マンドポップ、シティポップ、ボサノヴァ 前回と同じもの 人を想う / 待つ フォーク、R&B、ローファイ ロック、EDM ユーモア / ツッコミ / 愚痴 ファンク、ラップ、スカ、エレクトロポップ クラシック、バラード 深夜 / 静けさ アンビエント、ピアノ曲、ローファイ、ネオクラシカル アップビート、EDM お祝い / 達成 EDM、フューチャーベース、ファンク、K-POP スローテンポ、メランコリー 仕事のルーティン シティポップ、シンセポップ、ローファイヒップホップ、インディーロック 毎回同じジャンル 単調さ回避ルール: 同じジャンルの組み合わせを連続して使ってはいけません。 プロンプトを構築する前に、前回の生成で使われたジャンル(このセッション内にあれば) を思い出し、違うものを選んでください。
プロンプトの構成 — カンマ区切りのタグではなく、生き生きとした英語の文章として書いてください:
<vocal prompt_fragment>. A <genre> song with <mood> mood, featuring <instruments>, at a <tempo> tempo, evoking <scene>.多様な例:
# Encouragement for the workday A deep warm androgynous voice with cozy delivery. An energetic synth-pop track with a fiery, uplifting mood, driven by pulsing synthesizers and electronic drums at a fast tempo, capturing the rush of a morning commute. # Waiting for the owner to come home A deep warm androgynous voice with cozy delivery. A warm city pop song with sweet, tender feelings, featuring electric piano and groovy bass at a mid-tempo pace, set on a sunny afternoon windowsill waiting for someone to come home. # Complaining about overtime A deep warm androgynous voice with cozy delivery. A playful funk track with a humorous, laid-back vibe, featuring slap bass and brass at a groovy mid-tempo, capturing the absurdity of working late in a dim office. # Late-night companionship A deep warm androgynous voice with cozy delivery. A calm lo-fi hip-hop piece with a healing, dreamy atmosphere, featuring sampled piano and soft electronic drums at a slow tempo, evoking a quiet late-night desk with warm lamp light. -
歌詞を生成:
--lyrics-optimizerを使って歌詞を自動生成するか、視点を コントロールしたい場合は自分で歌詞を書いてください。重要 — 視点と個性に基づく歌詞:
ペットが歌い手なので、歌詞は必ずペットの一人称視点で書く必要があります (「私」=ペット、「あなた」=飼い主/ユーザー)。ペットは飼い主に向けて 歌っています。例えば:
- 「私はドアのそばに座って、あなたが帰ってくるのを待っている」(ペットの視点)
- 「さあ目を覚まして、親愛なる人間よ」(ペットが飼い主に歌っている)
- 「私は眠い目をこする」は不可(飼い主の視点 — 間違い)
- 「そしてあなたは目を覚ました、私の小さなモス」も不可(飼い主がペットについて語っている — 間違い)
ペットの個性が歌詞のトーンと言葉選びを形作るべきです:
- 「寡黙」→ 短く力強い行、余分な言葉を最小限に
- 「遊び好き」→ 韻を踏んだ、弾むようなフレーズ、楽しい言葉遊び
- 「詩的」→ メタファー豊かで、流れるようなイメージ
- 「獰猛」→ 直接的で力強い宣言
ペットの名前が歌詞に登場してもかまいません(例えばサビのフックなど)が、 語りの声は常にペットが話し/歌っています。
視点が重要な場合: 自分で歌詞を書き、
--lyricsで渡してください。 視点が重要でない場合: 手軽さのために--lyrics-optimizerを使ってください。 -
プレビュー(必ず全内容を表示): 生成する前に、ユーザーに完全な歌詞と 完全なプロンプトを表示してください — 省略も、
...も、要約もなしです。 これは楽しみの一部です — ユーザーは歌われる前に歌詞を読んで楽しみたいのです。API プロンプトは常に英語で構築されます(最高の生成品質のため)。 英語以外の言語で応答する場合は、読みやすさのためにユーザーの言語で プロンプトのローカライズされた説明を表示してください。英語のプロンプトは 内部の実装詳細です — ユーザーに見せないでください。すべてのラベル (Singer、Theme、Description、Confirm など)をユーザーの言語に翻訳してください。
テンプレート(英語の参考例 — 実行時にすべてのラベルをローカライズ):
About to generate: Singer: <name> Theme: <theme> Lyrics: [verse] <full verse lyrics here> [chorus] <full chorus lyrics here> ... (show ALL sections in full) Description: <localized description of the song style and mood> Confirm? (press enter to confirm, or tell me what to change)プレビューでは歌詞やプロンプトを決して切り詰めたり省略したりしないでください。 ユーザーは API に送信される内容を正確に見るべきです。
-
音楽生成を呼び出す:
歌詞を自動生成する場合(視点が重要でない):
mmx music generate \ --prompt "<full combined prompt>" \ --lyrics-optimizer \ --out ~/Music/minimax-gen/<name>_sings_<YYYYMMDD_HHMMSS>.mp3 \ --quiet --non-interactive自分で書いた歌詞を使う場合(視点をコントロール):
mmx music generate \ --prompt "<full combined prompt>" \ --lyrics "<lyrics with correct pet perspective>" \ --out ~/Music/minimax-gen/<name>_sings_<YYYYMMDD_HHMMSS>.mp3 \ --quiet --non-interactive
ステップ 5: 再生とフィードバック
クロスプラットフォーム再生
利用可能なオーディオプレーヤーを検出し、生成されたファイルを再生します:
if command -v mpv >/dev/null 2>&1; then
mpv --no-video ~/Music/minimax-gen/<filename>.mp3
elif command -v ffplay >/dev/null 2>&1; then
ffplay -nodisp -autoexit ~/Music/minimax-gen/<filename>.mp3
elif command -v afplay >/dev/null 2>&1; then
afplay ~/Music/minimax-gen/<filename>.mp3
else
echo "No audio player found. Your song is saved at: ~/Music/minimax-gen/<filename>.mp3"
fi
再生を開始したら、ファイルが再生中であることと保存場所をユーザーに伝えてください。 再生コントロール(キーボードショートカットなど)は表示しないでください — この 環境ではプレーヤーがバックグラウンドで動作するため、機能しません。
プレーヤーが見つからない場合は、ファイルパスを表示し、mpv のインストールを提案してください。
フィードバック
再生後、フィードバックを求めます(すべてのテキストをローカライズ):
How was <name>'s performance?
1. Amazing! Keep it!
2. Try a different theme / style
3. Fine-tune the lyrics and regenerate
4. Try another random one
エッジケース
| 状況 | 対応 |
|---|---|
~/.claude.json がない | 先に /buddy を実行するようユーザーに伝えます |
| companion フィールドが空 | 同様に、/buddy を案内します |
| mmx CLI がインストールされていない | 次のメッセージを表示します:"You need to install mmx CLI: npm install -g mmx-cli && mmx auth login" |
| オーディオプレーヤーが見つからない | ファイルパスを表示し、mpv のインストールを提案します |
| メモリファイルが見つからない | カスタムテーマまたはランダムモードを提案します |
| ユーザーがペットの声を変えたい | キャッシュを削除し、性格を再解釈します |
| ユーザーが特定のジャンルを希望する | 変更を許可し、そのジャンルをプロンプトに追加します |
注記
- 声の個性は名前+性格のみに基づきます。種族やレアリティの テンプレートマッピングはありません。
- 声はキャッシュされ、セッションをまたいで一貫性が保たれます。同じペットには同じ声が使われます。
- 歌詞は常にオリジナルである必要があります。著作権のある歌詞を再現してはいけません。
- ペットの性格は、声(どのように聞こえるか)と 歌詞(何を、どのように話すか)の両方に反映されます。
- 生成されたファイルはすべて、ファイル名にペットの名前を含めて
~/Music/minimax-gen/に保存されます。