karaoke-studio/StrangeUtaGame

一款由RhythmicaLyrics启发的打轴软件,Half-Vibecoding开发

Python

123

1,536 commits

updated Oct 16, 2026

See the code

README

SUG mascot

StrangeUtaGame

低延迟 · 高精度 · 卡拉 OK 打轴工具
A low-latency, high-precision karaoke timing tool — inspired by RhythmicaLyrics.

Release Stars Issues Platform Python License

简介 · 截图 · 功能 · 安装 · 键位 · FAQ

🇨🇳 中文 · 🇬🇧 English  |  Nicokara · Karaoke · ASS · 卡拉OK · 打轴



点个 Star ⭐ / Give it a Star

觉得有帮助?点亮一颗 ⭐ Star 就是对作者最大的鼓励!
Found it useful? A ⭐ Star is the warmest "thank you".


💜 简介 / About

StrangeUtaGame(简称 SUG)是一款受 RhythmicaLyrics 启发的卡拉 OK 歌词打轴软件。它在保留 RhythmicaLyrics工作流的同时,重写了音频引擎与渲染管线,专注于低延迟、高精度的时间标签制作,并把对中文创作者友好的体验放在首位 —— 无需日语转区、全格式音视频导入、高质量变速、演唱者管理。

StrangeUtaGame (SUG) is a karaoke timing tool inspired by RhythmicaLyrics. It rebuilds the audio engine and rendering pipeline around ultra-low latency and frame-accurate timestamping, with a focus on a smoother experience for Chinese-speaking creators — no Japanese locale switch required, import any audio/video format, and studio-grade time-stretching, Singer Management.

🎯 适合谁 / Who it's for

  • 翻唱、镜音、Vocaloid 字幕组
  • NicokaraMaker / ASS / Aegisub 打轴爱好者
  • 想要更现代 UI、更稳定体验的 RL 用户

🚫 不是什么 / What it isn't

  • 不是音游 / Not a rhythm game
  • 不是字幕翻译工具 / Not a translation tool
  • 不是 DAW / Not a digital audio workstation

🎬 截图 / Screenshots

Home / 打轴主界面
打轴主界面 · Main timing view
音频拖入即用,全局偏移、变速、音量随手可调
运行时 · Live timing
运行时 · Live timing with waveform & furigana
波形 + 节奏点 + 注音 + 多演唱者上色
导出 · Export
导出 · 13 种歌词格式
LRC×3 / KRA / TXT / SRT / txt2ass / ASS / Nicokara×2 / RL / 春日向注音 / Kirakara
设置 · Settings
设置 · 10 个分类页
演奏控制 / 打轴 / 自动保存 / AutoCheck / 词典 / 界面 / 导出 / 快捷键 / 网络 / 关于/语言
演唱者管理 · Singers
演唱者管理 · Singer manager
颜色、顺序、启用/禁用、软件预设
全文本编辑 · Full-text editor
全文本编辑 · Inline format editor
{原文||读音} + [mm:ss.cc] 时间戳一行式编辑

✨ 功能特性 / Features

⚡ 低延迟、高精度打轴 / Frame-accurate timing
基于 BASS 音频库 + sounddevice 的低延迟回放管线,按键 → 音频指针 → 时间戳一气呵成;可配置 tag_offset_ms 全局补偿与每首歌偏移。
Powered by the BASS audio library with a tuned sounddevice output path; per-tag offset and per-song global offset are both adjustable.
🤖 AI 打轴(Beta) / AI-assisted timing (Beta)
在 打轴界面 → AI 打轴 中,根据人声音频、歌词与已有注音自动生成整首歌曲的时间戳;支持日文及歌词中的中文、英文、韩文内容,可自动复用或分离人声,并提供日文推荐模型与多语言通用模型。默认日文推荐模型仅限非商业用途。结果仅供辅助参考,完成后请人工校准,尤其是和声与重叠人声段落。
Generate full-song timestamps from vocals, lyrics and existing readings under Timing → AI Timing. Japanese, Chinese, English and Korean content are supported, with reusable/automatic vocal separation and both Japanese-focused and multilingual models. The default Japanese-focused model is non-commercial only. Always review the result manually, especially harmony and overlapping-vocal sections.
📤 13 种歌词格式导出 / Thirteen export formats
LRC(增强型 / 逐行 / 逐字)· KRA · TXT · SRT · txt2ass · ASS · Nicokara · Nicokara(带注音) · RL 编辑模式 · 春日向注音 · Kirakara —— Aegisub、NicokaraMaker、RhythmicaLyrics 工作流无缝衔接;KRL 文件也可直接导入。
LRC (enhanced / per-line / per-word), KRA, TXT, SRT, txt2ass, ASS, Nicokara, Nicokara-with-furigana, RL edit-mode, Kasugamuki and Kirakara. KRL files can also be imported directly.
🎤 多演唱者管理 + 分色 / Multi-singer manager + split colors
支持任意数量演唱者,自带配色、互补色生成、分色(单人最多 5 色)、分组、拖拽排序、启用/禁用、软件级预设;可逐字(per-char)指定演唱者并支持跨行划选批量应用;导出时可按演唱者过滤,或在切换处自动插入 【名】 标签,另配分色标签助手。
Unlimited singers with auto color generation, split colors (up to 5 per singer), grouping, drag-reorder, enable/disable and presets; per-char singer assignment with cross-line selection; export can filter by singer or auto-inject 【name】 tags, plus a color-tag helper.
🇯🇵 自动注音(多引擎 + LLM + 罗马音) / Auto-furigana (multi-engine + LLM + romaji)
主引擎 WinRT JapanesePhoneticAnalyzer(main 变体)/ SudachiPy(noWinIME·mac 变体),辅以 pykakasi + 本地/联网词典;可在 设置 → 读音词典 → LLM 注音 启用 LLM 并配置 API;支持一键转罗马音与「仅注音」模式;按平假名/片假名/汉字/字母/数字分类启停,自动补全句首停顿点、促音、长音、括号、英文音节等规则。片假名英文注音开关位于 设置 → 读音词典 → 根据用户词典给片假名标注英文。
Primary engine is WinRT JapanesePhoneticAnalyzer (main build) or SudachiPy (noWinIME/mac); pykakasi + local/online dictionaries fall in behind. Optional LLM-based furigana (bring-your-own API, auto-fallback) and one-click romaji. Per-category toggles plus rules for sokuon, long vowel, parentheses, English syllables …
🌐 联网读音词典 / Online reading dictionary
内置 RhythmicaLyrics 官方源;可自定义源顺序、自定义源 URL、定时自动更新;查询结果合并本地词典,{原文||读音} 即写即用。
Ships with the RhythmicaLyrics official source; sources are user-orderable with custom URLs and scheduled auto-update.
🎞️ 全格式音视频导入 / All-format ingest
BASS 自带 FLAC / OPUS / MP3 / WMA / WV / DSD / ALAC / AAC / AC3 / WebM 解码;视频文件由内置 video_converter 抽轨。
BASS decodes FLAC / OPUS / MP3 / WMA / WV / DSD / ALAC / AAC / AC3 / WebM natively; video files are demuxed by the built-in converter.
🐢 变速不变调,慢放扒轴 / Pitch-preserved time-stretch
BASS-FX + pedalboard 双管线,最低可拉到 0.2×,慢放扒轴细听咬字、气口与连唱不再走样。
BASS-FX + pedalboard dual pipeline; drop the rate down to 0.2× and still hear clear syllable onsets.
📝 全文本编辑模式 / Inline full-text editor
整段 inline 格式:{原文||读音} 注音 + [mm:ss.cc] 时间戳 + 停顿点 [>...] + 演唱者 【名】,所见即所得,键盘流编辑神器。
Edit lyrics as one fluent text: {text||reading} furigana, [mm:ss.cc] timestamps, end-of-line [>...] and 【singer】 all live inline.
🧠 AutoCheck 智能补全 / AutoCheck rules engine
按字符类型、句首停顿点、空格、标点、英语音节等多达 20+ 项规则一键补全节奏点;删除节奏点时智能回跳 jump_before_ms 毫秒以便复听。
20+ rules cover character class, sentence boundaries, spaces, punctuation, English syllables; deleting a checkpoint smart-rewinds to let you re-listen.
🧰 时间戳工具箱 / Timestamp toolbox
打轴界面「时间戳工具」集合:批量删除(全部 / 保留首行 / 所选范围)、按行或按所选范围整体移动、自动补偿、分离符号时间戳、超宽的原始时间戳调整 —— 扒轴返工不再手忙脚乱。
A "Timestamp tools" suite: bulk delete (all / keep first line / selected range), shift by line or range, auto-compensate, split symbol timestamps, and wide raw-timestamp tweaking.
🎯 打轴预览指引 / Customizable timing guide
预览走字可叠加「上一个 / 正在打 / 下一个」字的引导着色,每档不透明度与开关均可自定义;另有导唱符待办标记,对无时间戳处提前标注「此处需导唱符」。
The karaoke preview can overlay prev / current / next guide coloring with per-level alpha and toggles; plus a "needs guide symbol" to-do marker for untimed spots.
🔊 打轴按键音 / Key sounds
可选 default / arcade / osu / sci 等多种按键音效,把打轴体验拉近音游手感(默认关闭,按需开启)。
Optional key-press/-release sounds (default / arcade / osu / sci …) for a rhythm-game-like feel — off by default.
🌏 无需日语转区 / No Japanese locale required
原生 UTF-8 路径与文本,告别 mojibake、告别 AppLocale;中文 UI 默认开箱即用。
Native UTF-8 paths and text everywhere — no AppLocale, no mojibake.
💾 自动保存 + 撤销栈 / Autosave + undo stack
默认每 5 分钟落盘一次 .sug 工程;命令模式撤销栈支持几十步回退,配合 Ctrl+Z / Ctrl+Y 标准操作。
Auto-saves the .sug project every 5 min by default; a command-pattern undo stack supports deep Ctrl+Z / Ctrl+Y.
🚀 内置自动更新器 / Built-in updater
启动时检查 GitHub 发行版;可选 ghproxy / gh-proxy / ghproxy-net 镜像加速;支持系统代理 / 手动代理 / 跳过版本。
Auto-checks GitHub releases at launch; supports ghproxy / gh-proxy / ghproxy-net mirrors plus system or manual proxy.
🌍 多语言界面 / Multilingual UI
内置简体中文 / 日本語 / English 三语,默认 Auto 跟随系统语言,也可在 设置 → 关于/语言 固定;基于 Qt .ts/.qm 翻译资源,欢迎贡献新语言。
Ships Simplified Chinese / Japanese / English; defaults to Auto (follows the OS) or pin it under Settings → About/Language. Built on Qt .ts/.qm — new languages welcome.
🎨 Fluent Design 现代 UI / Modern Fluent UI
基于 PyQt6-Fluent-Widgets 的 Win11 风格界面,支持浅色 / 深色 / 跟随系统三种主题。
A Windows 11–style UI built on PyQt6-Fluent-Widgets with light / dark / system theme.

🧭 常用功能入口 / Where to find settings

功能 / Feature入口或设置位置 / Location说明 / Notes
AI 打轴(Beta) / AI-assisted timing打轴界面 → AI 打轴模型、设备、下载镜像、模型目录、AI 缓存和运行环境均在弹窗内设置;执行结果可撤销一次。
播放区间锁定 / Playback range locks设置 → 快捷键 → 锁定播放起点 / 锁定播放终点默认按键为 [ / ];再次触发可取消锁定。
播放头居中模式 / Centered playhead设置 → 打轴 → 波形时间标签 → 播放头居中模式默认关闭;开启后播放头固定在时间轴中央。
Karaoke 实时预览 / Live preview设置 → 界面进入该页面后自动显示;拖动标题可移动,拖动边缘可缩放。
软件界面字体 / Interface font设置 → 界面 → 界面设定 → 界面字体留空时按界面语言自动选择,修改后立即应用。
Karaoke 预览横向滚动 / Horizontal preview scrollingKaraoke 预览区域内容超宽时自动显示横向滚动条;也可按住 Alt 滚动鼠标滚轮。
最近打开的项目 / Recent projects打轴界面 → 文件管理 → 最近打开的文件最多显示 10 条记录,可在同一菜单中清空。
F2 注音快捷编辑 / Quick ruby editor设置 → 快捷键 → 字符与行编辑 → 注音编辑窗口默认 F2;可选择迷你浮窗或经典大窗口。
Kirakara 导入与导出 / Kirakara import & export导入:首页 → 导入歌词文件或打轴界面 → 文件管理 → 加载歌词;导出:导出 → 导出格式 → Kirakara支持带 config 配置块的 KRL;默认导出格式可在 设置 → 导出 → 默认导出格式 中修改。

📦 安装与运行 / Installation

🪟 支持系统 / Supported OS: Windows 10 / 11 · 🍎 macOS(实验性 / experimental)

从 Releases 页面下载完整包,解压后双击 StrangeUtaGame.exe 即可:

  • 🪟 Windows:下载 StrangeUtaGame-vX.Y.Z.zip(以版本号结尾的完整包)。
  • 🍎 macOS:按芯片下载 StrangeUtaGame-mac-arm64-vX.Y.Z.dmg(Apple Silicon)或 StrangeUtaGame-mac-intel-vX.Y.Z.dmg(Intel),详见下方注意事项。

⚠️ 认准版本号结尾的完整包,不要下载 -app / -runtime 结尾的分包(如 StrangeUtaGame-vX.Y.Z-app.zip、…-runtime.zip)。分包是应用内自动更新器给老用户做增量更新用的零件,-app 分包不含 Python 运行时,首次安装单独解压会启动失败。

Download the full archive from the Releases page, unzip, then run StrangeUtaGame.exe — Windows: StrangeUtaGame-vX.Y.Z.zip; macOS: …-mac-arm64-*.dmg (Apple Silicon) or …-mac-intel-*.dmg (Intel). Do NOT grab the -app / -runtime parts (…-vX.Y.Z-app.zip, …-runtime.zip): they are incremental-update pieces consumed by the built-in updater, and the -app part ships without the Python runtime — a fresh install from it will fail to launch.

📦 体积参考 / Approx. size: ~250 MB

🍎 macOS 注意事项 / macOS notes

macOS 版为实验性构建,使用前请留意:

  • 按芯片选择安装包 / Pick the build for your chip. Apple Silicon(M1/M2/M3…)下载 StrangeUtaGame-mac-arm64-vX.Y.Z.dmg;Intel 芯片下载 StrangeUtaGame-mac-intel-vX.Y.Z.dmg。不确定芯片类型可在「终端」执行 uname -m(arm64 = Apple Silicon,x86_64 = Intel)。装错架构会在启动时报 Bad CPU type in executable。(另有一个名为 StrangeUtaGame-mac-vX.Y.Z.zip 的旧命名包仅为老版本的更新检测保留,请勿下载。)
  • 首次打开被拦截(未签名)/ Unsigned app blocked on first launch. 应用未做 Apple 签名与公证,双击会提示「无法打开,因为无法验证开发者」。绕过方式:在 StrangeUtaGame.app 上右键 → 打开,在弹窗里再次点「打开」;或在终端执行 xattr -dr com.apple.quarantine /path/to/StrangeUtaGame.app 后再启动。
  • 无自动更新 / No auto-update. macOS 不支持应用内自动更新;检测到新版本时只会在浏览器打开 Releases 页面,需手动下载并替换旧的 .app。

macOS builds are experimental. Pick by chip: Apple Silicon → …-mac-arm64-*.dmg, Intel → …-mac-intel-*.dmg (run uname -m if unsure — arm64 = Apple Silicon, x86_64 = Intel; the wrong arch fails with Bad CPU type in executable). The app is not signed/notarized — on first launch use right-click → Open (or xattr -dr com.apple.quarantine <app>) to bypass Gatekeeper. No in-app auto-update; new versions open the Releases page in your browser for a manual download.


🛠️ 方式二 · 从源码运行 / Run from source

# 克隆仓库 / Clone
git clone https://github.com/karaoke-studio/StrangeUtaGame.git
cd StrangeUtaGame

# 创建虚拟环境(推荐) / Create a virtualenv (recommended)
python -m venv venv
venv\Scripts\activate

# 安装依赖 / Install dependencies
pip install -r requirements.txt

# 启动 / Launch
python main.py

或使用 uv(更快) / Or with uv (faster):

uv venv && source .venv/bin/activate   # Windows: .venv\Scripts\activate
uv pip install -r requirements.txt -r requirements-dev.txt
python main.py

依赖文件说明 / Dependency files. 依赖真源是锁定版本的 requirements*.txt(被发布流程做内容哈希用于增量更新,改动需谨慎);pyproject.toml 仅承载工具配置(ruff/black/mypy/pytest)。安装时按平台/变体追加其一:

  • main 变体(Windows,WinRT 注音):额外 pip install -r requirements-winrt.txt
  • noWinIME / mac 变体(sudachi 注音):额外 pip install -r requirements-variants.txt

Source of truth for deps is the pinned requirements*.txt (content-hashed by the release pipeline for incremental updates — change with care); pyproject.toml only holds tool config. Add one extra file per platform/variant as above.


📦 方式三 · 自行打包 / Build it yourself

# 安装 PyInstaller / Install PyInstaller
pip install pyinstaller

# 使用打包脚本(推荐) / Run the build script
python build.py

打包完成后可在 dist/StrangeUtaGame/ 目录找到可执行文件。
The packaged executable will appear in dist/StrangeUtaGame/.

⌨️ 键位说明 / Hotkeys

✅ 以下为打轴模式的默认键位,可在 设置 → 快捷键 中重新映射。 These are the default Timing Mode bindings. Remap them under Settings → Hotkeys.

🎯 播放与跳转 · Playback & Seek
播放 / 暂停 · Play / PauseA音频与光标同步控制
停止 · StopS停止并回到行首
从头播放 · Play from BeginningShift+S停止、回到开头并立即播放
后退 / 前进 · Seek back / forwardZ   X默认后退 2000 ms / 前进 3000 ms
减速 / 加速 · Speed − / +Q   W0.2× ~ 2.0×,变速不变调
恢复默认速度 · Reset speedE也可双击速度条
音量 − / + · Volume − / +未绑定可在快捷键设置中按需绑定
锁定播放起点 / 终点 · Lock range start / end[   ]再次按下取消锁定,操作支持撤销
🎯 打轴主操作 · Tagging
打轴 · Mark timestamp (now)D / F / Space打轴模式下:在当前字打节奏点
清除当前节奏点 · Clear timestampBackspace仅清除时间戳,不删字
停顿点标记切换 · Toggle line-end2停顿点「●」标记
打到停顿点 · Mark up to line-endP把剩余字符全部打上时间戳
切换字内节奏点 · Cycle in-char checkpointAlt+←   Alt+→在多重 check 之间切换
增加 / 减少节奏点 · Add / Remove checkpoint1   3用于字内多重 check
插入导唱符 · Insert guide symbolCtrl+1默认符号「●」
时间戳微调 ± · Nudge timestampAlt+↑   Alt+↓默认步进 10 ms
🎯 光标导航 · Navigation
上一行 / 下一行 · Prev / Next line↑   ↓—
上一字 / 下一字 · Prev / Next char←   →—
断行 · Break line hereEnter从当前光标断行
与上一行合并 · Merge into previous lineShift+Enter—
🎯 编辑 · Editing
编辑注音 · Edit ruby (furigana)F2编辑当前字注音,并可设置与下一字符连词
切换连字 · Toggle word-joinF3—
批量修改 · Bulk changeCtrl+H批量替换
修改字 / 行 · Modify char / lineJ   Ctrl+2—
插入空格 · Insert spaceM—
删除字 · Delete charDelete—
撤销 / 重做 · Undo / RedoCtrl+Z   Ctrl+Y深度命令栈
复制字 / 粘贴歌词 · Copy / PasteCtrl+C   Ctrl+V—
🎯 注音 / 演唱者 · Ruby & Singer
分析整篇注音 · Analyze all rubiesCtrl+3WinRT IME 全文跑一遍
分析选区注音 · Analyze selectedCtrl+A—
分析当前行注音 · Analyze lineCtrl+Shift+A—
按类型删除注音 · Delete rubies by typeCtrl+4按假名 / 符号 / 长音… 过滤
按行设置演唱者 · Set singer by lineCtrl+5—
应用演唱者 · Apply singerK—
🎯 工程与导出 · Project & Export
打开全文本编辑 · Open full-text editorCtrl+Tinline 整段编辑窗口
保存工程 · Save projectCtrl+S保存 .sug 工程
快速导出 · Quick exportCtrl+E按上次格式与目录一键导出

💡 还有一个独立的 编辑模式(Edit Mode):其中 Space / Backspace / . 分别用于增加节奏点、删除节奏点和切换停顿点;上表列出的是音乐播放时使用的打轴模式键位。
Edit Mode uses Space / Backspace / . to add a checkpoint, remove one, and toggle the line end. The table above lists the Timing Mode bindings used during playback.

🧰 技术栈 / Tech Stack



以上仅为代表性依赖;完整清单以仓库 requirements.txt / requirements-dev.txt 为准。
Representative deps only — see requirements.txt & requirements-dev.txt for the full list.

🗂️ 项目结构 / Project Structure

StrangeUtaGame/
├── main.py                       # 入口 / Entry point
├── build.py · build_all.py       # PyInstaller 打包脚本(单变体 / 全变体)
├── pyproject.toml                # 工具配置(ruff/black/mypy/pytest)/ Tool config
├── requirements.txt              # 运行依赖(锁定版本)/ Runtime deps (pinned)
├── requirements-winrt.txt        # main 变体:WinRT 注音 / WinRT furigana (main)
├── requirements-variants.txt     # noWinIME / mac 变体:sudachi 注音
├── requirements-dev.txt          # 开发依赖 / Dev deps
├── setup_env.bat                 # Windows 一键环境 / Win one-click setup
│
├── config.json                   # 全局配置(含快捷键 / AutoCheck / 网络源)
├── dictionary.json               # 读音词典 / Reading dictionary
├── network_dictionary.json       # 联网词典缓存 / Online dict cache
├── singers.json                  # 演唱者预设 / Singer presets
│
├── docs/                         # 设计文档 / Design docs
│   ├── application.md            #   应用层 / App layer
│   ├── architecture.md           #   总体架构 / Architecture
│   ├── auto_update.md            #   自动更新 / Auto-update
│   ├── domain.md                 #   领域模型 / Domain model
│   ├── infrastructure.md         #   基础设施 / Infrastructure
│   ├── timetag-spec-mapping.md   #   时间标签规范 / Timetag spec
│   ├── ui.md                     #   UI 设计 / UI design
│   └── 更新日志-0.2.0.md
│
├── src/strange_uta_game/         # 主包 / Main package
│   ├── __version__.py            # 版本号 + 变体标识 / Version & build variant
│   │
│   ├── backend/                  # 后端(无 Qt 依赖)/ Backend (Qt-free)
│   │   ├── domain/               #   领域层 / Domain (纯数据模型)
│   │   │   └── entities.py · models.py · project.py
│   │   ├── application/          #   应用服务 / Application services
│   │   │   ├── timing_service.py · export_service.py
│   │   │   ├── auto_check_service.py · calibration_service.py
│   │   │   ├── command_manager.py · singer_service.py
│   │   │   └── project_service.py · project_import_service.py
│   │   └── infrastructure/       #   基础设施 / Infrastructure
│   │       ├── audio/            #     音频引擎 / Audio engine
│   │       │   ├── bass_engine.py · bass_tsm_engine.py
│   │       │   ├── sounddevice_engine.py · ring_buffer.py
│   │       │   └── tsm_cache.py · keysound_player.py · video_converter.py
│   │       ├── parsers/          #     解析与注音 / Parsers & furigana
│   │       │   ├── lyric_parser.py · ass_parser.py · srt_parser.py
│   │       │   ├── ruby_analyzer.py · english_ruby.py · e2k_engine.py
│   │       │   ├── inline_format.py · annotated_text.py · romaji.py
│   │       │   └── kanji_reading_split.py · rl_dictionary.py · text_splitter.py · llm_ruby.py
│   │       ├── exporters/        #     导出器 / Exporters
│   │       │   ├── lrc_exporter.py · nicokara_exporter.py · srt_exporter.py
│   │       │   └── txt_exporter.py · txt2ass_exporter.py · inline_exporter.py
│   │       ├── data/default_dictionary.py   #   内置词典 / Built-in dict
│   │       ├── persistence/sug_io.py        #   .sug 工程读写 / Project IO
│   │       └── network_dictionary.py        #   联网词典 / Online dict
│   │
│   ├── frontend/                 # 界面层 / UI layer (PyQt6 + Fluent)
│   │   ├── main_window.py · theme.py · workers.py
│   │   ├── window_sizing.py · splash_screen.py · winrt_japanese_guide.py
│   │   ├── editor/               #   编辑器 / Editors
│   │   │   ├── timing_interface.py + timing/   #     打轴主界面 + 子组件
│   │   │   ├── fulltext_interface.py           #     全文本编辑(已废弃)
│   │   │   └── line_interface.py               #     行编辑
│   │   ├── home/ · export/ · singer/ · online/ #   起始 / 导出 / 演唱者 / 联网词典
│   │   ├── settings/             #   设置页 + cards + dialogs
│   │   ├── localization/         #   多语言 i18n (zh / en / ja)
│   │   └── startup/ · log/
│   │
│   ├── updater/                  # 自动更新器 / Auto-updater
│   │   ├── http_client.py · installer.py · manifest.py · worker.py
│   │   ├── proxy.py · settings.py · sources.py · version.py
│   │   └── ui/                   #   更新弹窗 / Update dialogs
│   │
│   ├── bass/                     # BASS DLLs(x86 + x64)/ BASS DLLs
│   ├── config/                   # 默认配置与词典 / Default config & dicts
│   │   ├── config.json · dictionary.json · singers.json
│   │   └── cmudict-0.7b · e2k.txt · kanji_readings.json
│   └── resource/                 # 图标与音效 / Icons & key sounds
│       └── icon.ico · icon.icns · mascot.png · sounds/
│
├── tests/                        # 测试 / Tests (pytest + pytest-qt)
│   ├── app/services/    · app/domain/
│   ├── infrastructure/  · ui/
│   └── updater/
│
└── scripts/                      # 杂项脚本 / Misc scripts
    ├── release.py
    ├── import_rl_builtin_dict.py
    └── migrate_dictionary*.py

📌 节略自仓库实际目录;命名 / 层级以 src/strange_uta_game/ 真实内容为准。
Compressed from the real repo layout — see src/strange_uta_game/ for the authoritative tree.

🤝 贡献指南 / Contributing

我们欢迎任何形式的贡献!
We welcome contributions of all kinds.

🐛 报 Bug / Report a bug

  1. 复现步骤、日志、系统版本
  2. 附带 logs/latest.log(如有)
  3. 在 Issues 提交

✨ 提功能 / Propose a feature

  1. 先开 Discussion 聊聊思路
  2. 通过后再写代码
  3. PR 时附带截图 / GIF

🔧 改代码 / Send a pull request

git checkout -b feat/your-idea
# ……写代码 / make changes
git commit -m "feat: your idea"
git push origin feat/your-idea

🌍 翻译 / Translate

已支持 中 / 日 / 英;新增语言可基于 src/strange_uta_game/frontend/localization/ 的 Qt .ts 资源翻译后提交。

Already in zh / ja / en — add a language by translating the Qt .ts files under frontend/localization/.

提交前请运行 ruff check . 与 pytest。
Please run ruff check . and pytest before opening a PR.

💐 致谢 / Credits

  • RhythmicaLyrics — 灵感来源与工作流原型 / Original inspiration & workflow
  • FA-Kara (moriwx) — AI 打轴对齐与注音转写思路参考(MIT)/ Forced-alignment & transcription reference for AI timing
  • yohane (Japan7) — AI 打轴 Wav2Vec2 CTC 对齐思路参考 / Wav2Vec2 CTC alignment reference for AI timing
  • BASS Audio Library (un4seen) — 低延迟音频引擎与解码 / Low-latency audio engine & decoding
  • BASS-FX — 实时音频变速 / Real-time pitch-preserving stretch
  • pedalboard (Spotify) — 音频效果与高质量变速 / Audio effects & HQ stretch
  • sounddevice · soundfile — 音频 I/O
  • PyQt6 + PyQt6-Fluent-Widgets — UI 框架 / UI framework
  • WinRT JapanesePhoneticAnalyzer — 系统 IME 注音 / System IME furigana
  • pykakasi · jaconv · pyphen — 日语 / 英文音节处理
  • CMUdict · e2k — 英文注音词典 / English pronunciation dicts
  • 所有提 issue / PR 的伙伴们 · Everyone who filed an issue or PR 💜

❓ FAQ

Q1. 为什么叫 "StrangeUtaGame"?这是音游吗?   Why "StrangeUtaGame"? Is it a rhythm game?

不是 🙅 —— 这只是个有点意思的名字。Uta 就是日语「歌」,项目本质是卡拉 OK 打轴工具,不是音游。
No 🙅 — the name is just a bit of fun. Uta means "song" in Japanese; the project is a karaoke timing tool, not a rhythm game.

Q2. 和 RhythmicaLyrics、Aegisub-kara-templater 有什么区别?   How is it different from RhythmicaLyrics or Aegisub kara-templater?
  • 相比 RL:现代 UI、毫秒级低延迟回放、无需日语转区、原生 UTF-8。
  • 相比 Aegisub kara-templater:SUG 专注「打轴」这一步,导出后再交给 Aegisub 做样式与特效,两者互补。
Q3. 支持 macOS / Linux 吗?   Does it support macOS / Linux?

目前仅官方支持 Windows 10/11。源码本身是 Python + Qt,理论上跨平台 —— 欢迎社区贡献构建脚本与测试报告。
Officially Windows 10/11 only for now. The code is Python + Qt and should be portable; build scripts & test reports for other OSes are very welcome.

Q4. 我之前的 RhythmicaLyrics工程能直接导入吗?   Can I import my existing RhythmicaLyricsproject?

支持导入 RhythmicaLyrics导出的 ASS / LRC / TXT 与 RL 编辑模式 文本格式;联网词典同时兼容 RhythmicaLyrics 官方接口,原有词典资产可直接复用。
ASS / LRC / TXT and the RL edit-mode text format from RhythmicaLyricscan be imported; the online dictionary is wire-compatible with the RhythmicaLyrics official endpoint, so your existing dictionary assets keep working.

Q5. 打开后没有声音 或 加载某个音频报错?   No sound, or an audio format fails to load?

发行版自带全套 BASS DLL(含 FLAC / OPUS / AAC / AC3 / WMA / DSD / ALAC / WebM 插件)位于 lib/;若从源码运行请保证 src/strange_uta_game/lib/ 下的插件完整。视频文件由内置 video_converter 抽轨。
The release ships the full BASS codec set (FLAC / OPUS / AAC / AC3 / WMA / DSD / ALAC / WebM) under lib/. From source, keep the DLL set at src/strange_uta_game/lib/ intact.

Q6. 自动注音怎么工作?为什么某些词的读音不准?   How does auto-furigana work? Why are some readings off?

主引擎是 Windows 系统自带的 WinRT JapanesePhoneticAnalyzer。首次运行需在 设置 → 时间和语言 → 语言 中启用 日语基本包 (Language.Basic~~~ja-JP);未启用时应用内会探测并引导安装。本地 / 联网词典会覆盖 IME 结果,遇到生僻词可补充本地词典。
The primary engine is Windows' WinRT JapanesePhoneticAnalyzer, which needs the Japanese basic IME pack. The app probes for it and guides you to install. The local + online dictionaries override IME results for tricky readings.

Q7. 联网词典不走?代理 / 镜像怎么设?   Online dictionary blocked? Proxy / mirror?

在 设置 → 网络可切换词典源(内置 RhythmicaLyrics 官方)、自定义 URL、调整源优先级。自动更新则内置 ghproxy / gh-proxy / ghproxy-net 三个 GitHub 镜像。
Under Settings → Network you can switch dictionary sources (RhythmicaLyrics official), add custom URLs, reorder priorities. The updater can route through ghproxy / gh-proxy / ghproxy-net.

Q8. 启动报 "Failed to load Python DLL '…_internal\python313.dll' LoadLibrary: 找不到指定的模块"?   Startup fails with "Failed to load Python DLL … python313.dll"?

按顺序排查:① 杀毒软件隔离了 python313.dll(到杀毒软件隔离区恢复文件,并把软件目录加入白名单);② 首次安装误用 app 分包 —— 发布资产里的 -app.zip 是给老用户增量更新用的分包(不含 Python 运行时),首次安装必须下载不带 -app / -runtime 后缀的完整 zip,用本地解压软件完整解压后再运行,勿在压缩软件预览中直接运行;③ 缺 VC++ 运行库 —— 安装 vc_redist.x64.exe(2015-2022);④ 右键 exe → 属性 → 解除锁定。
Troubleshoot in order: ① antivirus quarantined python313.dll — restore it from the quarantine and whitelist the app folder; ② first-time install used the app-only package — the
-app.zip asset is an incremental update part for existing users (no Python runtime inside); first-time installs must download the full zip without the -app / -runtime suffix and extract it fully with a local unpacker, never run it from the archiver's preview window; ③ missing VC++ runtime — install vc_redist.x64.exe (2015-2022); ④ right-click the exe → Properties → Unblock.

📜 License

本项目采用 GNU General Public License v3.0 开源。
Released under the GNU General Public License v3.0.

Copyright (C) 2026 karaoke-studio and contributors

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

SUG
点个 Star ⭐ / Give it a Star
Made with 💜 by karaoke-studio  ·  Powered by Python + PyQt6 + BASS



「打出你听见的每一个字。」
"Tag every syllable you can hear."

karaoke-studio/StrangeUtaGame

一款由RhythmicaLyrics启发的打轴软件,Half-Vibecoding开发

Python

123

1,536 commits

updated Oct 16, 2026

See the code

README

SUG mascot

StrangeUtaGame

低延迟 · 高精度 · 卡拉 OK 打轴工具
A low-latency, high-precision karaoke timing tool — inspired by RhythmicaLyrics.

Release Stars Issues Platform Python License

简介 · 截图 · 功能 · 安装 · 键位 · FAQ

🇨🇳 中文 · 🇬🇧 English  |  Nicokara · Karaoke · ASS · 卡拉OK · 打轴



点个 Star ⭐ / Give it a Star

觉得有帮助?点亮一颗 ⭐ Star 就是对作者最大的鼓励!
Found it useful? A ⭐ Star is the warmest "thank you".


💜 简介 / About

StrangeUtaGame(简称 SUG)是一款受 RhythmicaLyrics 启发的卡拉 OK 歌词打轴软件。它在保留 RhythmicaLyrics工作流的同时,重写了音频引擎与渲染管线,专注于低延迟、高精度的时间标签制作,并把对中文创作者友好的体验放在首位 —— 无需日语转区、全格式音视频导入、高质量变速、演唱者管理。

StrangeUtaGame (SUG) is a karaoke timing tool inspired by RhythmicaLyrics. It rebuilds the audio engine and rendering pipeline around ultra-low latency and frame-accurate timestamping, with a focus on a smoother experience for Chinese-speaking creators — no Japanese locale switch required, import any audio/video format, and studio-grade time-stretching, Singer Management.

🎯 适合谁 / Who it's for

  • 翻唱、镜音、Vocaloid 字幕组
  • NicokaraMaker / ASS / Aegisub 打轴爱好者
  • 想要更现代 UI、更稳定体验的 RL 用户

🚫 不是什么 / What it isn't

  • 不是音游 / Not a rhythm game
  • 不是字幕翻译工具 / Not a translation tool
  • 不是 DAW / Not a digital audio workstation

🎬 截图 / Screenshots

Home / 打轴主界面
打轴主界面 · Main timing view
音频拖入即用,全局偏移、变速、音量随手可调
运行时 · Live timing
运行时 · Live timing with waveform & furigana
波形 + 节奏点 + 注音 + 多演唱者上色
导出 · Export
导出 · 13 种歌词格式
LRC×3 / KRA / TXT / SRT / txt2ass / ASS / Nicokara×2 / RL / 春日向注音 / Kirakara
设置 · Settings
设置 · 10 个分类页
演奏控制 / 打轴 / 自动保存 / AutoCheck / 词典 / 界面 / 导出 / 快捷键 / 网络 / 关于/语言
演唱者管理 · Singers
演唱者管理 · Singer manager
颜色、顺序、启用/禁用、软件预设
全文本编辑 · Full-text editor
全文本编辑 · Inline format editor
{原文||读音} + [mm:ss.cc] 时间戳一行式编辑

✨ 功能特性 / Features

⚡ 低延迟、高精度打轴 / Frame-accurate timing
基于 BASS 音频库 + sounddevice 的低延迟回放管线,按键 → 音频指针 → 时间戳一气呵成;可配置 tag_offset_ms 全局补偿与每首歌偏移。
Powered by the BASS audio library with a tuned sounddevice output path; per-tag offset and per-song global offset are both adjustable.
🤖 AI 打轴(Beta) / AI-assisted timing (Beta)
在 打轴界面 → AI 打轴 中,根据人声音频、歌词与已有注音自动生成整首歌曲的时间戳;支持日文及歌词中的中文、英文、韩文内容,可自动复用或分离人声,并提供日文推荐模型与多语言通用模型。默认日文推荐模型仅限非商业用途。结果仅供辅助参考,完成后请人工校准,尤其是和声与重叠人声段落。
Generate full-song timestamps from vocals, lyrics and existing readings under Timing → AI Timing. Japanese, Chinese, English and Korean content are supported, with reusable/automatic vocal separation and both Japanese-focused and multilingual models. The default Japanese-focused model is non-commercial only. Always review the result manually, especially harmony and overlapping-vocal sections.
📤 13 种歌词格式导出 / Thirteen export formats
LRC(增强型 / 逐行 / 逐字)· KRA · TXT · SRT · txt2ass · ASS · Nicokara · Nicokara(带注音) · RL 编辑模式 · 春日向注音 · Kirakara —— Aegisub、NicokaraMaker、RhythmicaLyrics 工作流无缝衔接;KRL 文件也可直接导入。
LRC (enhanced / per-line / per-word), KRA, TXT, SRT, txt2ass, ASS, Nicokara, Nicokara-with-furigana, RL edit-mode, Kasugamuki and Kirakara. KRL files can also be imported directly.
🎤 多演唱者管理 + 分色 / Multi-singer manager + split colors
支持任意数量演唱者,自带配色、互补色生成、分色(单人最多 5 色)、分组、拖拽排序、启用/禁用、软件级预设;可逐字(per-char)指定演唱者并支持跨行划选批量应用;导出时可按演唱者过滤,或在切换处自动插入 【名】 标签,另配分色标签助手。
Unlimited singers with auto color generation, split colors (up to 5 per singer), grouping, drag-reorder, enable/disable and presets; per-char singer assignment with cross-line selection; export can filter by singer or auto-inject 【name】 tags, plus a color-tag helper.
🇯🇵 自动注音(多引擎 + LLM + 罗马音) / Auto-furigana (multi-engine + LLM + romaji)
主引擎 WinRT JapanesePhoneticAnalyzer(main 变体)/ SudachiPy(noWinIME·mac 变体),辅以 pykakasi + 本地/联网词典;可在 设置 → 读音词典 → LLM 注音 启用 LLM 并配置 API;支持一键转罗马音与「仅注音」模式;按平假名/片假名/汉字/字母/数字分类启停,自动补全句首停顿点、促音、长音、括号、英文音节等规则。片假名英文注音开关位于 设置 → 读音词典 → 根据用户词典给片假名标注英文。
Primary engine is WinRT JapanesePhoneticAnalyzer (main build) or SudachiPy (noWinIME/mac); pykakasi + local/online dictionaries fall in behind. Optional LLM-based furigana (bring-your-own API, auto-fallback) and one-click romaji. Per-category toggles plus rules for sokuon, long vowel, parentheses, English syllables …
🌐 联网读音词典 / Online reading dictionary
内置 RhythmicaLyrics 官方源;可自定义源顺序、自定义源 URL、定时自动更新;查询结果合并本地词典,{原文||读音} 即写即用。
Ships with the RhythmicaLyrics official source; sources are user-orderable with custom URLs and scheduled auto-update.
🎞️ 全格式音视频导入 / All-format ingest
BASS 自带 FLAC / OPUS / MP3 / WMA / WV / DSD / ALAC / AAC / AC3 / WebM 解码;视频文件由内置 video_converter 抽轨。
BASS decodes FLAC / OPUS / MP3 / WMA / WV / DSD / ALAC / AAC / AC3 / WebM natively; video files are demuxed by the built-in converter.
🐢 变速不变调,慢放扒轴 / Pitch-preserved time-stretch
BASS-FX + pedalboard 双管线,最低可拉到 0.2×,慢放扒轴细听咬字、气口与连唱不再走样。
BASS-FX + pedalboard dual pipeline; drop the rate down to 0.2× and still hear clear syllable onsets.
📝 全文本编辑模式 / Inline full-text editor
整段 inline 格式:{原文||读音} 注音 + [mm:ss.cc] 时间戳 + 停顿点 [>...] + 演唱者 【名】,所见即所得,键盘流编辑神器。
Edit lyrics as one fluent text: {text||reading} furigana, [mm:ss.cc] timestamps, end-of-line [>...] and 【singer】 all live inline.
🧠 AutoCheck 智能补全 / AutoCheck rules engine
按字符类型、句首停顿点、空格、标点、英语音节等多达 20+ 项规则一键补全节奏点;删除节奏点时智能回跳 jump_before_ms 毫秒以便复听。
20+ rules cover character class, sentence boundaries, spaces, punctuation, English syllables; deleting a checkpoint smart-rewinds to let you re-listen.
🧰 时间戳工具箱 / Timestamp toolbox
打轴界面「时间戳工具」集合:批量删除(全部 / 保留首行 / 所选范围)、按行或按所选范围整体移动、自动补偿、分离符号时间戳、超宽的原始时间戳调整 —— 扒轴返工不再手忙脚乱。
A "Timestamp tools" suite: bulk delete (all / keep first line / selected range), shift by line or range, auto-compensate, split symbol timestamps, and wide raw-timestamp tweaking.
🎯 打轴预览指引 / Customizable timing guide
预览走字可叠加「上一个 / 正在打 / 下一个」字的引导着色,每档不透明度与开关均可自定义;另有导唱符待办标记,对无时间戳处提前标注「此处需导唱符」。
The karaoke preview can overlay prev / current / next guide coloring with per-level alpha and toggles; plus a "needs guide symbol" to-do marker for untimed spots.
🔊 打轴按键音 / Key sounds
可选 default / arcade / osu / sci 等多种按键音效,把打轴体验拉近音游手感(默认关闭,按需开启)。
Optional key-press/-release sounds (default / arcade / osu / sci …) for a rhythm-game-like feel — off by default.
🌏 无需日语转区 / No Japanese locale required
原生 UTF-8 路径与文本,告别 mojibake、告别 AppLocale;中文 UI 默认开箱即用。
Native UTF-8 paths and text everywhere — no AppLocale, no mojibake.
💾 自动保存 + 撤销栈 / Autosave + undo stack
默认每 5 分钟落盘一次 .sug 工程;命令模式撤销栈支持几十步回退,配合 Ctrl+Z / Ctrl+Y 标准操作。
Auto-saves the .sug project every 5 min by default; a command-pattern undo stack supports deep Ctrl+Z / Ctrl+Y.
🚀 内置自动更新器 / Built-in updater
启动时检查 GitHub 发行版;可选 ghproxy / gh-proxy / ghproxy-net 镜像加速;支持系统代理 / 手动代理 / 跳过版本。
Auto-checks GitHub releases at launch; supports ghproxy / gh-proxy / ghproxy-net mirrors plus system or manual proxy.
🌍 多语言界面 / Multilingual UI
内置简体中文 / 日本語 / English 三语,默认 Auto 跟随系统语言,也可在 设置 → 关于/语言 固定;基于 Qt .ts/.qm 翻译资源,欢迎贡献新语言。
Ships Simplified Chinese / Japanese / English; defaults to Auto (follows the OS) or pin it under Settings → About/Language. Built on Qt .ts/.qm — new languages welcome.
🎨 Fluent Design 现代 UI / Modern Fluent UI
基于 PyQt6-Fluent-Widgets 的 Win11 风格界面,支持浅色 / 深色 / 跟随系统三种主题。
A Windows 11–style UI built on PyQt6-Fluent-Widgets with light / dark / system theme.

🧭 常用功能入口 / Where to find settings

功能 / Feature入口或设置位置 / Location说明 / Notes
AI 打轴(Beta) / AI-assisted timing打轴界面 → AI 打轴模型、设备、下载镜像、模型目录、AI 缓存和运行环境均在弹窗内设置;执行结果可撤销一次。
播放区间锁定 / Playback range locks设置 → 快捷键 → 锁定播放起点 / 锁定播放终点默认按键为 [ / ];再次触发可取消锁定。
播放头居中模式 / Centered playhead设置 → 打轴 → 波形时间标签 → 播放头居中模式默认关闭;开启后播放头固定在时间轴中央。
Karaoke 实时预览 / Live preview设置 → 界面进入该页面后自动显示;拖动标题可移动,拖动边缘可缩放。
软件界面字体 / Interface font设置 → 界面 → 界面设定 → 界面字体留空时按界面语言自动选择,修改后立即应用。
Karaoke 预览横向滚动 / Horizontal preview scrollingKaraoke 预览区域内容超宽时自动显示横向滚动条;也可按住 Alt 滚动鼠标滚轮。
最近打开的项目 / Recent projects打轴界面 → 文件管理 → 最近打开的文件最多显示 10 条记录,可在同一菜单中清空。
F2 注音快捷编辑 / Quick ruby editor设置 → 快捷键 → 字符与行编辑 → 注音编辑窗口默认 F2;可选择迷你浮窗或经典大窗口。
Kirakara 导入与导出 / Kirakara import & export导入:首页 → 导入歌词文件或打轴界面 → 文件管理 → 加载歌词;导出:导出 → 导出格式 → Kirakara支持带 config 配置块的 KRL;默认导出格式可在 设置 → 导出 → 默认导出格式 中修改。

📦 安装与运行 / Installation

🪟 支持系统 / Supported OS: Windows 10 / 11 · 🍎 macOS(实验性 / experimental)

从 Releases 页面下载完整包,解压后双击 StrangeUtaGame.exe 即可:

  • 🪟 Windows:下载 StrangeUtaGame-vX.Y.Z.zip(以版本号结尾的完整包)。
  • 🍎 macOS:按芯片下载 StrangeUtaGame-mac-arm64-vX.Y.Z.dmg(Apple Silicon)或 StrangeUtaGame-mac-intel-vX.Y.Z.dmg(Intel),详见下方注意事项。

⚠️ 认准版本号结尾的完整包,不要下载 -app / -runtime 结尾的分包(如 StrangeUtaGame-vX.Y.Z-app.zip、…-runtime.zip)。分包是应用内自动更新器给老用户做增量更新用的零件,-app 分包不含 Python 运行时,首次安装单独解压会启动失败。

Download the full archive from the Releases page, unzip, then run StrangeUtaGame.exe — Windows: StrangeUtaGame-vX.Y.Z.zip; macOS: …-mac-arm64-*.dmg (Apple Silicon) or …-mac-intel-*.dmg (Intel). Do NOT grab the -app / -runtime parts (…-vX.Y.Z-app.zip, …-runtime.zip): they are incremental-update pieces consumed by the built-in updater, and the -app part ships without the Python runtime — a fresh install from it will fail to launch.

📦 体积参考 / Approx. size: ~250 MB

🍎 macOS 注意事项 / macOS notes

macOS 版为实验性构建,使用前请留意:

  • 按芯片选择安装包 / Pick the build for your chip. Apple Silicon(M1/M2/M3…)下载 StrangeUtaGame-mac-arm64-vX.Y.Z.dmg;Intel 芯片下载 StrangeUtaGame-mac-intel-vX.Y.Z.dmg。不确定芯片类型可在「终端」执行 uname -m(arm64 = Apple Silicon,x86_64 = Intel)。装错架构会在启动时报 Bad CPU type in executable。(另有一个名为 StrangeUtaGame-mac-vX.Y.Z.zip 的旧命名包仅为老版本的更新检测保留,请勿下载。)
  • 首次打开被拦截(未签名)/ Unsigned app blocked on first launch. 应用未做 Apple 签名与公证,双击会提示「无法打开,因为无法验证开发者」。绕过方式:在 StrangeUtaGame.app 上右键 → 打开,在弹窗里再次点「打开」;或在终端执行 xattr -dr com.apple.quarantine /path/to/StrangeUtaGame.app 后再启动。
  • 无自动更新 / No auto-update. macOS 不支持应用内自动更新;检测到新版本时只会在浏览器打开 Releases 页面,需手动下载并替换旧的 .app。

macOS builds are experimental. Pick by chip: Apple Silicon → …-mac-arm64-*.dmg, Intel → …-mac-intel-*.dmg (run uname -m if unsure — arm64 = Apple Silicon, x86_64 = Intel; the wrong arch fails with Bad CPU type in executable). The app is not signed/notarized — on first launch use right-click → Open (or xattr -dr com.apple.quarantine <app>) to bypass Gatekeeper. No in-app auto-update; new versions open the Releases page in your browser for a manual download.


🛠️ 方式二 · 从源码运行 / Run from source

# 克隆仓库 / Clone
git clone https://github.com/karaoke-studio/StrangeUtaGame.git
cd StrangeUtaGame

# 创建虚拟环境(推荐) / Create a virtualenv (recommended)
python -m venv venv
venv\Scripts\activate

# 安装依赖 / Install dependencies
pip install -r requirements.txt

# 启动 / Launch
python main.py

或使用 uv(更快) / Or with uv (faster):

uv venv && source .venv/bin/activate   # Windows: .venv\Scripts\activate
uv pip install -r requirements.txt -r requirements-dev.txt
python main.py

依赖文件说明 / Dependency files. 依赖真源是锁定版本的 requirements*.txt(被发布流程做内容哈希用于增量更新,改动需谨慎);pyproject.toml 仅承载工具配置(ruff/black/mypy/pytest)。安装时按平台/变体追加其一:

  • main 变体(Windows,WinRT 注音):额外 pip install -r requirements-winrt.txt
  • noWinIME / mac 变体(sudachi 注音):额外 pip install -r requirements-variants.txt

Source of truth for deps is the pinned requirements*.txt (content-hashed by the release pipeline for incremental updates — change with care); pyproject.toml only holds tool config. Add one extra file per platform/variant as above.


📦 方式三 · 自行打包 / Build it yourself

# 安装 PyInstaller / Install PyInstaller
pip install pyinstaller

# 使用打包脚本(推荐) / Run the build script
python build.py

打包完成后可在 dist/StrangeUtaGame/ 目录找到可执行文件。
The packaged executable will appear in dist/StrangeUtaGame/.

⌨️ 键位说明 / Hotkeys

✅ 以下为打轴模式的默认键位,可在 设置 → 快捷键 中重新映射。 These are the default Timing Mode bindings. Remap them under Settings → Hotkeys.

🎯 播放与跳转 · Playback & Seek
播放 / 暂停 · Play / PauseA音频与光标同步控制
停止 · StopS停止并回到行首
从头播放 · Play from BeginningShift+S停止、回到开头并立即播放
后退 / 前进 · Seek back / forwardZ   X默认后退 2000 ms / 前进 3000 ms
减速 / 加速 · Speed − / +Q   W0.2× ~ 2.0×,变速不变调
恢复默认速度 · Reset speedE也可双击速度条
音量 − / + · Volume − / +未绑定可在快捷键设置中按需绑定
锁定播放起点 / 终点 · Lock range start / end[   ]再次按下取消锁定,操作支持撤销
🎯 打轴主操作 · Tagging
打轴 · Mark timestamp (now)D / F / Space打轴模式下:在当前字打节奏点
清除当前节奏点 · Clear timestampBackspace仅清除时间戳,不删字
停顿点标记切换 · Toggle line-end2停顿点「●」标记
打到停顿点 · Mark up to line-endP把剩余字符全部打上时间戳
切换字内节奏点 · Cycle in-char checkpointAlt+←   Alt+→在多重 check 之间切换
增加 / 减少节奏点 · Add / Remove checkpoint1   3用于字内多重 check
插入导唱符 · Insert guide symbolCtrl+1默认符号「●」
时间戳微调 ± · Nudge timestampAlt+↑   Alt+↓默认步进 10 ms
🎯 光标导航 · Navigation
上一行 / 下一行 · Prev / Next line↑   ↓—
上一字 / 下一字 · Prev / Next char←   →—
断行 · Break line hereEnter从当前光标断行
与上一行合并 · Merge into previous lineShift+Enter—
🎯 编辑 · Editing
编辑注音 · Edit ruby (furigana)F2编辑当前字注音,并可设置与下一字符连词
切换连字 · Toggle word-joinF3—
批量修改 · Bulk changeCtrl+H批量替换
修改字 / 行 · Modify char / lineJ   Ctrl+2—
插入空格 · Insert spaceM—
删除字 · Delete charDelete—
撤销 / 重做 · Undo / RedoCtrl+Z   Ctrl+Y深度命令栈
复制字 / 粘贴歌词 · Copy / PasteCtrl+C   Ctrl+V—
🎯 注音 / 演唱者 · Ruby & Singer
分析整篇注音 · Analyze all rubiesCtrl+3WinRT IME 全文跑一遍
分析选区注音 · Analyze selectedCtrl+A—
分析当前行注音 · Analyze lineCtrl+Shift+A—
按类型删除注音 · Delete rubies by typeCtrl+4按假名 / 符号 / 长音… 过滤
按行设置演唱者 · Set singer by lineCtrl+5—
应用演唱者 · Apply singerK—
🎯 工程与导出 · Project & Export
打开全文本编辑 · Open full-text editorCtrl+Tinline 整段编辑窗口
保存工程 · Save projectCtrl+S保存 .sug 工程
快速导出 · Quick exportCtrl+E按上次格式与目录一键导出

💡 还有一个独立的 编辑模式(Edit Mode):其中 Space / Backspace / . 分别用于增加节奏点、删除节奏点和切换停顿点;上表列出的是音乐播放时使用的打轴模式键位。
Edit Mode uses Space / Backspace / . to add a checkpoint, remove one, and toggle the line end. The table above lists the Timing Mode bindings used during playback.

🧰 技术栈 / Tech Stack



以上仅为代表性依赖;完整清单以仓库 requirements.txt / requirements-dev.txt 为准。
Representative deps only — see requirements.txt & requirements-dev.txt for the full list.

🗂️ 项目结构 / Project Structure

StrangeUtaGame/
├── main.py                       # 入口 / Entry point
├── build.py · build_all.py       # PyInstaller 打包脚本(单变体 / 全变体)
├── pyproject.toml                # 工具配置(ruff/black/mypy/pytest)/ Tool config
├── requirements.txt              # 运行依赖(锁定版本)/ Runtime deps (pinned)
├── requirements-winrt.txt        # main 变体:WinRT 注音 / WinRT furigana (main)
├── requirements-variants.txt     # noWinIME / mac 变体:sudachi 注音
├── requirements-dev.txt          # 开发依赖 / Dev deps
├── setup_env.bat                 # Windows 一键环境 / Win one-click setup
│
├── config.json                   # 全局配置(含快捷键 / AutoCheck / 网络源)
├── dictionary.json               # 读音词典 / Reading dictionary
├── network_dictionary.json       # 联网词典缓存 / Online dict cache
├── singers.json                  # 演唱者预设 / Singer presets
│
├── docs/                         # 设计文档 / Design docs
│   ├── application.md            #   应用层 / App layer
│   ├── architecture.md           #   总体架构 / Architecture
│   ├── auto_update.md            #   自动更新 / Auto-update
│   ├── domain.md                 #   领域模型 / Domain model
│   ├── infrastructure.md         #   基础设施 / Infrastructure
│   ├── timetag-spec-mapping.md   #   时间标签规范 / Timetag spec
│   ├── ui.md                     #   UI 设计 / UI design
│   └── 更新日志-0.2.0.md
│
├── src/strange_uta_game/         # 主包 / Main package
│   ├── __version__.py            # 版本号 + 变体标识 / Version & build variant
│   │
│   ├── backend/                  # 后端(无 Qt 依赖)/ Backend (Qt-free)
│   │   ├── domain/               #   领域层 / Domain (纯数据模型)
│   │   │   └── entities.py · models.py · project.py
│   │   ├── application/          #   应用服务 / Application services
│   │   │   ├── timing_service.py · export_service.py
│   │   │   ├── auto_check_service.py · calibration_service.py
│   │   │   ├── command_manager.py · singer_service.py
│   │   │   └── project_service.py · project_import_service.py
│   │   └── infrastructure/       #   基础设施 / Infrastructure
│   │       ├── audio/            #     音频引擎 / Audio engine
│   │       │   ├── bass_engine.py · bass_tsm_engine.py
│   │       │   ├── sounddevice_engine.py · ring_buffer.py
│   │       │   └── tsm_cache.py · keysound_player.py · video_converter.py
│   │       ├── parsers/          #     解析与注音 / Parsers & furigana
│   │       │   ├── lyric_parser.py · ass_parser.py · srt_parser.py
│   │       │   ├── ruby_analyzer.py · english_ruby.py · e2k_engine.py
│   │       │   ├── inline_format.py · annotated_text.py · romaji.py
│   │       │   └── kanji_reading_split.py · rl_dictionary.py · text_splitter.py · llm_ruby.py
│   │       ├── exporters/        #     导出器 / Exporters
│   │       │   ├── lrc_exporter.py · nicokara_exporter.py · srt_exporter.py
│   │       │   └── txt_exporter.py · txt2ass_exporter.py · inline_exporter.py
│   │       ├── data/default_dictionary.py   #   内置词典 / Built-in dict
│   │       ├── persistence/sug_io.py        #   .sug 工程读写 / Project IO
│   │       └── network_dictionary.py        #   联网词典 / Online dict
│   │
│   ├── frontend/                 # 界面层 / UI layer (PyQt6 + Fluent)
│   │   ├── main_window.py · theme.py · workers.py
│   │   ├── window_sizing.py · splash_screen.py · winrt_japanese_guide.py
│   │   ├── editor/               #   编辑器 / Editors
│   │   │   ├── timing_interface.py + timing/   #     打轴主界面 + 子组件
│   │   │   ├── fulltext_interface.py           #     全文本编辑(已废弃)
│   │   │   └── line_interface.py               #     行编辑
│   │   ├── home/ · export/ · singer/ · online/ #   起始 / 导出 / 演唱者 / 联网词典
│   │   ├── settings/             #   设置页 + cards + dialogs
│   │   ├── localization/         #   多语言 i18n (zh / en / ja)
│   │   └── startup/ · log/
│   │
│   ├── updater/                  # 自动更新器 / Auto-updater
│   │   ├── http_client.py · installer.py · manifest.py · worker.py
│   │   ├── proxy.py · settings.py · sources.py · version.py
│   │   └── ui/                   #   更新弹窗 / Update dialogs
│   │
│   ├── bass/                     # BASS DLLs(x86 + x64)/ BASS DLLs
│   ├── config/                   # 默认配置与词典 / Default config & dicts
│   │   ├── config.json · dictionary.json · singers.json
│   │   └── cmudict-0.7b · e2k.txt · kanji_readings.json
│   └── resource/                 # 图标与音效 / Icons & key sounds
│       └── icon.ico · icon.icns · mascot.png · sounds/
│
├── tests/                        # 测试 / Tests (pytest + pytest-qt)
│   ├── app/services/    · app/domain/
│   ├── infrastructure/  · ui/
│   └── updater/
│
└── scripts/                      # 杂项脚本 / Misc scripts
    ├── release.py
    ├── import_rl_builtin_dict.py
    └── migrate_dictionary*.py

📌 节略自仓库实际目录;命名 / 层级以 src/strange_uta_game/ 真实内容为准。
Compressed from the real repo layout — see src/strange_uta_game/ for the authoritative tree.

🤝 贡献指南 / Contributing

我们欢迎任何形式的贡献!
We welcome contributions of all kinds.

🐛 报 Bug / Report a bug

  1. 复现步骤、日志、系统版本
  2. 附带 logs/latest.log(如有)
  3. 在 Issues 提交

✨ 提功能 / Propose a feature

  1. 先开 Discussion 聊聊思路
  2. 通过后再写代码
  3. PR 时附带截图 / GIF

🔧 改代码 / Send a pull request

git checkout -b feat/your-idea
# ……写代码 / make changes
git commit -m "feat: your idea"
git push origin feat/your-idea

🌍 翻译 / Translate

已支持 中 / 日 / 英;新增语言可基于 src/strange_uta_game/frontend/localization/ 的 Qt .ts 资源翻译后提交。

Already in zh / ja / en — add a language by translating the Qt .ts files under frontend/localization/.

提交前请运行 ruff check . 与 pytest。
Please run ruff check . and pytest before opening a PR.

💐 致谢 / Credits

  • RhythmicaLyrics — 灵感来源与工作流原型 / Original inspiration & workflow
  • FA-Kara (moriwx) — AI 打轴对齐与注音转写思路参考(MIT)/ Forced-alignment & transcription reference for AI timing
  • yohane (Japan7) — AI 打轴 Wav2Vec2 CTC 对齐思路参考 / Wav2Vec2 CTC alignment reference for AI timing
  • BASS Audio Library (un4seen) — 低延迟音频引擎与解码 / Low-latency audio engine & decoding
  • BASS-FX — 实时音频变速 / Real-time pitch-preserving stretch
  • pedalboard (Spotify) — 音频效果与高质量变速 / Audio effects & HQ stretch
  • sounddevice · soundfile — 音频 I/O
  • PyQt6 + PyQt6-Fluent-Widgets — UI 框架 / UI framework
  • WinRT JapanesePhoneticAnalyzer — 系统 IME 注音 / System IME furigana
  • pykakasi · jaconv · pyphen — 日语 / 英文音节处理
  • CMUdict · e2k — 英文注音词典 / English pronunciation dicts
  • 所有提 issue / PR 的伙伴们 · Everyone who filed an issue or PR 💜

❓ FAQ

Q1. 为什么叫 "StrangeUtaGame"?这是音游吗?   Why "StrangeUtaGame"? Is it a rhythm game?

不是 🙅 —— 这只是个有点意思的名字。Uta 就是日语「歌」,项目本质是卡拉 OK 打轴工具,不是音游。
No 🙅 — the name is just a bit of fun. Uta means "song" in Japanese; the project is a karaoke timing tool, not a rhythm game.

Q2. 和 RhythmicaLyrics、Aegisub-kara-templater 有什么区别?   How is it different from RhythmicaLyrics or Aegisub kara-templater?
  • 相比 RL:现代 UI、毫秒级低延迟回放、无需日语转区、原生 UTF-8。
  • 相比 Aegisub kara-templater:SUG 专注「打轴」这一步,导出后再交给 Aegisub 做样式与特效,两者互补。
Q3. 支持 macOS / Linux 吗?   Does it support macOS / Linux?

目前仅官方支持 Windows 10/11。源码本身是 Python + Qt,理论上跨平台 —— 欢迎社区贡献构建脚本与测试报告。
Officially Windows 10/11 only for now. The code is Python + Qt and should be portable; build scripts & test reports for other OSes are very welcome.

Q4. 我之前的 RhythmicaLyrics工程能直接导入吗?   Can I import my existing RhythmicaLyricsproject?

支持导入 RhythmicaLyrics导出的 ASS / LRC / TXT 与 RL 编辑模式 文本格式;联网词典同时兼容 RhythmicaLyrics 官方接口,原有词典资产可直接复用。
ASS / LRC / TXT and the RL edit-mode text format from RhythmicaLyricscan be imported; the online dictionary is wire-compatible with the RhythmicaLyrics official endpoint, so your existing dictionary assets keep working.

Q5. 打开后没有声音 或 加载某个音频报错?   No sound, or an audio format fails to load?

发行版自带全套 BASS DLL(含 FLAC / OPUS / AAC / AC3 / WMA / DSD / ALAC / WebM 插件)位于 lib/;若从源码运行请保证 src/strange_uta_game/lib/ 下的插件完整。视频文件由内置 video_converter 抽轨。
The release ships the full BASS codec set (FLAC / OPUS / AAC / AC3 / WMA / DSD / ALAC / WebM) under lib/. From source, keep the DLL set at src/strange_uta_game/lib/ intact.

Q6. 自动注音怎么工作?为什么某些词的读音不准?   How does auto-furigana work? Why are some readings off?

主引擎是 Windows 系统自带的 WinRT JapanesePhoneticAnalyzer。首次运行需在 设置 → 时间和语言 → 语言 中启用 日语基本包 (Language.Basic~~~ja-JP);未启用时应用内会探测并引导安装。本地 / 联网词典会覆盖 IME 结果,遇到生僻词可补充本地词典。
The primary engine is Windows' WinRT JapanesePhoneticAnalyzer, which needs the Japanese basic IME pack. The app probes for it and guides you to install. The local + online dictionaries override IME results for tricky readings.

Q7. 联网词典不走?代理 / 镜像怎么设?   Online dictionary blocked? Proxy / mirror?

在 设置 → 网络可切换词典源(内置 RhythmicaLyrics 官方)、自定义 URL、调整源优先级。自动更新则内置 ghproxy / gh-proxy / ghproxy-net 三个 GitHub 镜像。
Under Settings → Network you can switch dictionary sources (RhythmicaLyrics official), add custom URLs, reorder priorities. The updater can route through ghproxy / gh-proxy / ghproxy-net.

Q8. 启动报 "Failed to load Python DLL '…_internal\python313.dll' LoadLibrary: 找不到指定的模块"?   Startup fails with "Failed to load Python DLL … python313.dll"?

按顺序排查:① 杀毒软件隔离了 python313.dll(到杀毒软件隔离区恢复文件,并把软件目录加入白名单);② 首次安装误用 app 分包 —— 发布资产里的 -app.zip 是给老用户增量更新用的分包(不含 Python 运行时),首次安装必须下载不带 -app / -runtime 后缀的完整 zip,用本地解压软件完整解压后再运行,勿在压缩软件预览中直接运行;③ 缺 VC++ 运行库 —— 安装 vc_redist.x64.exe(2015-2022);④ 右键 exe → 属性 → 解除锁定。
Troubleshoot in order: ① antivirus quarantined python313.dll — restore it from the quarantine and whitelist the app folder; ② first-time install used the app-only package — the
-app.zip asset is an incremental update part for existing users (no Python runtime inside); first-time installs must download the full zip without the -app / -runtime suffix and extract it fully with a local unpacker, never run it from the archiver's preview window; ③ missing VC++ runtime — install vc_redist.x64.exe (2015-2022); ④ right-click the exe → Properties → Unblock.

📜 License

本项目采用 GNU General Public License v3.0 开源。
Released under the GNU General Public License v3.0.

Copyright (C) 2026 karaoke-studio and contributors

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

SUG
点个 Star ⭐ / Give it a Star
Made with 💜 by karaoke-studio  ·  Powered by Python + PyQt6 + BASS



「打出你听见的每一个字。」
"Tag every syllable you can hear."

Significant stargazers

baka-gourd

98 followers · starred May 2026

朝倉水希

238 followers · starred May 2026