import 'dart:async'; import 'dart:typed_data'; /// 音频源类型 enum AudioSourceType { microphone, // 使用设备麦克风 systemAudio, // 使用系统音频(麦克风也启动保证后台也能正常运行) systemAudioPlusMicrophone, // 使用系统音频+麦克风音频 external // 使用外部提供的音频数据 } /// 语音识别服务接口 abstract class AsrService { /// 支持的语言 List get supportedLanguages; /// 初始化语音识别服务 Future initialize({ List? supportedLanguages, }); /// 执行一次性语音识别 /// /// 返回识别的最终结果 Future recognizeOnce(); /// 开始连续语音识别 /// /// 返回一个包含识别事件的流 Future startContinuousRecognition( bool audioSourceType, { bool isRemoveFirstPunctuation = true, String mode = "normal", }); /// 停止连续语音识别 Future stopContinuousRecognition(); /// 设置识别回掉 /// /// 返回一个包含识别事件的流 Future> recognizeCallback(); /// 恢复原始音频状态 Future restoreOriginalAudioState(); /// 禁用蓝牙音频 Future disableBluetoothAudio(); /// 检查连续识别是否活跃 bool isContinuousRecognitionActive(); /// 开始录音 /// /// [filePath] 录音文件路径 /// [audioSourceType] 音频源类型 /// [acceptAudioData] 是否接受音频数据回调,默认为 false Future enableRecord( AudioSourceType audioSourceType, String filePath, bool acceptAudioData, ); /// 获取音频数据流(如果支持) Stream? getAudioDataStream() => null; /// 暂停录音 Future pauseRecord(); /// 继续录音 Future resumeRecord(); /// 设置音频配置 Future setAudioConfig({ int sampleRate = 16000, int channels = 1, }); // /// 移动文件到新路径 Future moveFile(String sourcePath, String destPath); // /// 重命名指定路径的音频文件 Future renameFile(String filePath, String newName); /// 结束录音 Future stopRecord(bool isSave); /// 释放资源 Future dispose(); } /// 识别事件类型 enum RecognitionEventType { /// 最终识别结果 finalResult, /// 麦识别结果 finalResult1, /// 中间识别结果(实时反馈) intermediateResult, /// 会话开始 sessionStarted, /// 会话结束 sessionStopped, /// 识别取消 canceled, /// 识别错误 error, } /// 识别事件 class RecognitionEvent { /// 事件类型 final RecognitionEventType type; /// 识别文本(仅在 finalResult 和 intermediateResult 类型中有效) final String text; /// 检测到的语言 final String detectedLanguage; final String provider; /// 角色 final String role; /// 原始音频 final Uint8List? audio; /// 错误信息(仅在 error 和 canceled 类型中有效) final String error; RecognitionEvent({ required this.type, this.text = '', this.detectedLanguage = '', this.provider = '', this.role = '', this.audio, this.error = '', }); /// 创建最终结果事件的快捷构造函数 factory RecognitionEvent.finalResult({ required String text, String detectedLanguage = '', String provider = '', }) { return RecognitionEvent( type: RecognitionEventType.finalResult, text: text, detectedLanguage: detectedLanguage, provider: provider, ); } /// 创建错误事件的快捷构造函数 factory RecognitionEvent.error(String errorMessage) { return RecognitionEvent( type: RecognitionEventType.error, error: errorMessage, ); } /// 检查是否为最终结果 bool get isFinalResult => type == RecognitionEventType.finalResult; /// 检查是否为错误 bool get isError => type == RecognitionEventType.error || type == RecognitionEventType.canceled; @override String toString() { return 'RecognitionEvent{type: $type, provider: $provider, text: $text, detectedLanguage: $detectedLanguage, error: $error}'; } }