update version to 1.0.40.0 and refactor image drawing methods for better opacity handling

This commit is contained in:
Zhe Fang
2025-08-02 09:15:28 -04:00
parent 010040b376
commit b1978fec09
10 changed files with 384 additions and 76 deletions

View File

@@ -12,7 +12,7 @@
<Identity <Identity
Name="37412.BetterLyrics" Name="37412.BetterLyrics"
Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9" Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9"
Version="1.0.39.0" /> Version="1.0.40.0" />
<mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/> <mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

View File

@@ -96,7 +96,7 @@ namespace BetterLyrics.WinUI3.ViewModels
} }
} }
private void DrawBackgroundImgae(ICanvasAnimatedControl control, CanvasDrawingSession ds, CanvasBitmap canvasBitmap, float opacity) private void DrawBackgroundImgae(OpacityEffect effect, CanvasDrawingSession ds, CanvasBitmap canvasBitmap)
{ {
float imageWidth = (float)canvasBitmap.Size.Width; float imageWidth = (float)canvasBitmap.Size.Width;
float imageHeight = (float)canvasBitmap.Size.Height; float imageHeight = (float)canvasBitmap.Size.Height;
@@ -107,62 +107,12 @@ namespace BetterLyrics.WinUI3.ViewModels
float x = _canvasWidth / 2 - imageWidth * scaleFactor / 2; float x = _canvasWidth / 2 - imageWidth * scaleFactor / 2;
float y = _canvasHeight / 2 - imageHeight * scaleFactor / 2; float y = _canvasHeight / 2 - imageHeight * scaleFactor / 2;
// Original source: https://zhuanlan.zhihu.com/p/37178216 ds.DrawImage(effect, new Vector2(x, y));
float gain = _lyricsBgBrightnessTransition.Value;
float whiteX = 1 - 0.5f * gain;
float whiteY = 0.5f + 0.5f * gain;
float blackX = 0.5f - 0.5f * gain;
float blackY = 0 + 0.5f * gain;
ds.DrawImage(new OpacityEffect
{
Source = new BrightnessEffect
{
Source = new ScaleEffect
{
Scale = new Vector2(scaleFactor),
Source = canvasBitmap,
},
WhitePoint = new Vector2(whiteX, whiteY),
BlackPoint = new Vector2(blackX, blackY),
},
Opacity = opacity,
}, new Vector2(x, y));
} }
private void DrawForegroundImgae(ICanvasAnimatedControl control, CanvasDrawingSession ds, CanvasBitmap canvasBitmap, float opacity) private void DrawForegroundImgae(OpacityEffect effect, CanvasDrawingSession ds)
{ {
if (opacity == 0) return; ds.DrawImage(effect, new Vector2(_albumArtXTransition.Value, _albumArtYTransition.Value));
float imageWidth = (float)canvasBitmap.Size.Width;
float imageHeight = (float)canvasBitmap.Size.Height;
float scaleFactor = _albumArtSize / Math.Min(imageWidth, imageHeight);
if (scaleFactor < 0.01f) return;
float cornerRadius = _albumArtCornerRadius / 100f * _albumArtSize / 2;
using var cornerRadiusMask = new CanvasCommandList(control.Device);
using var cornerRadiusMaskDs = cornerRadiusMask.CreateDrawingSession();
cornerRadiusMaskDs.FillRoundedRectangle(
new Rect(0, 0, imageWidth * scaleFactor, imageHeight * scaleFactor),
cornerRadius, cornerRadius, Colors.White
);
ds.DrawImage(new OpacityEffect
{
Source = new AlphaMaskEffect
{
Source = new ScaleEffect
{
Scale = new Vector2(scaleFactor),
Source = canvasBitmap,
},
AlphaMask = cornerRadiusMask,
},
Opacity = opacity,
}, new Vector2(_albumArtXTransition.Value, _albumArtYTransition.Value));
} }
private void DrawAlbumArtBackground(ICanvasAnimatedControl control, CanvasDrawingSession ds) private void DrawAlbumArtBackground(ICanvasAnimatedControl control, CanvasDrawingSession ds)
@@ -173,13 +123,13 @@ namespace BetterLyrics.WinUI3.ViewModels
using var overlappedCoversDs = overlappedCovers.CreateDrawingSession(); using var overlappedCoversDs = overlappedCovers.CreateDrawingSession();
overlappedCoversDs.Transform = Matrix3x2.CreateRotation(_rotateAngle, control.Size.ToVector2() * 0.5f); overlappedCoversDs.Transform = Matrix3x2.CreateRotation(_rotateAngle, control.Size.ToVector2() * 0.5f);
if (_lastAlbumArtCanvasBitmap != null) if (_lastBgImageEffect != null && !_lastBgImageEffect.IsDisposed() && _lastAlbumArtCanvasBitmap != null)
{ {
DrawBackgroundImgae(control, overlappedCoversDs, _lastAlbumArtCanvasBitmap, 1 - _albumArtBgTransition.Value); DrawBackgroundImgae(_lastBgImageEffect, overlappedCoversDs, _lastAlbumArtCanvasBitmap);
} }
if (_albumArtCanvasBitmap != null) if (_bgImageEffect != null && !_bgImageEffect.IsDisposed() && _albumArtCanvasBitmap != null)
{ {
DrawBackgroundImgae(control, overlappedCoversDs, _albumArtCanvasBitmap, _albumArtBgTransition.Value); DrawBackgroundImgae(_bgImageEffect, overlappedCoversDs, _albumArtCanvasBitmap);
} }
overlappedCoversDs.Transform = Matrix3x2.Identity; overlappedCoversDs.Transform = Matrix3x2.Identity;
@@ -222,13 +172,14 @@ namespace BetterLyrics.WinUI3.ViewModels
{ {
using var albumArt = new CanvasCommandList(control.Device); using var albumArt = new CanvasCommandList(control.Device);
using var albumArtDs = albumArt.CreateDrawingSession(); using var albumArtDs = albumArt.CreateDrawingSession();
if (_albumArtCanvasBitmap != null)
if (_lastFgImageEffect != null && !_lastFgImageEffect.IsDisposed() && _lastAlbumArtCanvasBitmap != null)
{ {
DrawForegroundImgae(control, albumArtDs, _albumArtCanvasBitmap, _albumArtBgTransition.Value); DrawForegroundImgae(_lastFgImageEffect, albumArtDs);
} }
if (_lastAlbumArtCanvasBitmap != null) if (_fgImageEffect != null && !_fgImageEffect.IsDisposed() && _albumArtCanvasBitmap != null)
{ {
DrawForegroundImgae(control, albumArtDs, _lastAlbumArtCanvasBitmap, 1 - _albumArtBgTransition.Value); DrawForegroundImgae(_fgImageEffect, albumArtDs);
} }
using var opacity = new CanvasCommandList(control.Device); using var opacity = new CanvasCommandList(control.Device);
@@ -367,12 +318,16 @@ namespace BetterLyrics.WinUI3.ViewModels
// 先铺一层带默认透明度的已经加了模糊效果的歌词作为最底层(背景歌词层次) // 先铺一层带默认透明度的已经加了模糊效果的歌词作为最底层(背景歌词层次)
// Current line will not be blurred // Current line will not be blurred
combinedDs.DrawImage( combinedDs.DrawImage(
new GaussianBlurEffect new OpacityEffect
{ {
Source = new OpacityEffect { Source = bgLyrics, Opacity = line.OpacityTransition.Value * _lyricsOpacityTransition.Value }, Source = new GaussianBlurEffect
BlurAmount = line.BlurAmountTransition.Value, {
BorderMode = EffectBorderMode.Soft, Source = bgLyrics,
Optimization = EffectOptimization.Speed, BlurAmount = line.BlurAmountTransition.Value,
BorderMode = EffectBorderMode.Soft,
Optimization = EffectOptimization.Speed,
},
Opacity = line.OpacityTransition.Value * _lyricsOpacityTransition.Value,
} }
); );

View File

@@ -0,0 +1,93 @@
using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Effects;
using Microsoft.Graphics.Canvas.UI.Xaml;
using Microsoft.UI;
using Microsoft.UI.Xaml.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Graphics.Effects;
namespace BetterLyrics.WinUI3.ViewModels
{
public partial class LyricsRendererViewModel
{
private OpacityEffect? _lastBgImageEffect;
private OpacityEffect? _bgImageEffect;
private OpacityEffect? _lastFgImageEffect;
private OpacityEffect? _fgImageEffect;
private OpacityEffect CreateBgImageEffect(CanvasBitmap canvasBitmap, float opacity)
{
float imageWidth = (float)canvasBitmap.Size.Width;
float imageHeight = (float)canvasBitmap.Size.Height;
float targetSize = MathF.Sqrt(MathF.Pow(_canvasWidth, 2) + MathF.Pow(_canvasHeight, 2));
float scaleFactor = targetSize / MathF.Min(imageWidth, imageHeight);
// Original source: https://zhuanlan.zhihu.com/p/37178216
float gain = _lyricsBgBrightnessTransition.Value;
float whiteX = 1 - 0.5f * gain;
float whiteY = 0.5f + 0.5f * gain;
float blackX = 0.5f - 0.5f * gain;
float blackY = 0 + 0.5f * gain;
return new OpacityEffect
{
Source = new BrightnessEffect
{
Source = new ScaleEffect
{
Scale = new Vector2(scaleFactor),
Source = canvasBitmap,
},
WhitePoint = new Vector2(whiteX, whiteY),
BlackPoint = new Vector2(blackX, blackY),
},
Opacity = opacity,
};
}
private OpacityEffect? CreateFgImageEffect(ICanvasAnimatedControl control, CanvasBitmap canvasBitmap, float opacity)
{
// TODO 最大化/还原时图片大小未跟随改变
if (opacity == 0) return null;
float imageWidth = (float)canvasBitmap.Size.Width;
float imageHeight = (float)canvasBitmap.Size.Height;
float scaleFactor = _albumArtSize / Math.Min(imageWidth, imageHeight);
if (scaleFactor < 0.01f) return null;
float cornerRadius = _albumArtCornerRadius / 100f * _albumArtSize / 2;
// TODO 当前未监听专辑封面圆角变化
var cornerRadiusMask = new CanvasCommandList(control);
var cornerRadiusMaskDs = cornerRadiusMask.CreateDrawingSession();
cornerRadiusMaskDs.FillRoundedRectangle(
new Rect(0, 0, imageWidth * scaleFactor, imageHeight * scaleFactor),
cornerRadius, cornerRadius, Colors.White
);
return new OpacityEffect
{
Source = new AlphaMaskEffect
{
Source = new ScaleEffect
{
Scale = new Vector2(scaleFactor),
Source = canvasBitmap,
},
AlphaMask = cornerRadiusMask,
},
Opacity = opacity,
};
}
}
}

View File

@@ -49,21 +49,58 @@ namespace BetterLyrics.WinUI3.ViewModels
_displayType = _displayTypeReceived; _displayType = _displayTypeReceived;
_playingLineIndex = playingLineIndex; _playingLineIndex = playingLineIndex;
if (_albumArtChanged) // 背景图切换计算
// 将当前背景图放到 _lastAlbumArtSwBitmap 中 并设置不透明度为 1
// 将新的背景图放到 _albumArtSwBitmap 中 并设置不透明度为 0
// 这样可以实现背景图的连贯渐变效果
if (_albumArtChanged || _isCanvasHeightChanged || _isCanvasWidthChanged ||
_lyricsBgBrightnessTransition.IsTransitioning ||
_albumArtBgTransition.IsTransitioning)
{ {
if (_lastAlbumArtSwBitmap != null) // 必须先在此处重置动画
if (_albumArtChanged)
{ {
_lastAlbumArtCanvasBitmap = CanvasBitmap.CreateFromSoftwareBitmap(control, _lastAlbumArtSwBitmap); _albumArtBgTransition.Reset(0f);
_albumArtBgTransition.StartTransition(1f);
} }
_albumArtBgTransition.Reset(0f); // 更新 last
_albumArtBgTransition.StartTransition(1f); if (_albumArtChanged)
if (_albumArtSwBitmap != null)
{ {
_albumArtCanvasBitmap = CanvasBitmap.CreateFromSoftwareBitmap(control, _albumArtSwBitmap); if (_lastAlbumArtSwBitmap != null)
{
_lastAlbumArtCanvasBitmap = CanvasBitmap.CreateFromSoftwareBitmap(control, _lastAlbumArtSwBitmap);
}
}
_lastBgImageEffect?.Dispose();
_lastBgImageEffect = null;
_lastFgImageEffect?.Dispose();
_lastFgImageEffect = null;
if (_lastAlbumArtCanvasBitmap != null)
{
_lastFgImageEffect = CreateFgImageEffect(control, _lastAlbumArtCanvasBitmap, 1 - _albumArtBgTransition.Value);
_lastBgImageEffect = CreateBgImageEffect(_lastAlbumArtCanvasBitmap, 1 - _albumArtBgTransition.Value);
}
// 更新 current
if (_albumArtChanged)
{
if (_albumArtSwBitmap != null)
{
_albumArtCanvasBitmap = CanvasBitmap.CreateFromSoftwareBitmap(control, _albumArtSwBitmap);
}
}
_bgImageEffect?.Dispose();
_bgImageEffect = null;
_fgImageEffect?.Dispose();
_fgImageEffect = null;
if (_albumArtCanvasBitmap != null)
{
_fgImageEffect = CreateFgImageEffect(control, _albumArtCanvasBitmap, _albumArtBgTransition.Value);
_bgImageEffect = CreateBgImageEffect(_albumArtCanvasBitmap, _albumArtBgTransition.Value);
} }
_albumArtChanged = false;
} }
_albumArtChanged = false;
if (_isDynamicCoverOverlayEnabled) if (_isDynamicCoverOverlayEnabled)
{ {
_rotateAngle += _coverRotateSpeed; _rotateAngle += _coverRotateSpeed;

44
Promotion/en.txt Normal file
View File

@@ -0,0 +1,44 @@
* The free trial version is identical to the paid version — no feature limitations.
🎵 BetterLyrics — Lyrics that move you, visuals that delight. A stunning lyrics display tool for Windows.
Looking for a smooth, dynamic, and immersive way to view lyrics on Windows?
BetterLyrics delivers a whole new visual experience — making every song truly sing on screen.
✨ Key Features
- Beautiful UI with smooth animations
Built with WinUI 3, featuring multiple themes and dynamic backgrounds. Enjoy seamless lyric scrolling, fade effects, and rich visuals.
- Offline translation with support for 30 languages
Automatically reads translation lines embedded in local lyrics files. Multi-language support helps you understand every lyric, no internet needed.
- Supports multiple lyric sources and formats
Reads local lyrics in LRC, ESLRC, TTML, and other formats. Also fetches lyrics online from major sources like QQ Music, NetEase Cloud Music, Kugou, and LrcLib.
- Real-time sync with various music players
Compatible with NetEase Cloud, Kugou, Apple Music, Spotify, PotPlayer, MusicBee, AIMP, and even the default Windows player. Lyrics sync automatically—no setup required.
- Multiple display modes to suit your workflow
Switch easily between immersive full-screen mode, floating desktop lyrics, and smart window docking to fit any listening scenario.
- Auto-hide when playback is paused
The interface stays out of your way — lyrics automatically hide when music stops, keeping your screen clean and distraction-free.
🔧 Extra Features Youll Love
- Fine-tune lyric timing with offset adjustment — perfect for mismatched audio versions
- Toggle translation, customize layout, pin or lock windows — your lyrics, your way
- Active community, frequent updates, and responsive support for user feedback
✅ Perfect For:
- Users who want floating desktop lyrics to elevate their listening experience
- Listeners who use multiple players or need support for various lyric formats
- Fans of beautiful, customizable visuals in their music tools
🎧 Whether you're immersed in music through headphones or want lyrics to stay visible on your screen, BetterLyrics gives you a personalized, immersive way to experience every song.

44
Promotion/ja.txt Normal file
View File

@@ -0,0 +1,44 @@
* 無料体験版と有料版は機能に違いはありません。
🎵 BetterLyrics — 歌詞が心を動かし、目を楽しませる。高品質なWindows用歌詞表示ツール
Windowsで滑らかでダイナミック、没入感のある歌詞表示を体験しませんか
BetterLyricsは全く新しいビジュアル体験を提供し、すべての曲が画面上でまるで「歌っている」ように感じられます。
✨ 主な機能
- 美しいインターフェースと滑らかなアニメーション
WinUI 3をベースに開発され、複数のテーマや動的な背景をサポート。歌詞のスクロールやフェード効果など、視覚的に洗練された演出を楽しめます。
- オフライン翻訳対応、30言語サポート
ローカルの歌詞ファイルに含まれる翻訳を自動で読み込み表示。インターネット接続なしで多言語の歌詞理解をサポートします。
- 多様な歌詞フォーマットとソースに対応
LRC、ESLRC、TTMLなどのローカル歌詞ファイルを読み込み、さらにQQミュージック、NetEaseクラウドミュージック、Kugou、LrcLibなどの主要オンラインソースから歌詞を取得可能です。
- 多くの音楽プレイヤーとリアルタイム同期
NetEaseクラウドミュージック、Kugou、Apple Music、Spotify、PotPlayer、MusicBee、AIMP、そしてWindows標準プレイヤーまで幅広く対応。歌詞は自動的に同期され、手動設定は不要です。
- 多彩な表示モードを自由に切り替え
没入型の全画面モード、デスクトップに浮かぶ歌詞、スマートウィンドウドッキングなど、用途に合わせて切り替え可能。
- 再生停止時には自動で非表示
音楽が一時停止すると歌詞画面が自動的に隠れ、画面を邪魔せずスッキリ使えます。
🔧 便利な追加機能
- 微調整可能な歌詞タイムラインオフセットで、音源のズレをぴったり補正
- 翻訳表示のオンオフ、レイアウトのカスタマイズ、ウィンドウの固定・ロックなどの高度な設定
- 活発なユーザーコミュニティによる継続的なアップデートと迅速なフィードバック対応
✅ こんな方におすすめ
- デスクトップに歌詞を浮かべて、より豊かな音楽体験を求める方
- 複数のプレイヤーや多様な歌詞フォーマットを使いたい方
- 美しくカスタマイズ可能なUIを好む方
🎧 ヘッドホンで没入して聴くときも、デスクトップに歌詞を表示して楽しむときも、BetterLyricsがあなたの音楽体験をより特別なものにします。

45
Promotion/ko.txt Normal file
View File

@@ -0,0 +1,45 @@
* 무료 체험판과 유료 버전은 기능 차이가 전혀 없습니다.
🎵 BetterLyrics — 가사는 눈으로, 감동은 마음으로. 고품질 Windows용 가사 디스플레이 도구
Windows에서 부드럽고 역동적이며 몰입감 있는 가사 표시를 경험해보세요.
BetterLyrics는 완전히 새로운 시각적 음악 경험을 선사합니다. 이제 모든 곡이 화면 위에서 살아 숨쉽니다.
✨ 주요 기능
- 세련된 인터페이스와 부드러운 애니메이션
WinUI 3 기반으로 개발되었으며 다양한 테마와 동적 배경을 지원합니다. 가사 스크롤, 페이드 효과 등 시각적 효과가 매끄럽고 아름답습니다.
- 30개 언어를 지원하는 오프라인 번역 기능
로컬 가사 파일 내에 포함된 번역 내용을 자동으로 읽어와 표시합니다. 인터넷 연결 없이도 다양한 언어의 가사를 이해할 수 있습니다.
- 다양한 가사 형식 및 소스 지원
LRC, ESLRC, TTML 등 로컬 파일 형식을 지원하며, QQ 음악, 넷이즈 클라우드, 쿠거우, LrcLib 등 주요 온라인 소스에서 가사를 자동으로 가져올 수 있습니다.
- 다양한 음악 플레이어와 실시간 동기화
넷이즈, 쿠거우, Apple Music, Spotify, PotPlayer, MusicBee, AIMP, 그리고 Windows 기본 플레이어까지 폭넓게 호환됩니다. 가사는 자동으로 동기화되어 별도 설정 없이도 편리하게 사용 가능합니다.
- 다양한 디스플레이 모드 제공
몰입형 전체 화면, 바탕화면 가사 띄우기, 스마트 윈도우 도킹 등 다양한 사용 환경에 맞춰 자유롭게 전환할 수 있습니다.
- 자동 숨김 기능으로 깔끔한 화면 유지
음악이 일시정지되면 가사 창이 자동으로 숨겨져 화면을 방해하지 않고 깔끔함을 유지합니다.
🔧 세심한 부가기능
- 가사 싱크를 미세하게 조정할 수 있는 타임라인 오프셋 기능 제공
- 번역 표시 여부, 레이아웃 설정, 창 고정 및 잠금 등 고급 옵션 지원
- 활발한 사용자 커뮤니티 운영 중이며, 지속적인 업데이트와 피드백 반영
✅ 이런 분께 추천합니다
- 바탕화면에 가사를 띄워 감성적인 음악 감상을 원하는 분
- 다양한 플레이어나 가사 형식을 사용하는 분
- 세련되고 사용자 맞춤형 UI를 선호하는 분
🎧 헤드폰을 쓰고 몰입해서 듣든, 바탕화면에 가사를 띄워 놓고 감상하든 BetterLyrics는 여러분만의 음악 감상 경험을 완성해드립니다.

44
Promotion/zh-CN.txt Normal file
View File

@@ -0,0 +1,44 @@
* 免费试用版与付费版无任何区别
🎵 BetterLyrics —— 曲中人心、词悦双眼,高颜值 Windows 歌词展示工具
想在 Windows 上体验流畅、动态、沉浸的歌词显示效果?
BetterLyrics 打造全新视觉体验,让每一首歌都真正“唱”给你看!
✨ 核心功能亮点
- 界面美观,动画丝滑
基于 WinUI 3 框架开发,支持多种主题风格与动态背景,歌词滚动、淡入淡出等特效令人眼前一亮。
- 可配置接入离线翻译,支持 30 种语言
自动读取本地歌词中的翻译内容,支持多语言自动识别与显示,助你听懂每一句歌词。
- 支持多种歌词来源与格式
可读取本地的 LRC、ESLRC、TTML 等格式歌词文件,同时支持从在线源获取歌词,包括 QQ 音乐、网易云、酷狗音乐与 LrcLib 等主流平台。
- 多播放器实时同步
支持网易云音乐、酷狗音乐、Apple Music、Spotify、PotPlayer、MusicBee、AIMP 等,系统自带播放器也能用,歌词自动同步无需手动干预。
- 多种显示模式随心切换
沉浸式全屏、桌面悬浮歌词、窗口智能停靠,满足你不同场景的需求。
- 自动隐藏,安静陪伴
播放器暂停时自动隐藏歌词界面,不打扰、不占屏,清爽使用体验。
🔧 更多贴心功能
- 歌词时间轴支持偏移微调,解决不同版本音频对不上的问题
- 支持歌词翻译开关、界面布局自由设置、窗口置顶/锁定等高级功能
- 拥有活跃的用户社区,持续更新优化,问题反馈及时响应
✅ 推荐使用场景
- 想要桌面歌词悬浮,提升听歌氛围
- 需要跨平台、多格式的歌词显示支持
- 喜欢细节丰富、界面可自定义的听歌工具
🎧 无论你是用耳机沉浸式聆听还是想让歌词在桌面随时可见BetterLyrics 都能为你打造专属的听歌体验!

44
Promotion/zh-TW.txt Normal file
View File

@@ -0,0 +1,44 @@
* 免費試用版與付費版功能完全一致
🎵 BetterLyrics —— 曲動人心、詞悅雙眼,高顏值 Windows 歌詞顯示工具
想在 Windows 上體驗流暢、動態、沉浸感十足的歌詞顯示效果?
BetterLyrics 為你打造全新視覺享受,讓每一首歌都真正「唱」給你看!
✨ 核心功能亮點
- 介面美觀,動畫流暢
採用 WinUI 3 框架打造,支援多種主題風格與動態背景,歌詞滾動、淡入淡出等特效精緻細膩。
- 可設定離線翻譯,支援 30 種語言
自動讀取本地歌詞中的翻譯內容,支援多語系辨識與顯示,幫你聽懂每一句歌詞。
- 支援多種歌詞來源與格式
可讀取本地的 LRC、ESLRC、TTML 等格式歌詞檔,同時支援從線上來源獲取歌詞,包括 QQ 音樂、網易雲、酷狗音樂與 LrcLib 等主流平台。
- 多播放器即時同步
相容網易雲音樂、酷狗音樂、Apple Music、Spotify、PotPlayer、MusicBee、AIMP 等播放器,甚至支援系統內建播放器,歌詞自動同步無須手動調整。
- 多種顯示模式自由切換
沉浸式全螢幕、桌面浮動歌詞、智慧貼齊窗口等模式,靈活搭配不同使用場景。
- 自動隱藏,安靜陪伴
音樂暫停時自動隱藏歌詞介面,不打擾、不佔螢幕,帶來更清爽的使用體驗。
🔧 更多貼心功能
- 歌詞時間軸支援細微調整,完美對齊不同版本的音訊
- 支援翻譯開關、介面版面自定義、窗口鎖定與置頂等進階選項
- 活躍用戶社群持續參與、版本持續優化、問題回饋即時處理
✅ 適用場景推薦
- 想要桌面浮動歌詞,增強聽歌氛圍
- 需要跨平台、多格式的歌詞支援
- 喜愛細節豐富、介面可自訂的聽歌工具
🎧 無論你是戴上耳機沉浸聆聽還是想讓歌詞隨時浮現在桌面BetterLyrics 都能為你打造專屬的聽歌體驗!

2
README.CN.md Normal file
View File

@@ -0,0 +1,2 @@
## 简体中文文档现已迁移
[点此访问](https://github.com/jayfunc/BetterLyrics/blob/dev/README.zh-CN.md)