@@ -73,7 +73,7 @@ pub(crate) struct LiveLoopCtx<'a> {
7373pub ( crate ) fn run_audio_loop (
7474 rx : mpsc:: Receiver < AudioChunk > ,
7575 mut audio : crate :: capture:: AudioLoopbackCapture ,
76- ctx : LiveLoopCtx < ' _ > ,
76+ mut ctx : LiveLoopCtx < ' _ > ,
7777 data_dir : & std:: path:: Path ,
7878) {
7979 let mut asr_health = crate :: asr_health:: AsrHealthMonitor :: new ( ) ;
@@ -124,70 +124,28 @@ pub(crate) fn run_audio_loop(
124124 // deadline 早已过期,宽限从未生效;改为 draining 置位时才起算(Option<Instant>)
125125 let mut drain_deadline: Option < Instant > = None ;
126126 let mut draining = false ;
127- // 2026-08 A1:暂停边沿跟踪(false→true 断句隔离;暂停期捕获线程停采,
128- // channel 空 → recv_timeout 空转,无需显式消费处理)
129- let mut loop_paused = ctx. pause . paused . load ( Ordering :: SeqCst ) ;
127+ // 批 2a:暂停边沿收敛域(live_session_pause.rs)——可见边沿 flush_no_rescore
128+ // 断句 + seq 漏边沿代数补偿 + 合成事件对;本循环只留编排调用。
129+ // @ai-context: 暂停期捕获线程停采 → channel 空 → recv_timeout 空转,无需显式消费
130+ let mut pause_view = crate :: live_session_pause:: PauseEdgeView :: new ( ctx. pause ) ;
130131 loop {
131- // ── 暂停边沿(2026-08 A1 )──
132+ // ── 暂停边沿(批 2a:检测+应用收敛于 live_session_pause.rs )──
132133 // @ai-context: 时间戳 = 会话时间(epoch - 已补偿暂停时长)——暂停开始
133134 // 时补偿尚未累计(正确,时间轴冻结点);恢复时补偿已更新
134135 // (时间戳回到冻结点附近,时间轴无缝衔接)。
135- let paused_now = ctx. pause . paused . load ( Ordering :: SeqCst ) ;
136- if paused_now != loop_paused {
137- let now_ms = ctx. epoch . elapsed ( ) . as_millis ( ) as u64
138- - ctx. pause . total_paused_ms . load ( Ordering :: SeqCst ) ;
139- if paused_now {
140- // 进入暂停(P2 增强:替代"喂 100ms 静音"方案——静音块不足以触发
141- // sherpa 端点规则(rule1 需 2.4s 尾静音),句无法断开;flush 尾句
142- // 落库 + reset 重建流才能保证暂停前后的语音不连句,恢复后干净开始)
143- // REQ-154(v0.7.2 S-1):动态合并阈值先算(借用释放后再构造 ctx)
144- let merge_gap_ms = crate :: asr_merge:: adaptive_merge_gap (
145- pause_history. iter ( ) . copied ( ) ,
146- ) ;
147- flush_tail_and_persist (
148- FinalEventCtx {
149- app : ctx. app ,
150- db : ctx. db ,
151- session_id : ctx. session_id ,
152- asr_segments : ctx. asr_segments ,
153- sentence_start_ms : & mut sentence_start_ms,
154- last_speech_ms : & mut last_speech_ms,
155- last_final_clean : & mut last_final_clean,
156- pending_merge : & mut pending_merge,
157- last_segment_end : & mut last_segment_end,
158- // REQ-154(v0.7.2 S-1/S-2):停顿历史/动态阈值/语速基准
159- pause_history : & mut pause_history,
160- merge_gap_ms,
161- last_speech_rate : & mut last_speech_rate,
162- } ,
163- ctx. asr_engine ,
164- now_ms,
165- & mut sentence_rms_sum,
166- & mut sentence_rms_count,
167- ) ;
168- // 重建流(reset 预留给复用场景:清句音频/状态,热词重读)
169- ctx. asr_engine . reset ( ) ;
170- // REQ-154(v0.7.2 S-2):暂停边沿重置语速基准——恢复后首段与
171- // 暂停前比较会跨暂停区间误判语速骤变(暂停时长不计入段间)
172- last_speech_rate = None ;
173- let _ = ctx. db . add_event ( & crate :: session_events:: NewSessionEvent :: simple (
174- ctx. session_id ,
175- crate :: session_events:: EventKind :: Pause ,
176- now_ms,
177- ) ) ;
178- let _ = ctx. app . emit ( "live:paused" , ( ) ) ;
179- eprintln ! ( "[LiveSession] 会话 {} 暂停 @{}ms" , ctx. session_id, now_ms) ;
180- } else {
181- let _ = ctx. db . add_event ( & crate :: session_events:: NewSessionEvent :: simple (
182- ctx. session_id ,
183- crate :: session_events:: EventKind :: Resume ,
184- now_ms,
185- ) ) ;
186- let _ = ctx. app . emit ( "live:resumed" , ( ) ) ;
187- eprintln ! ( "[LiveSession] 会话 {} 恢复 @{}ms" , ctx. session_id, now_ms) ;
188- }
189- loop_paused = paused_now;
190- }
136+ crate :: live_session_pause:: detect_and_apply_pause_edges (
137+ & mut pause_view,
138+ & mut ctx,
139+ & mut sentence_start_ms,
140+ & mut last_speech_ms,
141+ & mut last_final_clean,
142+ & mut pending_merge,
143+ & mut last_segment_end,
144+ & mut pause_history,
145+ & mut last_speech_rate,
146+ & mut sentence_rms_sum,
147+ & mut sentence_rms_count,
148+ ) ;
191149 // H1 修复:deadline 在 draining 置位时才起算(见声明处注释),此处
192150 // 仅在已置位的情况下判定到期;None 表示尚未进入 drain 阶段
193151 if draining
@@ -423,6 +381,8 @@ pub(crate) fn run_audio_loop(
423381 stop_now_ms,
424382 & mut sentence_rms_sum,
425383 & mut sentence_rms_count,
384+ // 停止路径保留 SenseVoice 重打分(与端点同质量兜底;暂停边沿才跳过)
385+ true ,
426386 ) ;
427387 audio. stop ( ) ;
428388
0 commit comments