@@ -28,6 +28,9 @@ import {
28
28
AlertDialogTitle ,
29
29
} from "@/components/ui/alert-dialog" ;
30
30
import { generateBytedanceSpeech } from '@/lib/bytedanceTts' ;
31
+ import { Switch } from "@/components/ui/switch" ;
32
+ import { messageQueueService } from '../lib/messageQueueService' ;
33
+ import { voiceRecognitionService } from '../lib/voiceRecognitionService' ;
31
34
32
35
const ModelName = "InteractionInterface" ;
33
36
@@ -281,6 +284,79 @@ export const InteractionInterface: React.FC = () => {
281
284
}
282
285
} ;
283
286
287
+ const handleSendToApp = async ( ) => {
288
+ try {
289
+ logger . log ( `Starting app submission with prompt: ${ prompt } ` , 'INFO' , ModelName ) ;
290
+
291
+ const result = await generateResponse ( prompt ) ;
292
+ logger . log ( `Generated response: ${ JSON . stringify ( result ) } ` , 'INFO' , ModelName ) ;
293
+ setResponse ( result ) ;
294
+
295
+ const audioBuffer = await generateAudioForResponse ( result . response , selectedVoice ) ;
296
+ logger . log ( `Generated speech buffer size: ${ audioBuffer . byteLength } ` , 'DEBUG' , ModelName ) ;
297
+ setAudioBuffer ( audioBuffer ) ;
298
+
299
+ // 发送到消息队列
300
+ await messageQueueService . addMessage (
301
+ result . kaomoji || 'neutral' ,
302
+ audioBuffer
303
+ ) ;
304
+ logger . log ( 'Message added to app queue successfully' , 'INFO' , ModelName ) ;
305
+
306
+ } catch ( error ) {
307
+ logger . log ( `Error in app submission: ${ error } ` , 'ERROR' , ModelName ) ;
308
+ }
309
+ } ;
310
+
311
+ // 处理语音识别结果
312
+ const handleVoiceResult = ( text : string ) => {
313
+ setPrompt ( text ) ;
314
+ } ;
315
+
316
+ const handleVoiceRecognitionChange = async ( enabled : boolean ) => {
317
+ setIsVoiceRecognitionEnabled ( enabled ) ;
318
+ try {
319
+ if ( enabled ) {
320
+ setIsRecording ( true ) ;
321
+ // 初始化并启动语音识别
322
+ await voiceRecognitionService . initialize ( ) ;
323
+ await voiceRecognitionService . start ( handleVoiceResult ) ;
324
+
325
+ // 添加事件监听
326
+ voiceRecognitionService . addEventListener ( {
327
+ onError : ( error ) => {
328
+ logger . log ( `Voice recognition error: ${ error } ` , 'ERROR' , ModelName ) ;
329
+ setIsRecording ( false ) ;
330
+ setIsVoiceRecognitionEnabled ( false ) ;
331
+ } ,
332
+ onDisconnected : ( ) => {
333
+ setIsRecording ( false ) ;
334
+ setIsVoiceRecognitionEnabled ( false ) ;
335
+ }
336
+ } ) ;
337
+ } else {
338
+ setIsRecording ( false ) ;
339
+ // 停止语音识别
340
+ await voiceRecognitionService . stop ( ) ;
341
+ voiceRecognitionService . removeEventListener ( ) ;
342
+ }
343
+ } catch ( error ) {
344
+ logger . log ( `Error handling voice recognition: ${ error } ` , 'ERROR' , ModelName ) ;
345
+ setIsRecording ( false ) ;
346
+ setIsVoiceRecognitionEnabled ( false ) ;
347
+ }
348
+ } ;
349
+
350
+ // 组件卸载时清理
351
+ useEffect ( ( ) => {
352
+ return ( ) => {
353
+ if ( isVoiceRecognitionEnabled ) {
354
+ voiceRecognitionService . stop ( ) ;
355
+ voiceRecognitionService . removeEventListener ( ) ;
356
+ }
357
+ } ;
358
+ } , [ isVoiceRecognitionEnabled ] ) ;
359
+
284
360
return (
285
361
< div className = "container max-w-[1100px] mx-auto p-6 space-y-8" >
286
362
< Card >
@@ -325,7 +401,7 @@ export const InteractionInterface: React.FC = () => {
325
401
< label className = "text-sm" > 语音识别</ label >
326
402
< Switch
327
403
checked = { isVoiceRecognitionEnabled }
328
- onCheckedChange = { setIsVoiceRecognitionEnabled }
404
+ onCheckedChange = { handleVoiceRecognitionChange }
329
405
/>
330
406
{ isRecording && < span className = "text-sm text-green-500" > 录音中...</ span > }
331
407
</ div >
0 commit comments