ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

StemDeck前端变调引擎实现:SoundTouch AudioWorklet、13路输入路由与浏览器Secure Context陷阱

StemDeck前端变调引擎实现:SoundTouch AudioWorklet、13路输入路由与浏览器Secure Context陷阱 StemDeck前端变调引擎实现SoundTouch AudioWorklet、13路输入路由与浏览器Secure Context陷阱【免费下载链接】stemdeckStemdeck is an modern stem extraction platform for musicians,producers and hobbyists, designed to isolate vocals, drums, bass, piano and guitar for practice, transcription, remixing, and creative audio workflows through a modern and interactive interface项目地址: https://gitcode.com/gh_mirrors/st/stemdeckStemDeck 是一款面向乐手与制作人的音轨分离stem extraction平台能把一首歌拆成人声、鼓、贝斯等独立轨道。它的前端变调引擎基于 SoundTouch 算法实现了 AudioWorklet 实时移调±6 个半音、13 路输入路由、单一输出时钟还要绕过浏览器 Secure Context 这道陷阱。本文带你完整看懂这套浏览器变调引擎的设计与实现。一、为什么是一路一个输入而不是一个 worklet 一个参数常规思路是一个 AudioWorklet 节点暴露一个pitch参数想移多少调就填多少。但 StemDeck 支持逐轨独立移调——同一首歌里人声停在原位、吉他升 2 个半音、贝斯降 3 个半音还要全程和鼓点对齐。问题在于WSOLA 类移调的延迟是随移调量变化的。源码里记录了一组实测数据soundtouch-processor.js参数端到端延迟pitch 0tempo 10 ms直通pitch 2tempo 1115 mspitch −5tempo 1144 mspitch 0tempo 0.75437 ms如果每个轨道各跑一条独立链路鼓组会和乐队最多差出 144 ms——直接脱拍。StemDeck 的解法是用连接关系表达移调量worklet 提供 13 路输入第 k 路输入固定对应k − 6个半音。轨道想升 2 个半音不是改参数而是把它的总线接到第 8 路上。所有链路最后汇入同一个 tempo 阶段、同一个输出时钟无论多少种调式同时播放对齐永远成立。13 路输入 ├─ 输入 0 → 移调 −6 半音 ├─ 输入 1 → 移调 −5 半音 ├─ ... ├─ 输入 6 → 半音 0鼓组、节拍器、原调轨道普通延迟线 ├─ ... └─ 输入 12 → 移调 6 半音 ↓ 共享 tempo 阶段 → 单一输出这个映射在 pitchBus.js 中定义主线程引擎和 worklet 共用同一份常量避免两边各写一份然后漂移export const PITCH_MIN -6; export const PITCH_MAX 6; export const INPUT_COUNT PITCH_MAX - PITCH_MIN 1; // 13 export const ZERO_INPUT -PITCH_MIN; // 6范围定在 ±6 也有讲究超过 ±5 半音音质明显劣化与其提供一个听起来破掉的八度不如在控制面板上就停住soundtouch-processor.js。二、鼓组永不移调但必须跟乐队一起变速一个反直觉的细节鼓永远不移调。用重采样把军鼓抬一个调它不会变成另一个调的鼓只会变成另一种鼓pitchBus.js。所以鼓组固定走第 6 路半音 0 的普通延迟线。但鼓不能跳过时间伸缩tempo 0.75× 时鼓组必须跟着乐队一起变慢。这正是单一共享 tempo 阶段设计的关键收益音乐WSOLA(1/r) → 重采样(r) → 共享 WSOLA(s)鼓等倍率直通 → 共享 WSOLA(s)两条链路的时长在构造上就相同都是1/s只有音乐被乘了移调比 rsoundtouch-processor.js。节拍器点击也接在同样的未移调总线上与鼓样本在同一帧进入音频图共用同一个 tempo 阶段metronome.js。三、13 路总线如何接线懒加载与优雅降级主线程侧为每一路输入建一个 Gain 总线然后按numberOfInputs: 13创建 worklet 节点audioEngine.jsconst buses Array.from({ length: INPUT_COUNT }, () ctx.createGain()); // ... stNode new AudioWorkletNode(ctx, soundtouch-processor, { numberOfInputs: INPUT_COUNT, numberOfOutputs: 1, outputChannelCount: [2], });轨道换调时走routeTrack()算出目标总线播放中则先做 6 ms 淡出、保持 20 ms、再淡入两条总线延迟相同听起来是一次短促的音量下探而不是两个调式硬拼接的咔哒声audioEngine.js。工程细节上还有几个值得学的设计懒建链/留尾释放worklet 里只有当某路输入真正接上信号时才创建对应的 PitchChain轨道离开后多保留 256 个 block约几百毫秒把乐句尾巴放完才释放避免掐头去尾soundtouch-processor.js。静音预充每条链路启动时先喂一段静音让它表现得像从播放一开始就在运行。这样轨道中途换调旧链路的尾巴和新链路能无缝衔接也不会卡住其他轨道 130 mssoundtouch-processor.js。抗混叠只在上移时生效只有升调是抽取decimationNyquist 以上会折叠回可听频段形成金属渣感所以链路在重采样前挂了一组 8 阶 Butterworth 级联低通降调是内插无需滤波soundtouch-processor.js。直通旁路没有任何移调也没有变速时worklet 逐样本原样回传零额外延迟soundtouch-processor.js。延迟自报worklet 算好内部缓冲深度后主动postMessage给主线程用于摆放播放头——常量只维护一份soundtouch-processor.js。磁带式兜底worklet 加载失败时总线直连 master改用playbackRate重采样——变速可用但会连音高一起变功能降级而不是罢工audioEngine.js。数值一致性还有单测兜底测试会直接解析 worklet 源码断言其 ±6 半音范围和主线程pitchBus.js里的常量严格相等pitch-shift.test.mjs端到端行为由 transpose.spec.mjs 覆盖。四、Secure Context 陷阱为什么手机上移调按钮是死的这是最容易踩的坑。StemDeck 常以局域网服务方式运行电脑上起服务手机/平板通过http://192.168.x.x打开。但AudioWorklet 是 Secure Context API——浏览器对http://局域网IP一律不开放于是 SoundTouch 阶段整个建不起来移调功能直接不可用。更隐蔽的是误导性的报错。早期 UI 只显示需要 Web Audio可 Web Audio 明明工作正常真正的问题出在源origin不安全上pitchBus.js。现在的做法是区分两种失败export function pitchBlockedKey() { return window.isSecureContext false ? pitch.insecureOrigin // 通过网络连接时无法使用移调 : pitch.unavailable; // 真正的 worklet 故障 }多语言文案在 i18n.js通过网络连接时无法使用移调。而项目给出的正解在 tls_listener.py桌面版同时跑两个 uvicorn 监听器——http 回环口给自家 webview 用。http://127.0.0.1按浏览器规则本身就是安全上下文而且自签名证书会在 Tauri 窗口里弹出无法点击的证书拦截页只能走 http。https 局域网口给手机用。只有 TLS 能让192.168.x.x这个源变成 secure contextAudioWorklet 才肯开放。两个监听器共享同一个 FastAPI 应用对象、同一个队列只是入口协议不同——一个 registry 服务两种受众是这个模块最聪明的地方。五、小结StemDeck 的变调引擎给了三个可以迁移到自己项目里的经验用拓扑代替参数当处理延迟依赖参数时接到哪个输入比填哪个数值更利于多路对齐单一时钟是底线多路音频只要延迟不一致就脱拍共享末端 tempo 阶段 对齐垫音alignment pad是保证先想清楚源的安全性AudioWorklet 在局域网 http 下不可用是浏览器规则而非 bug要么上 TLS要么提供诚实的降级提示isSecureContext检查 精确文案。想继续深挖可以从 soundtouch-processor.jsWSOLA 核心与 audioEngine.js总线接线与时钟映射两个文件入手。【免费下载链接】stemdeckStemdeck is an modern stem extraction platform for musicians,producers and hobbyists, designed to isolate vocals, drums, bass, piano and guitar for practice, transcription, remixing, and creative audio workflows through a modern and interactive interface项目地址: https://gitcode.com/gh_mirrors/st/stemdeck创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表