Skip to content

Commit 7387e0e

Browse files
committed
feat: 添加语音识别服务和消息队列服务
- 实现腾讯云语音识别服务集成 - 添加消息队列服务用于音频和表情处理 - 优化语音识别错误处理和重试机制 - 更新主界面组件支持语音识别功能
1 parent 8a786b6 commit 7387e0e

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

src-tauri/src/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mod http_client;
1212
use crate::logger::setup_logging;
1313
use crate::device_manager::DeviceManager;
1414
use std::sync::Arc;
15+
use tauri::Manager;
1516

1617
#[tokio::main]
1718
async fn main() -> Result<(), Box<dyn std::error::Error>> {

src/components/InteractionInterface.tsx

+77-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import {
2828
AlertDialogTitle,
2929
} from "@/components/ui/alert-dialog";
3030
import { generateBytedanceSpeech } from '@/lib/bytedanceTts';
31+
import { Switch } from "@/components/ui/switch";
32+
import { messageQueueService } from '../lib/messageQueueService';
33+
import { voiceRecognitionService } from '../lib/voiceRecognitionService';
3134

3235
const ModelName = "InteractionInterface";
3336

@@ -281,6 +284,79 @@ export const InteractionInterface: React.FC = () => {
281284
}
282285
};
283286

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+
284360
return (
285361
<div className="container max-w-[1100px] mx-auto p-6 space-y-8">
286362
<Card>
@@ -325,7 +401,7 @@ export const InteractionInterface: React.FC = () => {
325401
<label className="text-sm">语音识别</label>
326402
<Switch
327403
checked={isVoiceRecognitionEnabled}
328-
onCheckedChange={setIsVoiceRecognitionEnabled}
404+
onCheckedChange={handleVoiceRecognitionChange}
329405
/>
330406
{isRecording && <span className="text-sm text-green-500">录音中...</span>}
331407
</div>

0 commit comments

Comments
 (0)