Add native streaming ASR: 8s-aligned audio slices are cached in the KV cache, only new audio is encoded, and the previous text is fed back as an assistant prefix with token rollback. Text matches offline results. Streaming keeps each step within the 2s budget for segments up to 20s. 新增原生流式解码:8s 对齐的音频切片存入 KV 复用,只编码新音频,并把 上一轮文本作为 assistant 前缀回喂(带 token 回滚)。转写结果与离线 一致;20s 以内的段落每步计算都在 2s 预算内。
86 lines
2.9 KiB
CMake
86 lines
2.9 KiB
CMake
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/streamingasr.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()
|