refactor: split core/ui/apps targets and add unit tests
Move all business logic into liblivecaption_core (no Qt dependency) and the widgets into liblivecaption_ui, leaving two executables: the caption window and the CLI, which no longer links Qt Widgets. Abstract the ASR backend behind IAsr so the streaming policy and the live pipeline can be tested with a scripted fake backend instead of a real model. 把全部业务逻辑下沉到不依赖 Qt 的 liblivecaption_core,界面独立成 liblivecaption_ui,拆出悬浮窗与命令行两个可执行程序(CLI 不再链接 Qt Widgets);并用 IAsr 抽象推理后端,使流式策略与实时管线可脱离真模型 用假实现做单元测试。测试还抓到一个真 bug:段恰好结束在 chunk 边界时 只提交了稳定部分,最后几个词被丢掉,已修。
This commit is contained in:
1 parent
4ed4e23282
commit
736ec14d5b
32 files changed
+1502
-655
No files matched your search
@@ -33,24 +33,40 @@ aria2c -x16 -s16 -k4M -o mmproj-Qwen3-ASR-0.6B-Q8_0.gguf "$B/mmproj-Qwen3-ASR-0.
|
||||
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build build -j
|
||||
|
||||
# 3. 单文件转写
|
||||
./build/live-caption-cli \
|
||||
--model Qwen3-ASR-0.6B-Q8_0.gguf \
|
||||
--mmproj mmproj-Qwen3-ASR-0.6B-Q8_0.gguf \
|
||||
--file some_16k_mono.wav
|
||||
|
||||
# 4. 实时字幕
|
||||
./build/live-caption-cli \
|
||||
# 3. 悬浮字幕窗
|
||||
./build/live-caption \
|
||||
--model Qwen3-ASR-0.6B-Q8_0.gguf \
|
||||
--mmproj mmproj-Qwen3-ASR-0.6B-Q8_0.gguf
|
||||
|
||||
# 4. 命令行:单文件转写 / 流式转写 / 无窗口实时
|
||||
./build/live-caption-cli --model M --mmproj MM --file some_16k_mono.wav
|
||||
./build/live-caption-cli --model M --mmproj MM --stream-file some_16k_mono.wav
|
||||
./build/live-caption-cli --model M --mmproj MM --cli-live
|
||||
|
||||
# 5. 单元测试(不需要模型,也不需要显示环境)
|
||||
ctest --test-dir build --output-on-failure
|
||||
```
|
||||
|
||||
## 目录
|
||||
## 代码结构
|
||||
|
||||
```
|
||||
├─ src/ # 原型源码
|
||||
├─ docs/ # 各阶段验证报告
|
||||
└─ experiments/
|
||||
├─ phase0/ # 可行性验证脚本(采集/RTF/模型元数据)
|
||||
└─ phase1/ # 命令行原型说明与实机测试脚本
|
||||
src/core/ → liblivecaption_core(静态库,**不依赖 Qt**)
|
||||
iasr.h 推理后端抽象(便于用假实现测流式策略)
|
||||
transcript.{h,cpp} 输出解析、语言名映射
|
||||
audio.{h,cpp} monitor 采集 / WAV 读取 / 重采样
|
||||
qwen3asr.{h,cpp} 进程内推理(libllama + libmtmd)
|
||||
streamingasr.{h,cpp} 流式策略(8s 切片复用、前缀回滚、分段)
|
||||
vad.h 能量 VAD
|
||||
livepipeline.{h,cpp} 实时管线:采集→VAD→分段→流式转写
|
||||
src/ui/ → liblivecaption_ui(静态库,Qt6::Widgets)
|
||||
captionwindow.{h,cpp} 悬浮字幕窗
|
||||
livetranscriber.{h,cpp} LivePipeline 的 Qt 适配器(只转信号)
|
||||
apps/gui/ → live-caption (悬浮窗程序)
|
||||
apps/cli/ → live-caption-cli (命令行程序,只链 Qt6::Core)
|
||||
apps/common/ 两个程序共用的命令行选项
|
||||
tests/ → 单元测试(QtTest,只链 core)
|
||||
docs/ 各阶段说明与验证报告
|
||||
experiments/ Phase 0/1 的验证脚本
|
||||
```
|
||||
|
||||
拆分的意义:**业务逻辑全在 core 且不依赖 Qt**,所以流式策略、VAD、输出解析这些最容易出错的部分可以脱离真模型和显示环境做单元测试;GUI 与 CLI 各自独立演进,CLI 也不再需要链接 Qt Widgets。
|
||||
Reference in new issue
Block a user