feat(stream): add append-only streaming mode with flat cost

Add an append-only streaming path that feeds each audio chunk as a new
conversation turn, so nothing is ever recomputed: the KV grows by
append, no prefix is re-decoded and no audio is re-encoded. Per-step
cost becomes flat instead of growing with the segment (RTF 1.06 -> 0.26
on 62.6s of continuous speech), but accuracy requires ~8s chunks because
the audio encoder needs its 8s attention window, so text only appears
every 8s. The incremental mode stays the default.

新增追加式流式:每块音频作为一个新的对话轮追加,前缀不重算、旧音频不重
编码,单步成本不再随段落增长(连续 62.6s 语音 RTF 从 1.06 降到 0.26)。
但准确率要求 chunk≈8s,否则会被截断,所以出字粒度是 8s;增量式仍为默认。
This commit is contained in:
blumia committed 2026-10-12 14:22:29 +08:00
1 parent 7e5257429a
commit 85b206f1cd
10 files changed
+330 -18

No files matched your search

+4 -3
View File
@@ -72,12 +72,13 @@ int runStreamFile(lc::Qwen3Asr & asr, const QString & path, const lc::StreamOpti
const size_t chunkSamples = (size_t) (sop.chunkSec * asr.sampleRate());
const auto onStep = [](const lc::StreamingAsr::Step & s) {
std::printf("\n[chunk %2d] 窗口 %5.1fs / 编码 %5.2fs / 本步 %5.2fs%s\n",
s.chunkIndex, s.windowSeconds, s.encodeSeconds, s.inferSeconds,
std::printf("\n[chunk %2d] 累计 %5.1fs | 音频 %5.2fs | 前缀 %5.2fs | 生成 %5.2fs (%d tok) "
"| 合计 %5.2fs%s\n",
s.chunkIndex, s.windowSeconds, s.encodeSeconds, s.prefillSeconds,
s.genSeconds, s.newTokens, s.inferSeconds,
s.ok ? "" : " <失败>");
if (!s.ok) std::printf(" error: %s\n", s.error.c_str());
std::printf(" 已提交: %s\n", s.committed.c_str());
std::printf(" 含尾部: %s\n", s.full.c_str());
std::fflush(stdout);
};