Stable Audio 3 本地部署记录:Windows + uv + CUDA + Gradio UI
Stable Audio 3 本地部署记录:Windows + uv + CUDA + Gradio UI
本文记录在 Windows 环境下本地部署 Stability-AI/stable-audio-3,并成功运行 medium 与 small-sfx 两个模型的完整流程。
用于个人游戏开发2026-06-21 精简开发文档,发展方向以及音频资产解决思路
适用目标:
-
本地生成游戏音效
-
使用 Gradio Web UI
-
对比
medium与small-sfx -
避免 Windows 下
uv自动装 CPU 版 PyTorch 的坑
1. 模型区别
Stable Audio 3 仓库中常用模型如下:
| 模型 | 启动参数 | 定位 | 硬件 |
|---|---|---|---|
| Stable Audio 3 Small-Music | small-music | 轻量音乐专用 | CPU 可跑 |
| Stable Audio 3 Small-SFX | small-sfx | 轻量音效专用 | CPU 可跑 |
| Stable Audio 3 Medium | medium | 高质量通用模型 | 需要 CUDA GPU |
项目 README 中说明,small-music 是 music-only,small-sfx 是 sound effects-only,二者都是 433M 参数、最长 120 秒;medium 是 1.4B 参数、最长 380 秒,需要 CUDA GPU。
实际用于游戏音效时,推荐:
small-sfx:普通射击、命中、拾取、UI、短爆炸medium:主动技能、Boss 爆炸、角色登场、复杂能量音效small-music:主菜单 BGM、关卡 BGM、Boss BGM2. 准备环境
需要提前安装:
GitPython 3.10+uvNVIDIA 显卡驱动CUDA Toolkit 12.6Hugging Face 账号FFmpeg,可选但推荐确认 CUDA Toolkit:
nvcc -V输出类似:
Cuda compilation tools, release 12.6, V12.6.77注意:nvcc -V 只能证明系统安装了 CUDA Toolkit,不代表当前 Python 虚拟环境里的 PyTorch 是 CUDA 版。真正要看的是:
.\.venv\Scripts\python.exe -c "import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available())"3. 安装 uv
PowerShell 安装:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"安装完成后,如果提示需要添加 PATH,可以在当前 PowerShell 执行:
$env:Path = "C:\Users\你的用户名\.local\bin;$env:Path"检查:
uv --versionuvx --version4. 克隆 Stable Audio 3
示例目录:
cd E:\Dev\Environments\StableAudio3
git clone https://github.com/Stability-AI/stable-audio-3.git
cd .\stable-audio-35. 安装项目依赖
安装基础依赖和 UI 依赖:
uv sync --extra ui --link-mode=copy--link-mode=copy 用于避免 uv 在跨盘缓存时出现 hardlink warning。
如果提示:
Failed to hardlink files; falling back to full copy.这不是错误,只是 uv 想用硬链接加速,但缓存目录和虚拟环境可能不在同一个磁盘,自动退回复制模式。
6. Hugging Face 模型授权
需要分别授权不同模型。授权
更正:实际使用发现授权的是仓库,其包含的模型一次授权都可以下载使用。medium 不等于授权 small-sfx。
打开并登录 Hugging Face:
https://huggingface.co/stabilityai/stable-audio-3-mediumhttps://huggingface.co/stabilityai/stable-audio-3-small-sfx分别点击同意协议 / 申请访问。
然后登录 Hugging Face CLI:
uvx hf auth login --forceuvx hf auth whoami测试权限:
uvx hf download stabilityai/stable-audio-3-medium model_config.jsonuvx hf download stabilityai/stable-audio-3-small-sfx model_config.json如果出现 403:
Cannot access gated repoAccess to model ... is restricted通常是:
1. 当前模型没有单独授权2. 网页授权账号和 CLI 登录账号不是同一个3. 授权还没生效7. Windows 下 uv + CUDA 的关键坑
Stable Audio 3 的 pyproject.toml 里依赖了:
torch==2.7.1torchaudio==2.7.1它也配置了 CUDA 12.6 的 PyTorch 源:
[[tool.uv.index]]name = "pytorch-cu126"url = "https://download.pytorch.org/whl/cu126"explicit = true但是关键问题是:它只给 Linux x86_64 配置了 CUDA 源 marker:
torch = [ { index = "pytorch-cu126", marker = "sys_platform == 'linux' and platform_machine == 'x86_64'" }]torchaudio = [ { index = "pytorch-cu126", marker = "sys_platform == 'linux' and platform_machine == 'x86_64'" }]因此在 Windows 下直接 uv sync,很容易装成:
torch: 2.7.1+cpucuda build: Nonecuda available: False解决方法是:手动给 .venv 安装 CUDA 版 PyTorch。
8. 给 .venv 补 pip
uv 创建的虚拟环境可能没有 pip。
如果执行:
.\.venv\Scripts\python.exe -m pip提示:
No module named pip则执行:
.\.venv\Scripts\python.exe -m ensurepip --upgrade检查:
.\.venv\Scripts\python.exe -m pip --version9. 手动安装 CUDA 12.6 版 PyTorch
进入项目根目录:
cd E:\Dev\Environments\StableAudio3\stable-audio-3卸载 CPU 版:
.\.venv\Scripts\python.exe -m pip uninstall -y torch torchaudio torchvision安装 CUDA 12.6 版:
.\.venv\Scripts\python.exe -m pip install --no-cache-dir ` torch==2.7.1 ` torchaudio==2.7.1 ` --index-url https://download.pytorch.org/whl/cu126检查 CUDA 是否可用:
.\.venv\Scripts\python.exe -c "import torch; print('torch:', torch.__version__); print('cuda build:', torch.version.cuda); print('cuda available:', torch.cuda.is_available()); print('gpu:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'NO CUDA')"正确结果类似:
torch: 2.7.1+cu126cuda build: 12.6cuda available: Truegpu: NVIDIA GeForce RTX 4060 Laptop GPU10. 避免 uv 把 Torch 覆盖回 CPU 版
之后不要随便执行:
uv syncuv run python run_gradio.py ...因为它可能触发同步,把 CUDA 版 PyTorch 覆盖回 CPU 版。
推荐直接使用:
.\.venv\Scripts\python.exe ...如果必须同步依赖,使用:
uv sync --extra ui --no-install-package torch --no-install-package torchaudio --link-mode=copy11. Gradio 输出音频 0<00>00> / 无法下载问题
曾遇到现象:
频谱图正常显示音频播放器显示 0:00 / 0:00无法下载音频这通常说明模型已经生成出了音频数据,但 Gradio 前端没有正确拿到可播放 / 可下载的音频文件。
可能原因包括:
1. 文件命名过长2. 文件名中包含特殊字符3. verbose 命名把 prompt 拼进文件名,导致路径异常4. Gradio 对相对路径解析异常5. 输出文件被异步删除建议按下面顺序排查。
11.1 先尝试修改 UI 输出参数
先不要急着改代码。
在 Gradio 页面中展开:
Output params将输出参数改为:
File format:wavFile naming:output.wavCut to seconds total:勾选然后重新生成一次。
如果此时音频播放器可以正常显示时长,并且可以下载,说明问题大概率和 verbose 文件名有关。
推荐后续生成素材时先使用:
File naming:output.wav然后手动重命名保存,例如:
player_shoot_01.wavenemy_hit_01.wavpowerup_activate_01.wav11.2 如果仍然 0<00>00> / 无法下载,再执行代码修复
如果改成 output.wav 后依旧失败,再修改 Gradio 输出逻辑。
进入项目根目录:
cd E:\Dev\Environments\StableAudio3\stable-audio-3执行:
$path = ".\stable_audio_3\interface\diffusion_cond.py"
$content = Get-Content $path -Raw
$content = $content -replace `'delete_files_async\(\[output_wav, output_filename\], 30\)', `'# delete_files_async([output_wav, output_filename], 30)'
$content = $content -replace `'return \(output_filename, \[audio_spectrogram, \*preview_images\]\)', `'return (os.path.abspath(output_filename), [audio_spectrogram, *preview_images])'
Set-Content $path $content -Encoding UTF8这段修复做了两件事:
1. 禁止 30 秒后自动删除生成音频2. 返回绝对路径给 Gradio,避免相对路径解析问题修改完成后重新启动 UI。
11.3 检查生成文件是否正常落盘
生成完成后,在项目根目录执行:
dir *.wav | Sort-Object LastWriteTime -Descending | Select-Object -First 5 Name,Length,LastWriteTime如果能看到类似:
output.wav 176444 ...说明文件已经正常生成。
也可以直接用系统播放器测试:
start .\output.wav如果系统播放器能播放,但 Gradio 仍然显示 0<00>00>,说明更偏向 Gradio 前端路径 / 缓存问题,可以刷新网页或重启 Gradio。
12. 关闭 Gradio 公网分享链接,可选
官方 run_gradio.py 默认:
interface.launch( share=True, ...)如果只在本地使用,建议改为:
(Get-Content .\run_gradio.py) -replace 'share=True,', 'share=False,' | Set-Content .\run_gradio.py这样只开放本地地址:
http://127.0.0.1:7860值得一提的是该脚本和上面的无法下载问题是项目级设置,只要你还是通过这个仓库自带的
run_gradio.py+create_diffusion_cond_ui启动界面,那么切换medium、small-sfx,甚至small-music,都会一起生效
13. Triton / Flash Attention 警告说明
Windows 原生环境可能出现:
No module named 'flash_attn'flash_attn not installedNo module named 'triton'torch._inductor.exc.InductorError如果最后进度条能正常完成:
100%|████████| 8/8并且能生成音频,则可以先忽略。
为了减少 TorchDynamo / Inductor 编译相关刷屏,可以在启动前设置:
$env:TORCHDYNAMO_DISABLE = "1"这会关闭部分编译优化尝试,日志更干净,Windows 下更稳。
14. Medium 启动脚本
文件名:
start_medium.ps1内容:
cd E:\Dev\Environments\StableAudio3\stable-audio-3
$env:TORCHDYNAMO_DISABLE = "1"
.\.venv\Scripts\python.exe run_gradio.py --model medium --title "Chengyu SFX Forge - Medium"运行:
powershell -ExecutionPolicy Bypass -File .\start_medium.ps115. Small-SFX 启动脚本
文件名:
start_small_sfx.ps1内容:
cd E:\Dev\Environments\StableAudio3\stable-audio-3
$env:TORCHDYNAMO_DISABLE = "1"
.\.venv\Scripts\python.exe run_gradio.py --model small-sfx --title "Chengyu SFX Forge - Small SFX"运行:
powershell -ExecutionPolicy Bypass -File .\start_small_sfx.ps116. 为什么用 ps1,不用 bat
在 Windows 下,本项目更推荐用 .ps1,原因是:
1. 可以稳定设置环境变量,例如 TORCHDYNAMO_DISABLE2. 可以直接调用 .venv\Scripts\python.exe3. 避免 bat / cmd 下路径、引号、虚拟环境切换不稳定4. 避免 uv run 自动同步导致 torch 被换回 CPU 版重点不是激活虚拟环境,而是直接指定当前项目的 Python:
.\.venv\Scripts\python.exe run_gradio.py --model medium这样比:
uv run python run_gradio.py --model medium更稳。
17. 推荐对比测试参数
为了公平对比 medium 和 small-sfx,建议用同一条 prompt、同一个 seed、同样秒数、同样 steps。
Prompt 示例:
Short blue-white energy bullet firing sound effect, bright plasma zap with a tiny crystalline click, clean arcade vertical shooter style, light and energetic, suitable for rapid repeated shots, no music, no voice, no ambience, very short tail, single game sound effect only.推荐参数:
Seconds total: 1Steps: 8Seed: 233File format: wavFile naming: output.wavCut to seconds total: 勾选对比重点:
small-sfx:是否更短、更干净、更像游戏音效medium:是否质感更丰富、空间感更强、细节更多18. 推荐文件命名规范
assets/audio/sfx/player_shoot_01.wavassets/audio/sfx/player_shoot_02.wavassets/audio/sfx/enemy_hit_01.wavassets/audio/sfx/enemy_explode_small_01.wavassets/audio/sfx/powerup_activate_01.wavassets/audio/sfx/energy_recharge_01.wavassets/audio/sfx/shield_absorb_01.wav先生成 wav 原始文件,再后处理为 ogg:
ffmpeg -i input.wav ` -af "silenceremove=start_periods=1:start_threshold=-45dB:stop_periods=1:stop_threshold=-45dB,loudnorm" ` -ar 44100 ` -ac 2 ` -c:a libvorbis ` -q:a 5 ` output.ogg19. 最终成功标志
CUDA 检查:
torch: 2.7.1+cu126cuda build: 12.6cuda available: Truegpu: NVIDIA GeForce RTX 4060 Laptop GPUUI 启动:
Running on local URL: http://127.0.0.1:7860生成完成:
100%|████████| 8/8音频播放器不再显示 0<00>00> / 0<00>00>,并且可以下载 wav 文件。
20. 音频输出目录与时间命名,可选增强项
默认情况下,Stable Audio 3 的 Gradio UI 会根据 File naming 规则生成输出文件名。
如果使用 verbose,文件名会包含 prompt、cfg、seed 等信息,容易出现:
文件名过长文件名包含特殊字符Windows 路径兼容性问题Gradio 播放器显示 0:00 / 0:00音频无法下载因此,建议将输出逻辑改为:
指定统一输出文件夹按照当前时间自动命名按模型区分输出目录避免 prompt 参与文件名推荐输出结构:
outputs/ medium/ medium_20260622_143512_038.wav medium_20260622_143620_417.wav
small-sfx/ small-sfx_20260622_144002_159.wav small-sfx_20260622_144121_883.wav文件名格式:
模型名_年月日_时分秒_毫秒.wav这样可以避免文件覆盖,也方便对比不同模型生成结果。
21. 修改输出目录与时间命名
1. 先备份原文件:
cd E:\Dev\Environments\StableAudio3\stable-audio-3
Copy-Item .\stable_audio_3\interface\diffusion_cond.py .\stable_audio_3\interface\diffusion_cond.py.bak2. 修改 diffusion_cond.py:
打开:
stable_audio_3/interface/diffusion_cond.py找到:
if file_format: filename_extension = file_format.split(" ")[0].lower() else: filename_extension = "wav" output_filename = "%s.%s" % (basename, filename_extension) output_wav = "%s.wav" % basename替换为:
if file_format: filename_extension = file_format.split(" ")[0].lower() else: filename_extension = "wav"
output_dir = os.path.abspath(os.environ.get("SA3_OUTPUT_DIR", "outputs")) os.makedirs(output_dir, exist_ok=True)
timestamp = time.strftime("%Y%m%d_%H%M%S") millis = int((time.time() % 1) * 1000)
output_prefix = os.environ.get("SA3_OUTPUT_PREFIX", "").strip() if output_prefix: basename = f"{output_prefix}_{timestamp}_{millis:03d}" else: basename = f"{timestamp}_{millis:03d}"
output_filename = os.path.join(output_dir, "%s.%s" % (basename, filename_extension)) output_wav = os.path.join(output_dir, "%s.wav" % basename)这个文件顶部已经有:
import os, time, math所以不需要额外添加 import os 或 import time。
3. 确认不要自动删除文件
如果之前还没改过,找到:
delete_files_async([output_wav, output_filename], 30)注释掉:
# delete_files_async([output_wav, output_filename], 30)否则生成的音频还是可能 30 秒后被删掉。官方这里确实是异步删除输出文件。
4. 确认返回绝对路径
找到:
return (output_filename, [audio_spectrogram, *preview_images])建议改成:
return (os.path.abspath(output_filename), [audio_spectrogram, *preview_images])虽然我们前面已经让 output_filename 是绝对路径了,但这里再确认一下更稳。
22. 更新后的 Medium 启动脚本
文件名:
start_medium.ps1内容:
cd E:\Dev\Environments\StableAudio3\stable-audio-3
$env:TORCHDYNAMO_DISABLE = "1"$env:SA3_OUTPUT_DIR = "E:\Dev\Environments\StableAudio3\stable-audio-3\outputs\medium"$env:SA3_OUTPUT_PREFIX = "medium"
.\.venv\Scripts\python.exe run_gradio.py --model medium --title "Chengyu SFX Forge - Medium"运行:
powershell -ExecutionPolicy Bypass -File .\start_medium.ps123. 更新后的 Small-SFX 启动脚本
文件名:
start_small_sfx.ps1内容:
cd E:\Dev\Environments\StableAudio3\stable-audio-3
$env:TORCHDYNAMO_DISABLE = "1"$env:SA3_OUTPUT_DIR = "E:\Dev\Environments\StableAudio3\stable-audio-3\outputs\small-sfx"$env:SA3_OUTPUT_PREFIX = "small-sfx"
.\.venv\Scripts\python.exe run_gradio.py --model small-sfx --title "Chengyu SFX Forge - Small SFX"运行:
powershell -ExecutionPolicy Bypass -File .\start_small_sfx.ps124. 关于这些修改的通用性
以下修改属于当前 stable-audio-3 项目的 Gradio UI 通用修改:
关闭 Gradio 公网分享链接修复输出音频 0:00 / 无法下载指定输出目录按当前时间自动命名按模型设置输出前缀只要仍然通过:
run_gradio.py启动,并使用项目自带的 Gradio UI,那么这些修改对以下模型都生效:
mediumsmall-sfxsmall-music需要注意:
1. 如果重新 git pull、重新 clone 或覆盖源码,这些手动修改可能会丢失2. 如果改用其他启动脚本或其他 UI,不一定会继承这些修改3. 如果使用 uv sync,仍然要注意 Windows 下 torch 被覆盖回 CPU 版的问题推荐长期使用 .ps1 启动脚本,并直接调用:
.\.venv\Scripts\python.exe run_gradio.py不要优先使用:
uv run python run_gradio.py这样可以避免 uv 自动同步环境,把 CUDA 版 PyTorch 覆盖回 CPU 版。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

















