feat: add real-time caption CLI prototype with Qwen3-ASR
Add a C++/Qt6/CMake CLI prototype that captures the default sink monitor through libpulse and transcribes it in-process with Qwen3-ASR via libllama/libmtmd. Add phase 0/1 verification docs. 新增实时字幕命令行原型:libpulse 采集默认输出 monitor,进程内用 libllama/libmtmd 跑 Qwen3-ASR 推理。附阶段 0/1 验证文档。
This commit is contained in:
commit
18dbc9c8d3
18 files changed
+1682
No files matched your search
@@ -0,0 +1,84 @@
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
project(live-caption LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
|
||||
endif()
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# llama.cpp / libmtmd 的搜索路径
|
||||
#
|
||||
# Debian/Deepin 把 llama 的 CMake config 放在非标准目录 cmake-private/,
|
||||
# 而 pkg-config 的 llama.pc 又漏了 -lmtmd。所以这里把两个路径都塞进搜索前缀,
|
||||
# 并单独用 find_library 找 mtmd。
|
||||
# ---------------------------------------------------------------------------
|
||||
foreach(_p
|
||||
/usr/lib/x86_64-linux-gnu/llama
|
||||
/usr/lib/x86_64-linux-gnu/llama/cmake-private
|
||||
/usr/lib/x86_64-linux-gnu/llama/pkgconfig)
|
||||
if(EXISTS "${_p}")
|
||||
list(APPEND CMAKE_PREFIX_PATH "${_p}")
|
||||
set(ENV{PKG_CONFIG_PATH} "${_p}:$ENV{PKG_CONFIG_PATH}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
find_package(Qt6 REQUIRED COMPONENTS Core)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
pkg_check_modules(SAMPLERATE REQUIRED IMPORTED_TARGET samplerate)
|
||||
pkg_check_modules(PULSE REQUIRED IMPORTED_TARGET libpulse)
|
||||
|
||||
# --- llama:优先系统 pkg-config,其次 CMake config,最后 FetchContent 兜底 ---
|
||||
pkg_check_modules(LLAMA QUIET IMPORTED_TARGET llama)
|
||||
if(LLAMA_FOUND)
|
||||
set(LC_LLAMA_TARGET PkgConfig::LLAMA)
|
||||
message(STATUS "llama: 使用系统 pkg-config (${LLAMA_VERSION})")
|
||||
else()
|
||||
message(STATUS "llama: 系统未找到,改用 FetchContent 拉取固定版本")
|
||||
include(FetchContent)
|
||||
set(FETCHCONTENT_TRY_FIND_PACKAGE_MODE ALWAYS) # 先 find_package,失败再拉源码
|
||||
FetchContent_Declare(llama
|
||||
GIT_REPOSITORY https://github.com/ggml-org/llama.cpp.git
|
||||
GIT_TAG b9951
|
||||
FIND_PACKAGE_ARGS NAMES llama CONFIG)
|
||||
set(LLAMA_BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
||||
set(LLAMA_BUILD_SERVER OFF CACHE BOOL "" FORCE)
|
||||
set(LLAMA_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
||||
FetchContent_MakeAvailable(llama)
|
||||
set(LC_LLAMA_TARGET llama)
|
||||
endif()
|
||||
|
||||
# --- mtmd:llama.pc 里没有,单独找 ---
|
||||
find_library(LC_MTMD_LIB NAMES mtmd
|
||||
HINTS /usr/lib/x86_64-linux-gnu/llama)
|
||||
if(NOT LC_MTMD_LIB)
|
||||
message(FATAL_ERROR "找不到 libmtmd(应随 libllama0 一起安装)")
|
||||
endif()
|
||||
message(STATUS "mtmd: ${LC_MTMD_LIB}")
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
add_executable(live-caption-cli
|
||||
src/main.cpp
|
||||
src/transcript.cpp
|
||||
src/qwen3asr.cpp
|
||||
src/audio.cpp
|
||||
)
|
||||
|
||||
target_include_directories(live-caption-cli PRIVATE src)
|
||||
|
||||
target_link_libraries(live-caption-cli PRIVATE
|
||||
Qt6::Core
|
||||
Threads::Threads
|
||||
PkgConfig::SAMPLERATE
|
||||
PkgConfig::PULSE
|
||||
${LC_LLAMA_TARGET}
|
||||
${LC_MTMD_LIB}
|
||||
)
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
target_compile_options(live-caption-cli PRIVATE -Wall -Wextra -Wno-unused-parameter)
|
||||
endif()
|
||||
Reference in new issue
Block a user