Skip to content
This repository was archived by the owner on Jul 17, 2026. It is now read-only.

尝试支持类似Apple Music的AutoMix[Beta] - #888

Merged
kazukokawagawa merged 126 commits into
SPlayer-Dev:devfrom
kazukokawagawa:dev-mix
Feb 18, 2026
Merged

kazukokawagawa merged 126 commits into
SPlayer-Dev:devfrom
kazukokawagawa:dev-mix

Conversation

@kazukokawagawa

@kazukokawagawa kazukokawagawa commented Feb 14, 2026 •

Copy link
Copy Markdown
Collaborator

现在已经处于可用状态了,打上了beta标签和开启告示
仍然需要精确拍数和更精准的计算,但是现在已经可用了,效果没啥问题
有歌曲出问题一般也不会太离谱,至少我还没遇到

可以看着合并了

- 添加音频分析模块,使用 Symphonia 库检测音频淡入淡出点
- 实现交叉淡入淡出播放功能,支持自动混音过渡
- 新增设置选项:启用自动混音和过渡时间配置
- 优化音频上下文管理,使用共享 AudioContext 避免资源浪费
- 在播放控制器中添加自动混音逻辑,歌曲结束前自动触发下一首过渡
- 在 native/tools 包中添加 index.d.ts 类型定义文件,导出 analyzeAudioFile 函数及 AudioAnalysis 接口
- 将主进程中对原生模块的导入从相对路径改为使用包名 "tools"
- 在 package.json 中通过本地链接添加 tools 依赖,确保 TypeScript 能正确解析类型
- 简化音频分析函数的实现,移除未使用的代码以提升可维护性
添加原生模块加载检查,当 tools.node 模块未成功加载时抛出明确错误
添加启用自动混音开关及其过渡时间设置项,用于控制音频播放时的自动混音行为。
- 扩展音频分析接口,新增 BPM 置信度、首拍位置和响度等字段
- 为本地歌曲添加预分析机制,支持 Automix 功能开关
- 实现分析结果缓存,避免重复分析相同文件
- 在播放控制器中集成智能切入切出与 BPM 对齐逻辑
- 优化原生分析模块,使用包络检测替代原始样本处理以提升性能
- 将 TypeScript 接口中的 snake_case 属性名改为 camelCase,以保持项目命名一致性
- 清理 Rust 分析代码中未使用的导入
- 重构静音检测函数,使用更简洁的条件赋值逻辑
- 在音频分析中新增人声检测与智能切点(cut_in_pos/cut_out_pos)计算
- 为播放引擎添加淡入淡出曲线选项(线性、指数、等功率)
- 扩展音频分析缓存机制,支持版本与最大分析时间参数
- 重构自动混音播放逻辑,分离 UI 状态设置与音频播放
- 改进交叉淡入淡出切换流程,支持延迟 UI 切换以避免卡顿
- 在设置界面添加自动混音最大分析时间配置项
- 在 PlayerController 中创建安全的音频源对象,确保 url 不为空并提供默认值
- 修复音频分析中尾部跳转逻辑,使用已提取的 n_frames 变量计算总时长
- 移除未使用的闭包和内联注释,简化音频分析的窗口处理逻辑
- 将播放状态更新中的 quality 和 source 强制转换为正确的类型
- 移除硬切逻辑,改为基于 BPM 匹配的平滑过渡
- 新增下一曲预分析缓存,提前获取分析数据
- 智能计算交叉淡化时长、起始点和播放速率
- 删除不再使用的自动混音过渡时间设置项
- 更新分析版本至 3 以保持前后端同步
在BPM匹配的自动混音场景中,根据下一首歌曲的第一个强拍位置计算UI切换延迟,使界面切换与音乐节拍对齐。如果未找到合适的节拍点,则默认使用交叉淡化时长的50%作为延迟。同时添加了混音开始时的用户提示信息。
- 在音频分析结果中新增 `loudness` (LUFS) 和 `drop_pos` 字段
- 实现 ITU-R BS.1770 K-weighting 响度计,提供专业响度测量
- 为 AutoMIX 功能添加高通和低通滤波器,支持切入/切出时的低频过滤
- 在音频处理管线中串联专用滤波器,实现平滑的频率渐变效果
- 新增 bassSwap 混音类型,在BPM匹配时自动启用,通过高通滤波器实现低频切换
- 添加响度匹配功能,根据歌曲LUFS值自动计算增益,限制在±9dB范围内
- 支持Drop点对齐,智能调整混音起始位置以优化过渡效果
- 扩展AudioAnalysis接口,新增dropPos字段用于识别歌曲高潮位置
- 改进ReplayGain应用逻辑,支持在混音时传递增益值
将 TypeScript 接口和 Rust 结构体的字段名从驼峰式改为蛇形命名,以保持跨语言命名一致性。
为 Rust 结构体字段添加 `napi(js_name)` 属性,确保与 JavaScript 端的映射正确。
- 在 BaseAudioPlayer 中为渐变操作添加安全延迟,避免音频上下文队列过载
- 音频分析新增 vocal_last_in_pos 字段,用于检测最后一段人声起始位置
- 智能混音算法优化:优先对齐下一首的人声进入点或 Drop 点,并支持小节对齐
- 触发时间计算改进:基于最后人声段提前触发,并确保在小节第一拍对齐
在 analyze_audio_file 函数返回的 AudioAnalysis 结构中新增 vocal_last_in_pos 字段,以记录人声最后进入的时间位置,提供更完整的音频分析信息。
- 优化 Automix 混音触发逻辑,优先使用 cut_in_pos 跳过前奏
- 放宽 BPM 匹配误差范围至 20% 以提高匹配成功率
- 添加主音量字段用于跨引擎音量同步
- 修复高音滤波器参数格式化问题
- 统一代码缩进和换行格式,移除多余空行
添加 vocal_last_in_pos 字段至 AudioAnalysis 接口,以支持记录人声最后一次进入的位置,扩展音频分析功能。
@kazukokawagawa kazukokawagawa self-assigned this Feb 14, 2026
@kazukokawagawa kazukokawagawa added 高优先级 P0 这个问题将被高优先级处理 正在处理 labels Feb 14, 2026
@gemini-code-assist

This comment was marked as outdated.

gemini-code-assist[bot]

This comment was marked as outdated.

kazukokawagawa and others added 8 commits February 15, 2026 10:27
- 重构 Rust 分析模块,优先使用 first_beat_pos 作为 cut_in_pos
- 新增 cut_out_pos 计算逻辑,结合人声结束点、小节吸附与能量边界
- 前端 AutoMix 同时消费 cut_in_pos 和 cut_out_pos,并根据能量差调整过渡时长
- 修复分析缓存版本不一致问题,确保缓存命中
- 使用条件表达式直接赋值替代可变变量与条件块
- 移除冗余的变量声明与重复的默认值设置
- 保持原有逻辑不变,仅改进代码结构与可读性
防止将 .trae 目录下的文件提交到版本控制。
- 重构 Rust 分析模块,增强 `snap_to_bar` 函数支持三种吸附模式,改进尾奏能量计算和智能切入/切出点逻辑
- 在 TypeScript 播放控制器中引入高频检测循环,实现更精确的自动混音触发时机计算
- 优化 BPM 匹配范围,收紧至 +/-6%,并改进能量流调整和过渡时长计算
移除 AudioElementPlayer 中的独立 ReplayGain 节点,在 BaseAudioPlayer 中统一处理增益。
这简化了子类实现,并确保所有播放器类型的音量控制(包括 ReplayGain)行为一致。
- 将音频分析缓存版本从5升级到6,以同步Rust端的算法更新
- 在Rust分析中增加切出点缓冲至8拍,确保人声结束后展示足够器乐段
- 为无BPM检测情况添加后备切出逻辑(倒数15秒)
- 在PlayerController中新增智能过渡时长计算方法,基于BPM、可用空间和能量差异动态调整
- 优先使用Rust计算的智能切出点作为混音锚点
- 在BassSwap混音类型中应用智能过渡时长计算,替代固定的32拍过渡
调整快速混合策略的名称为“Rapid Bass Swap (2 Bars)”,并更新其过滤策略为“Bass Swap / LPF”。
为激进混合策略增加2小节候选时长,并调整逻辑使4小节使用“Quick Fade”,而更长(及2小节)的混合使用“Bass Swap / LPF”。
添加关于在线歌曲限制的说明,明确当前仅支持本地分析,在线歌曲使用固定8秒过渡。
- 使用 Prettier 统一格式化多个 TypeScript 文件,包括换行、缩进和引号
- 修复 package.json 文件末尾缺少换行符的问题
- 统一音频分析 worker 和 IPC 处理中的代码格式
- 规范自动化混音和音频管理器中的代码结构
- 调整元组和函数参数的多行格式,保持一致的缩进
- 拆分过长的表达式以提高可读性
- 统一代码风格,不改变任何逻辑行为
@kazukokawagawa
kazukokawagawa marked this pull request as ready for review February 15, 2026 14:50
@kazukokawagawa
kazukokawagawa requested a review from imsyy February 15, 2026 14:51
kazukokawagawa and others added 18 commits February 16, 2026 11:55
- 新增 peekPrefetch、getMusicCachePath 和 ensureMusicCachePath 方法,支持音乐文件缓存管理
- 增强音频分析功能,支持自定义分析时长并通过文件路径或 URL 进行识别
- 添加 currentAudioSource 和 currentAnalysisKey 状态跟踪,提高分析准确性
- 新增 ensureAutomixAnalysisReady 方法,提前预加载当前和下一首歌曲的音频分析
- 增加 nextAnalysisSongId 和 ensureAutomixAnalysisKey 等状态字段,支持基于歌曲ID的缓存管理
- 改进分析路径获取逻辑,优先使用缓存路径,支持网络资源的本地缓存分析
- 在播放状态更新时触发预加载,减少混音切换时的分析延迟
- 在 AudioElementPlayer 中移除 ts-ignore,使用类型断言确保类型安全
- 在 AudioManager 中清理未使用的变量以消除冗余代码
在自动混音切换时,强制对在线音频源进行缓存以确保无缝过渡。同时防止歌曲结束时因过渡状态而重复触发结束事件。
添加 currentAnalysisKind 和 nextAnalysisKind 字段以精确跟踪分析类型(none/head/full)。
修复 ensureAutomixAnalysis 中仅检查 currentAnalysis 存在性而未检查其完整性的逻辑错误。
在 prepareAudioSource 中新增 analysis 选项以支持按需进行头部或完整分析,避免不必要的分析开销。
在 crossfade 场景下使用头部分析以提升性能,并确保分析状态在歌曲切换时正确同步。
统一使用两个空格进行缩进,并调整对象参数的多行格式以提升代码可读性。
将 AutomationPoint 接口从 PlayerController 移至 IPlaybackEngine 以统一类型定义
修复多个文件的代码格式问题,包括缩进和换行
将冗长的match语句替换为预定义的映射数组,提高代码可读性和维护性。
将重复的音频帧处理逻辑重构为通用的 process_decoded_frames 函数,减少代码重复。
引入 WindowState 和 TempBuffers 结构体来管理处理状态,提高代码可读性和可维护性。
重构后支持所有音频格式的统一处理,并修复了时间计算逻辑。
- 重构复杂的过渡计划生成方法,拆分为更清晰的策略分支
- 提取 snapToBeat、createAutomixPlan 和 applyAggressiveOutro 辅助方法
- 简化退出点计算逻辑,移除冗余的边界检查和条件分支
- 保持原有超激进尾奏快切功能,但将其封装为独立方法
将硬编码的策略条件提取为策略数组,使用循环统一匹配逻辑,提高可维护性和可读性。
重构 TrackAnalyzer 的 process_sample 方法为静态方法 process_sample_static,通过传入 loudness_meter 和 head_pcm 的引用,解决了在 process_segment 方法中同时借用 self 多个可变部分导致的编译错误。同时简化了 detect_key 函数的返回值逻辑,移除冗余的 Some 包装。
- 仅在完整分析数据可信时才使用分析中的退出点
- 当淡出点早于人声结束点时,回退到文件末尾
- 增加切出点的有效性检查,防止无效分析数据影响退出点
- 优化警告日志,统一使用可信任的变量
在单曲循环模式下,当 Automix 未触发过渡时,确保下一首歌曲正确指向当前歌曲而非索引越界。同时增加播放列表为空时的保护检查。
优化警告信息,移除关于在线歌曲固定过渡时长的说明,并调整对效果差异的描述以更准确反映当前实现。
@kazukokawagawa
kazukokawagawa marked this pull request as draft February 18, 2026 11:02
确保自动混音特效状态在歌��切换和混音结束时都能被正确清理,避免特效残留。通过引入新的状态变量和统一清理逻辑,替换原有的依赖歌曲ID变化的监听,使特效关闭行为更可靠。
@kazukokawagawa
kazukokawagawa marked this pull request as ready for review February 18, 2026 12:54
@kazukokawagawa
kazukokawagawa merged commit 238c15f into SPlayer-Dev:dev Feb 18, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

正在处理 重要 重要信息 需要帮助 需要特别关注 高优先级 P0 这个问题将被高优先级处理

4 participants