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

如何设置.NET MAUI Community Toolkit的SpeechToText无语音后自动结束监听?

在.NET MAUI中实现SpeechToText无语音3秒后自动结束监听

可以实现这个需求。由于.NET MAUI Community Toolkit的ISpeechToText没有直接提供静音超时的配置项,我们可以通过结合计时器+语音识别的实时结果事件来自行封装逻辑,具体实现步骤如下:

  • 初始化核心对象
    首先注入或实例化ISpeechToText,同时创建一个DispatcherTimer用于监控静音时长,将计时器间隔设置为3秒。

  • 绑定语音识别事件
    利用ISpeechToText的PartialResultReceived事件(该事件会在识别到实时语音片段时触发),每次收到结果就重置计时器——这意味着用户仍在说话;如果计时器走完3秒未被重置,则判定用户已停止说话,触发停止监听操作。

  • 处理生命周期逻辑
    在开始监听时启动计时器,停止监听时销毁计时器,避免内存泄漏。

代码示例

using Microsoft.Maui.Controls;
using CommunityToolkit.Maui.Media;
using System.Globalization;
using System.Windows.Threading;

public class SpeechRecognitionPage : ContentPage
{
    private readonly ISpeechToText _speechToText;
    private DispatcherTimer _silenceTimer;

    public SpeechRecognitionPage(ISpeechToText speechToText)
    {
        _speechToText = speechToText;
        InitializeTimer();
        BindSpeechEvents();

        // 页面UI按钮示例
        var startBtn = new Button { Text = "开始识别" };
        startBtn.Clicked += async (s, e) => await StartListeningAsync();

        var stopBtn = new Button { Text = "手动停止" };
        stopBtn.Clicked += async (s, e) => await StopListeningAsync();

        Content = new VerticalStackLayout { Children = { startBtn, stopBtn } };
    }

    private void InitializeTimer()
    {
        _silenceTimer = new DispatcherTimer();
        _silenceTimer.Interval = TimeSpan.FromSeconds(3);
        _silenceTimer.Tick += async (s, e) =>
        {
            await StopListeningAsync();
        };
    }

    private void BindSpeechEvents()
    {
        _speechToText.PartialResultReceived += (s, e) =>
        {
            // 收到实时语音片段,重置计时器
            _silenceTimer.Stop();
            _silenceTimer.Start();
        };
    }

    private async Task StartListeningAsync()
    {
        if (await _speechToText.RequestPermissionsAsync())
        {
            _silenceTimer.Start();
            await _speechToText.StartListenAsync(CultureInfo.CurrentCulture);
        }
    }

    private async Task StopListeningAsync()
    {
        _silenceTimer.Stop();
        if (_speechToText.IsListening)
        {
            await _speechToText.StopListenAsync();
            // 处理最终识别结果
            var result = _speechToText.RecognitionResult;
        }
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        _silenceTimer?.Stop();
        _silenceTimer = null;
    }
}

注意事项

  • 部分平台的原生语音识别服务可能有自身的静音检测逻辑,上述代码是在上层做的统一超时处理,兼容性更好。
  • 确保在页面销毁时及时停止并释放计时器,防止内存泄漏。

内容的提问来源于stack exchange,提问作者jagger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:52:29