Skip to content

尝试支持类似Apple Music的AutoMix[半成品]#887

Closed
kazukokawagawa wants to merge 17 commits intoimsyy:devfrom
kazukokawagawa:dev-mix
Closed

尝试支持类似Apple Music的AutoMix[半成品]#887
kazukokawagawa wants to merge 17 commits intoimsyy:devfrom
kazukokawagawa:dev-mix

Conversation

@kazukokawagawa
Copy link
Copy Markdown
Collaborator

No description provided.

- 添加音频分析模块,使用 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
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @kazukokawagawa, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

此拉取请求旨在引入一个类似Apple Music的AutoMix功能,以实现歌曲之间更智能、更流畅的过渡体验。通过集成Rust编写的高性能音频分析库,系统现在能够深入分析音频文件的关键特性,如BPM、响度、淡入淡出点和人声区域。这些分析数据被用于驱动播放引擎的增强型交叉淡入淡出逻辑,包括BPM对齐、响度标准化以及基于歌曲结构(如人声开始/结束、能量骤升)的智能过渡触发。此外,还新增了分析结果的本地缓存机制和用户可配置的AutoMix设置,以优化性能和用户体验。

Highlights

  • 引入AutoMix功能: 新增类似Apple Music的AutoMix功能,旨在提供歌曲间的无缝智能过渡。
  • 集成Rust音频分析库: 引入Rust symphonia库,用于执行高效的音频文件分析,包括时长、BPM、响度、淡入/淡出点、人声位置和能量骤升点(Drop)。
  • 音频分析结果缓存: 在本地数据库中新增 audio_analysis 表,用于缓存音频分析结果,避免重复计算,提高效率。
  • 增强音频播放引擎: 扩展 AudioEffectManagerBaseAudioPlayer,支持多种渐变曲线(线性、等功率、指数)和高通/低通滤波器,为AutoMix提供底层混音能力。
  • 实现智能交叉淡入淡出: AudioManager 新增 crossfadeTo 方法,实现了在两首歌曲之间进行平滑的交叉淡入淡出,并处理BPM对齐和响度匹配。
  • PlayerController集成AutoMix逻辑: PlayerController 现在能够预取下一首歌曲的分析数据,并根据分析结果(如人声位置、BPM、能量骤升点)智能决定何时以及如何触发AutoMix过渡。
  • 新增AutoMix设置: 在播放设置中添加了启用/禁用AutoMix的开关,以及配置最大分析时间的选项。
Changelog
  • Cargo.lock
    • 更新了依赖项,新增了 bitflags 的旧版本依赖和 extended 包,并添加了 symphonia 及其相关组件。
  • electron/main/database/LocalMusicDB.ts
    • 添加了 ANALYSIS_SCHEMA 用于定义音频分析结果表。
    • 新增了 getAnalysissaveAnalysis 方法来管理分析数据的存取。
  • electron/main/ipc/ipc-file.ts
    • 引入了原生模块 tools.node 中的 analyzeAudioFile 函数。
    • 注册了 analyze-audio IPC 处理器,实现了音频分析的调用和缓存检查逻辑。
  • electron/main/services/LocalMusicService.ts
    • 为本地音乐服务添加了 getAnalysissaveAnalysis 方法,用于与数据库交互。
  • electron/main/utils/native-loader.ts
    • 更新了 loadNativeModule 函数中的路径解析逻辑,以更好地适配 tools 模块的结构。
  • native/tools/Cargo.toml
    • 添加了 symphonia 库作为依赖,并启用了多种音频格式(mp3, flac, aac, isomp4, alac, vorbis, wav)支持。
  • native/tools/index.d.ts
    • 声明了 analyzeAudioFile 函数及其返回的 AudioAnalysis 接口,包含了音频分析的各项详细数据。
  • native/tools/package.json
    • tools 模块添加了 types 字段,指向 index.d.ts
  • native/tools/src/analysis.rs
    • 新增文件,实现了核心的Rust音频分析逻辑。
    • 包括 AudioAnalysis 结构体定义、高通滤波器 (HighPassFilter)、双二阶滤波器 (BiquadFilter) 和响度计 (LoudnessMeter)。
    • analyze_audio_file 函数负责解码音频、计算RMS包络、高频比、响度(LUFS),并检测淡入/淡出点、BPM、能量骤升点和人声区域。
  • native/tools/src/lib.rs
    • 导出了 analysis 模块,使其可在NAPI中调用。
  • package.json
    • 添加了 tools 作为本地依赖。
  • pnpm-lock.yaml
    • 更新了 pnpm 锁定文件,以反映新的依赖关系和 @electron/node-gyp 的引用方式。
  • src/components/Setting/config/play.ts
    • 在播放设置中新增了“启用自动混音”开关和“最大分析时间”的数字输入框。
  • src/core/audio-player/AudioEffectManager.ts
    • 增加了 highPassFilterlowPassFilter 成员,并在音频效果链中连接了这些滤波器。
    • 新增了 setHighPassFiltersetLowPassFilter 方法来控制这些滤波器。
  • src/core/audio-player/BaseAudioPlayer.ts
    • 修改了 init 方法以使用共享的 AudioContext
    • 更新了 destroy 方法以正确断开所有节点连接。
    • 增强了 playpause 方法的选项,支持 fadeCurve 类型和 keepContextRunning
    • 重构了 applyFadeTo 方法,支持线性、指数和等功率三种渐变曲线。
    • 新增了 setHighPassFiltersetLowPassFilter 的代理方法。
  • src/core/audio-player/IPlaybackEngine.ts
    • 定义了 FadeCurve 类型,并在 PlayOptionsPauseOptions 接口中添加了 fadeCurve 属性。
    • PauseOptions 新增 keepContextRunning
    • IPlaybackEngine 接口新增 setHighPassFiltersetLowPassFilter 方法。
  • src/core/audio-player/SharedAudioContext.ts
    • 新增文件,导出一个单例的 AudioContext 实例,确保所有播放器引擎共享同一个音频上下文。
  • src/core/player/AudioManager.ts
    • 引入了 pendingEnginependingSwitchTimer 来管理交叉淡入淡出期间的引擎切换。
    • 新增了 crossfadeTo 方法,实现了在两个播放引擎之间进行平滑过渡的逻辑,包括MPV引擎的特殊处理、音量预设、ReplayGain应用、低音交换滤波器设置以及过渡完成后的引擎销毁。
  • src/core/player/PlayerController.ts
    • 引入了 AudioAnalysis 接口和相关状态变量。
    • 重构了 applyReplayGain 方法以支持AutoMix增益调整。
    • 新增 prepareAudioSource 方法用于获取音频源和分析数据。
    • 新增 setupSongUI 方法用于统一设置歌曲UI状态。
    • 修改 playSong 方法以支持AutoMix的智能切入点、BPM对齐和交叉淡入淡出。
    • 新增 rampRateTo 方法用于平滑过渡播放速率。
    • timeUpdate 事件中集成了AutoMix的触发逻辑,包括预取下一首歌曲分析、计算交叉淡入淡出时长和触发点。
    • 新增 automixPlay 方法来处理AutoMix的实际播放逻辑,包括响度匹配和UI切换。
    • 新增 getNextSongForAutomix 方法用于获取下一首歌曲。
  • src/core/player/SongManager.ts
    • prefetchNextSong 方法中增加了对本地歌曲的音频分析预处理逻辑,以支持AutoMix。
  • src/stores/setting.ts
    • SettingState 接口和默认状态中添加了 enableAutomixautomixMaxAnalyzeTime 属性。
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Repository owner locked as spam and limited conversation to collaborators Feb 14, 2026
@kazukokawagawa kazukokawagawa added 无效 这似乎不对 过期 and removed 高优先级 P0 这个问题将被高优先级处理 正在处理 labels Feb 15, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

无效 这似乎不对 过期

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant