roblox-sfx について
Roblox ゲーム向けの音声を役割ごとに探して検証するスキルです。Creator Store を検索し、Studio で候補を測定して、掲載時間だけに頼らず役割別のサウンドバンクを生成します。
主な機能
- 01ゲーム内の役割別に音声を検索
- 02Studio で候補音声を測定
- 03読み込み状態と長さで選別
- 04マニフェストと Luau モジュールを生成
- 05試聴・インストール用スクリプト
活用シーン
- 01ゲーム用の足音や効果音探し
- 02環境音楽の長さ範囲の指定
- 03役割別に呼び出せる音源バンク作成
- 04候補音声の読み込み確認
MCP 対応
接続済みの Studio MCP で Luau の測定・報告スクリプトを実行し、候補音声の読み込み状態と実測時間を取得します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ syphodev-yt/ roblox-ai-skills --skill roblox-sfxインストール後、Claude Code で/roblox-sfxを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LOCAL.template.mdexamples/spec.example.jsonscripts/emit_bank.pyemit_probe.pyfind_sfx.pypick.py詳細
RobloxのサウンドをIDで検証
このマシンで初めて使いますか? このフォルダーの
LOCAL.mdを読んでください。存在しない場合は、roblox-skills-setupスキルを実行するか、LOCAL.template.mdをLOCAL.mdにコピーして必要事項を記入してください。LOCAL.mdにはパスとツールの場所が記載されています。このファイルはあなた専用で、共有されることはありません。
このスキルのすべては、推測ではなく測定された次の事実に基づいています。
無料のCreator Storeオーディオアセットは、未公開かつ未保存のプレースで、APIキーも所有権もアップロードもなしに再生できます。
そのため、サウンドにOpen Cloudのオーディオ割り当て量は必要ありません(未検証の場合は月10回、ID検証済みの場合は100回で、作成専用のため、再生成するたびに枠を1つ消費します)。必要なのは検索と検証です。これにより、オーディオの工程をクリティカルパスから完全に外せます。
spec.json (roles: what the game needs a sound FOR)
-> find_sfx.py unauthenticated toolbox search -> candidates.json
-> emit_probe.py probe.lua + report.lua
-> Studio create the Sounds, then MEASURE them <- the gate
-> pick.py three gates, then score -> manifest.json
-> emit_bank.py SoundBank.luau + Sfx.luau + install.lua + tour.lua
検索で得られるのは候補です。Studioで得られるのは事実です。選択に使うのは事実だけです。
何を、いつ測定したか
2026-08-30に、サードパーティの robloxstudio-mcp を接続し、未保存の Place1(placeId 0)を使ってStudio上で実際に検証しました。
| 質問 | 回答 |
|---|---|
toolbox-service/v1/marketplace/3 に認証は必要ですか? | いいえ。 footstep の検索で200件中1000件の結果 |
items/details に認証は必要ですか? | いいえ。 audioType、アーティスト、投票数、isFree を含む完全なメタデータ |
| 分析のためにオーディオファイルをダウンロードできますか? | いいえ。 assetdelivery v1とv2はいずれも401 |
| 所有していない無料のオーディオIDを未公開のプレースで読み込めますか? | はい。 候補40件中40件で IsLoaded = true |
編集モードで Sound:Play() は動作しますか? | はい。 プレイテストは不要で、Studio内で音が聞こえます |
Toolboxの duration フィールドは信頼できますか? | いいえ。 実際には0.500秒のサウンドが 0 と表示されます。提供した8件の候補のうち2件は、表示値が測定値と一致しませんでした |
選択を巧妙にできない理由は、4行目にあります。分析できる波形も、確認できるスペクトログラムもなく、ここから耳で判断することもできません。存在するのは掲載情報と測定値だけで、このスキルはその2つだけを使うことを正直に示しています。
すべてを決めるルール
掲載情報は主張です。Sound.TimeLength は測定値です。主張を判定条件にしてはいけません。
find_sfx.py は、掲載情報の再生時間を意図的に listed_duration という名前で保存します。これにより、後続処理がそれを測定値と取り違えることはありません。また、pick.py は、両者の差が25%を超える候補に listing_was_wrong を記録します。最初の実行では、8件中2件でこれが発生しました。
Studioの呼び出しは1回ではなく、2回
execute_luau はスクリプトが少しでもyieldすると、すべての出力を破棄します。また、Soundは SoundId を設定したフレーム内には長さを解決しません。そのため、プローブを2回に分けます。
call 1 probe.lua creates every candidate Sound, returns immediately
(a beat)
call 2 report.lua returns role,id,loaded,length as CSV
2回目の呼び出しで loaded=false のままのものがあれば、信じる前に report.lua をもう一度だけ実行してください。2回目も失敗した場合に限り、本当の失敗です。その場合は、解決できないID、削除されたアセット、またはこのプレースでは使用が許可されていないオーディオを意味します。
3つの判定条件
Studioが次の3つすべてを順番に確認して初めて、候補は選択対象になります。
IsLoaded == true— IDが解決され、このプレースで使用できますTimeLength > 0— 長さが0のサウンドは短いのではなく、壊れていますmin_len <= TimeLength <= max_len— 用途に応じた範囲内です
検索スコアは同順位の場合に限り、順位を決めます。上位の掲載情報が判定条件を満たさなければ、必ず条件を満たした下位の候補が優先されます。最初の実行では、範囲の上限が5秒の用途に対し、6.55秒の「wooden gate open」が除外されました。
用途が埋まらない場合は警告ではなく失敗です。 emit_bank.py は、欠けた項目があるバンクの出力を拒否します。これを上書きするには明示的に --allow-holes を指定する必要があります。これは、意図的に無音のイベントを提供することを意味します。
仕様の作成
ゲームで音が必要な対象ごとに1つ記載します。思いついた音ごとに記載するのではありません。
{
"name": "farm",
"roles": [
{ "name": "sheep_bleat", "query": "sheep bleat", "kind": "SoundEffect",
"min_len": 0.3, "max_len": 4.0, "volume": 0.5 },
{ "name": "ambience", "query": "countryside ambience", "kind": "Music",
"min_len": 20, "max_len": 300, "volume": 0.2, "looped": true }
]
}
kindはSoundEffectまたはMusicです。これはアセットの実際のフィールドであり、食い違いがあると大きく減点されます。SoundEffectの役割にMusicトラックが割り当てられるのは、9分間のリミックスが足音になってしまう典型的な原因です。- バンドは設計上の判断です。1.5秒を超える足音は足音とは言えません。それを記載しておけば、音を聞かずに機械が却下できます。
volumeとloopedは出力されるバンクに引き継がれます。
仕様の例は examples/spec.example.json にあります。コピーして、各役割を編集してください。
実行する
cd ~/.claude/skills/roblox-sfx
python scripts/find_sfx.py spec examples/spec.example.json --out work/candidates.json --per-role 5
python scripts/emit_probe.py work/candidates.json --out work
# execute_luau work/probe.lua -> "created N sounds across M roles"
# execute_luau work/report.lua -> save the return value verbatim to work/report.txt
python scripts/pick.py work/candidates.json work/report.txt --out work/manifest.json
python scripts/emit_bank.py work/manifest.json --out work
# execute_luau work/install.lua -> SoundService.SFX, audible in this place
# execute_luau work/tour.lua -> plays the whole bank in order, so a human can judge it
仕様なしで、単発検索を行う場合:
python scripts/find_sfx.py search --query "wolf howl" --kind SoundEffect --limit 20
含まれるもの
| ファイル | 配置先 | 内容 |
|---|---|---|
SoundBank.luau | src/shared/Config/ | データのみ:役割 -> ID、測定時間、音量、ループ設定、クレジット |
Sfx.luau | src/shared/ | Sfx.play(role, parent, pitchVary)、Sfx.preload()、Sfx.stop() |
install.lua | execute_luau | Rojo 同期のない場所向けに、SoundService.SFX を直接作成します |
tour.lua | execute_luau | 実際の長さに合わせて間隔を空け、すべての音を順番に再生します |
出力されるコードには、次の2つのルールが保たれます。
- バンク以外の場所でアセット ID を指定することはありません。 ゲームプレイコードでは
Sfx.play("wolf_howl", head)と記述します。音量の再調整やアセットの差し替えは、コードではなくデータの編集で行います。 - 音がゲームプレイを妨げることはありません。
Sfx.luauの各エントリーポイントはpcallで分離され、失敗時にはnilを返します。音が見つからなくても、ショットの発射や羊の移動が止まることはありません。
tour.lua では task.wait のループではなく task.delay でスケジュールします。これは、プローブを2つに分けているのと同じ理由です。yield するスクリプトでは出力が失われます。
注意点
一覧に表示される時間は正しくありません。 前述のとおりです。Studio での往復を「最適化」して省いた場合、このパイプラインから不適切な音が出荷される原因として最も可能性が高いのは、これです。
MCP の search_assets は行き止まりです。 HTTP 403 Scope not authorized が返され、パラメーターをどう変えても解決しません。そのため、このスキルでは認証不要のツールボックスエンドポイントに直接アクセスします。
音を聞くことはできず、モデルも聞けません。 Cookie がないと assetdelivery は 401 を返すため、波形もスペクトログラムもラウドネス値もありません。このスキルが音について述べる内容はすべて、一覧か TimeLength に基づいています。音の好みが重要な場合は、tour.lua を実行して人間が判断してください。無人実行では、ゲートとスコアが正直に主張できる上限です。その事実を隠すのではなく、はっきり伝えることにも意味があります。
無料パックと無料の音源は同じではありません。 無料の Creator Store パック は、人間がアカウントに取り込むまで読み込めません(VFX ハーベスターで苦い経験をして学びました)。ID で使用する個別の音声アセットにはその手順がありません。だからこそ、このスキルは ID を使い、誰かに何かを取り込むよう求めることもありません。
プローブ中に音量を 0 にするのは意図的です。 Studio を開いた状態で候補の音が40個同時に解決されると、不快になります。probe.lua は Volume = 0 を設定し、audition.lua、install.lua、tour.lua は実際の音量を設定します。
Roblox の標準ライブラリのアセットには、意図的にボーナススコアを付けています。 Creator ID が1のアセット(91207… の形式の ID)は一貫性があり、常に使用が許可され、削除されることもありません。数か月後にも再現できる実行が必要なら、これらを優先してください。
音声生成ではなくライブラリから選ぶ理由
ライブラリから選べば、クォータも ID の確認もモデレーション待ちもアップロードも必要ありません。また、エージェントが Creator Store を検索して選ぶ場合、人間の介入も必要ありません。
音声を生成しても、ループ内の誰も聞けないものを作るために、作成専用のアップロードクォータを消費するだけです。その交換条件に見合う価値はありません。このスキルは、その理由を示すものです。