Flutter与Java间Azure语音转文字实时数据流传输故障求助
解决方案:实时传递Azure语音转录文本到Flutter
核心问题排查
你现在的问题根源是:Java端的Event Channel事件发送逻辑没有和Azure Speech-to-Text的实时回调绑定,只能发送硬编码的固定文本,没做到在收到每一段转录结果时主动推送给Flutter。
具体修复步骤
1. 持久化保存Event Channel的事件接收器
在Android原生代码里,要把EventChannel.EventSink作为类的成员变量存起来,不能只在onListen方法里临时用,这样才能在Azure的回调里随时调用它发数据。
示例代码片段(对应你的mainjavafile.txt):
public class SpeechRecognitionPlugin implements MethodCallHandler, EventChannel.StreamHandler { private EventChannel.EventSink eventSink; // 类成员变量,保存事件接收器 @Override public void onListen(Object arguments, EventChannel.EventSink sink) { this.eventSink = sink; // 初始化时把接收器存下来 } @Override public void onCancel(Object arguments) { this.eventSink = null; // 取消监听时置空,避免内存泄漏 } }
2. 绑定Azure回调,实时发送转录文本
找到你Java端处理Azure Speech转录结果的回调方法(一般是recognized事件的监听器),每次收到转录文本时,直接调用保存的eventSink发送数据。
示例代码:
// 假设这是Azure Speech的实时转录回调逻辑 speechRecognizer.recognized.addEventListener((s, e) -> { if (e.result.getReason() == ResultReason.RecognizedSpeech) { String transcribedText = e.result.getText(); // 实时把转录文本推给Flutter if (eventSink != null) { eventSink.success(transcribedText); } } });
3. Flutter端监听事件并更新UI
确保Flutter侧的Event Channel监听逻辑正确,收到数据后立刻用setState更新文本区域(对应你的homepage.txt)。
示例Dart代码片段:
class _HomePageState extends State<HomePage> { final EventChannel _speechEventChannel = EventChannel('speech_recognition_events'); String _transcribedText = ''; @override void initState() { super.initState(); _speechEventChannel.receiveBroadcastStream().listen((event) { setState(() { _transcribedText += event + '\n'; // 把实时收到的文本追加显示 }); }, onError: (error) { print('接收语音数据出错:$error'); }); } // ... 你的录制/停止按钮点击逻辑(调用Method Channel触发原生端操作) }
4. 收尾处理:异常与资源释放
- 停止录制时,要调用Azure Speech的停止方法,同时在Java端把
eventSink置空,防止后续无效调用。 - 每次发送数据前判断
eventSink是否为空,避免空指针异常。
验证要点
- 启动录制后,检查Azure的回调是否触发,
eventSink.success()是否被调用。 - 看Flutter端能不能实时收到每一段转录文本并更新UI。
内容的提问来源于stack exchange,提问作者Ravi Prakash Gupta
相关产品推荐
相关产品推荐

