You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:01:00