From 20079ff13d48aab9965c758eb59cd7e64c6ee60f Mon Sep 17 00:00:00 2001 From: LittleMouse Date: Fri, 30 Jan 2026 14:30:58 +0800 Subject: [PATCH] [update] update llm-asr --- projects/llm_framework/main_asr/src/main.cpp | 83 +++++++++++++++----- 1 file changed, 64 insertions(+), 19 deletions(-) diff --git a/projects/llm_framework/main_asr/src/main.cpp b/projects/llm_framework/main_asr/src/main.cpp index ee762b9..e477759 100644 --- a/projects/llm_framework/main_asr/src/main.cpp +++ b/projects/llm_framework/main_asr/src/main.cpp @@ -555,6 +555,59 @@ public: void sys_pcm_on_data_onnx(const std::string &raw) { + if (delay_audio_frame_ == 0) { + if (raw.size() < sizeof(int16_t)) return; + + const int16_t *pcm16 = reinterpret_cast(raw.data()); + size_t n16 = raw.size() / sizeof(int16_t); + + std::vector samples; + samples.reserve(n16); + for (size_t i = 0; i < n16; ++i) { + samples.push_back(static_cast(pcm16[i]) / 32768.0f); + } + + int32_t window_size = vad_config_.silero_vad.window_size; + size_t i = 0; + + while (i < samples.size()) { + if (i + window_size <= samples.size()) { + vad_->AcceptWaveform(samples.data() + i, window_size); + } else { + vad_->Flush(); + } + i += window_size; + + while (!vad_->Empty()) { + const auto &segment = vad_->Front(); + float duration = segment.samples.size() / static_cast(kSampleRate); + if (duration < 0.1f) { + vad_->Pop(); + continue; + } + + auto s = onnx_recognizer_->CreateStream(); + s->AcceptWaveform(kSampleRate, segment.samples.data(), segment.samples.size()); + onnx_recognizer_->DecodeStream(s.get()); + const auto &result = s->GetResult(); + + if (!result.text.empty()) { + if (out_callback_) out_callback_(result.text, false); + + if (!pending_text_.empty()) pending_text_ += " "; + pending_text_ += result.text; + } + + vad_->Pop(); + } + } + + if (out_callback_) out_callback_(pending_text_, true); + pending_text_.clear(); + + return; + } + if (raw.size() >= sizeof(int16_t)) { const int16_t *pcm16 = reinterpret_cast(raw.data()); size_t n16 = raw.size() / sizeof(int16_t); @@ -578,7 +631,6 @@ public: while (buffer_read_i16(pcmdata, &audio_val, 1)) { floatSamples.push_back(static_cast(audio_val) / 32768.0f); } - buffer_resize(pcmdata, 0); count = 0; @@ -600,7 +652,6 @@ public: for (int16_t s : pre_roll_pcm_) { pre.push_back(static_cast(s) / 32768.0f); } - std::vector merged; merged.reserve(pre.size() + segment.samples.size()); merged.insert(merged.end(), pre.begin(), pre.end()); @@ -619,7 +670,6 @@ public: if (!result.text.empty() && out_callback_) { out_callback_(result.text, false); } - if (!result.text.empty()) { if (!pending_text_.empty()) pending_text_ += " "; pending_text_ += result.text; @@ -629,25 +679,20 @@ public: offline_stream_.reset(); } - { - float chunk_ms = (delay_audio_frame_ + 1) * 10.0f; - if (detected) { - silence_ms_accum_ = 0.0f; - } else { - silence_ms_accum_ += chunk_ms; - } + float chunk_ms = (delay_audio_frame_ + 1) * 10.0f; + if (detected) + silence_ms_accum_ = 0.0f; + else + silence_ms_accum_ += chunk_ms; - if (silence_ms_accum_ >= silence_timeout) { - if (out_callback_) { - out_callback_(pending_text_, true); - } - pending_text_.clear(); + if (silence_ms_accum_ >= silence_timeout) { + if (out_callback_) out_callback_(pending_text_, true); + pending_text_.clear(); - if (ensleep_) { - if (pause) pause(); - } - silence_ms_accum_ = 0.0f; + if (ensleep_) { + if (pause) pause(); } + silence_ms_accum_ = 0.0f; } }