@@ -104,11 +104,12 @@ public sealed class EnhancedAudioCaptureService : IDisposable
104104 // 意图识别和草稿管理
105105 private IntentRecognizer _intentRecognizer ;
106106 private TaskDraftManager _draftManager ;
107+ private VoiceReminderTimeParser _reminderTimeParser ;
107108
108109 // VAD 参数 - 更保守的配置
109- private readonly double _energyThresholdDb = - 30.0 ; // 能量阈值,-30dBFS 表示要有一定音量
110- private readonly int _minStartMs = 500 ; // 连续高能量达到 500ms 才开始录音
111- private readonly int _hangoverMs = 1500 ; // 录音进行中, 连续低能量达到 1.5s 才停止
110+ private double _energyThresholdDb = - 30.0 ; // 能量阈值,-30dBFS 表示要有一定音量
111+ private int _minStartMs = 260 ; // 连续高能量达到 260ms 即可开始,减少首句漏检
112+ private int _hangoverMs = 900 ; // 连续低能量达到 900ms 即停止,提升响应速度
112113 private int _consecAboveMs = 0 ;
113114 private int _consecBelowMs = 0 ;
114115 private DateTime _lastAudioStateSpeech = DateTime . MinValue ;
@@ -128,6 +129,7 @@ public EnhancedAudioCaptureService(TimeSpan? silenceTimeout = null, float confid
128129
129130 _intentRecognizer = new IntentRecognizer ( ) ;
130131 _draftManager = new TaskDraftManager ( ) ;
132+ _reminderTimeParser = new VoiceReminderTimeParser ( ) ;
131133 _speechModelManager = new SpeechModelManager ( ) ;
132134 _modelBootstrapTask = _speechModelManager . EnsureReadyAsync ( ) ;
133135 _autoAddVoiceTasks = ReadBoolSetting ( "VoiceAutoAddToQuadrant" , false ) ;
@@ -155,6 +157,9 @@ public EnhancedAudioCaptureService(TimeSpan? silenceTimeout = null, float confid
155157 _funAsrWorkerStartupTimeoutSeconds = ReadIntSetting ( "FunAsrWorkerStartupTimeoutSeconds" , 600 ) ;
156158 _funAsrUsePersistentWorker = ReadBoolSetting ( "FunAsrUsePersistentWorker" , true ) ;
157159 _funAsrMinSegmentSeconds = ReadDoubleSetting ( "FunAsrMinSegmentSeconds" , 0.5 ) ;
160+ _energyThresholdDb = ReadDoubleSetting ( "VoiceEnergyThresholdDb" , - 30.0 ) ;
161+ _minStartMs = ReadIntSetting ( "VoiceVadMinStartMs" , 260 ) ;
162+ _hangoverMs = ReadIntSetting ( "VoiceVadHangoverMs" , 900 ) ;
158163 if ( _funAsrEnabled )
159164 {
160165 VoiceRuntimeLog . Info ( $ "EnhancedAudioCaptureService ctor: requesting FunASR bootstrap task. provider={ _asrProvider } ") ;
@@ -437,6 +442,12 @@ private TaskDraft ProcessPotentialTask(string text, float confidence)
437442 if ( string . IsNullOrWhiteSpace ( cleanedText ) )
438443 return null ;
439444
445+ DateTime ? reminderTime = null ;
446+ if ( _reminderTimeParser != null && _reminderTimeParser . TryParse ( text , DateTime . Now , out DateTime parsedTime ) )
447+ {
448+ reminderTime = parsedTime ;
449+ }
450+
440451 // 估计优先级
441452 var ( importance , urgency ) = _intentRecognizer . EstimatePriority ( cleanedText ) ;
442453
@@ -448,6 +459,8 @@ private TaskDraft ProcessPotentialTask(string text, float confidence)
448459 {
449460 RawText = text ,
450461 CleanedText = cleanedText ,
462+ ReminderTime = reminderTime ,
463+ ReminderHintText = reminderTime . HasValue ? reminderTime . Value . ToString ( "yyyy-MM-dd HH:mm" ) : null ,
451464 Importance = importance ,
452465 Urgency = urgency ,
453466 EstimatedQuadrant = quadrant ,
@@ -456,8 +469,8 @@ private TaskDraft ProcessPotentialTask(string text, float confidence)
456469
457470 _draftManager . AddDraft ( draft ) ;
458471
459- Console . WriteLine ( $ "[EnhancedAudioCaptureService] Task draft created: \" { cleanedText } \" (Quadrant: { quadrant } , Conf: { confidence : P0} )") ;
460- VoiceRuntimeLog . Info ( $ "Task draft created from voice. text={ cleanedText } , quadrant={ quadrant } , conf={ confidence : F2} ") ;
472+ Console . WriteLine ( $ "[EnhancedAudioCaptureService] Task draft created: \" { cleanedText } \" (Quadrant: { quadrant } , Conf: { confidence : P0} , Reminder: { reminderTime ? . ToString ( "yyyy-MM-dd HH:mm" ) ?? "none" } )") ;
473+ VoiceRuntimeLog . Info ( $ "Task draft created from voice. text={ cleanedText } , quadrant={ quadrant } , conf={ confidence : F2} , reminder= { reminderTime ? . ToString ( "o" ) ?? "none" } ") ;
461474 return draft ;
462475 }
463476 catch ( Exception ex )
@@ -1008,14 +1021,20 @@ private void HandleRecognizedText(string rawText, float confidence, string sourc
10081021
10091022 bool isSystemFallback = _classicFallbackEnabled && string . Equals ( source , "system-speech" , StringComparison . OrdinalIgnoreCase ) ;
10101023 double taskLikelihood = _intentRecognizer . ScoreTaskLikelihood ( text ) ;
1024+ bool reminderLike = _intentRecognizer . IsReminderLike ( text ) ;
10111025 float minConfidence = isSystemFallback
10121026 ? Math . Max ( 0.05f , _confidenceThreshold * 0.12f )
1013- : _confidenceThreshold * 0.55f ;
1027+ : _confidenceThreshold * 0.45f ;
1028+
1029+ if ( reminderLike )
1030+ {
1031+ minConfidence = Math . Max ( 0.15f , minConfidence * 0.6f ) ;
1032+ }
10141033
1015- if ( confidence < minConfidence && taskLikelihood < 0.55 && ! _intentRecognizer . IsReminderLike ( text ) )
1034+ if ( confidence < minConfidence && taskLikelihood < 0.45 && ! reminderLike )
10161035 return ;
10171036
1018- if ( _intentRecognizer . IsPotentialTask ( text ) || _intentRecognizer . IsReminderLike ( text ) )
1037+ if ( _intentRecognizer . IsPotentialTask ( text ) || reminderLike )
10191038 {
10201039 TotalPotentialTasks ++ ;
10211040 var draft = ProcessPotentialTask ( text , confidence ) ;
@@ -1114,6 +1133,7 @@ private void TryAutoAddTaskToQuadrant(TaskDraft draft, float confidence)
11141133 IsActive = true ,
11151134 CreatedDate = DateTime . Now ,
11161135 LastModifiedDate = DateTime . Now ,
1136+ ReminderTime = draft . ReminderTime ,
11171137 IsActiveInQuadrant = true ,
11181138 InactiveWarningCount = 0 ,
11191139 Result = string . Empty
0 commit comments