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

基于Azure的Unity语音识别应用:自然触发与循环识别问询

实现Azure语音识别的自然对话模式与定时循环监听

针对你的需求,有两种直接可行的实现方案:

一、贴近自然对话的自动识别模式

Azure Speech SDK的连续识别支持端点检测,不需要手动触发按钮或关键词,当检测到你开始说话时自动采集音频,停止说话后(静音达到设定时长)自动返回识别结果,然后持续监听下一次说话,完全贴近自然对话流程。

核心是配置SpeechRecognizer的端点检测参数,修改你的连续识别代码如下:

using Microsoft.CognitiveServices.Speech;
using UnityEngine;

public class AzureSpeechManager : MonoBehaviour
{
    private SpeechRecognizer speechRecognizer;

    async void Start()
    {
        var config = SpeechConfig.FromSubscription("你的订阅密钥", "区域");
        speechRecognizer = new SpeechRecognizer(config);

        // 配置端点检测:说话停止后多久结束当前识别(单位:毫秒)
        // 比如设置为1500ms,即停止说话1.5秒后返回结果
        speechRecognizer.EndSilenceTimeoutMs = 1500;
        // 可选:设置开始说话前的静音超时,避免误触发
        speechRecognizer.BabbleTimeoutMs = 2000;

        // 绑定识别结果回调
        speechRecognizer.Recognized += OnSpeechRecognized;
        // 绑定会话开始/结束回调,便于调试
        speechRecognizer.SessionStarted += (s, e) => Debug.Log("开始监听麦克风");
        speechRecognizer.SessionStopped += (s, e) => Debug.Log("停止监听麦克风");

        // 启动连续识别
        await speechRecognizer.StartContinuousRecognitionAsync().ConfigureAwait(true);
    }

    private void OnSpeechRecognized(object sender, SpeechRecognitionEventArgs e)
    {
        if (e.Result.Reason == ResultReason.RecognizedSpeech)
        {
            Debug.Log($"识别结果:{e.Result.Text}");
            // 这里可以直接调用TTS接口返回响应,实现对话流程
        }
        else if (e.Result.Reason == ResultReason.NoMatch)
        {
            Debug.Log("未识别到有效语音");
        }
    }

    void OnDestroy()
    {
        // 销毁时停止识别并释放资源
        speechRecognizer?.StopContinuousRecognitionAsync().Wait();
        speechRecognizer?.Dispose();
    }
}

注意:Unity中UI操作和Debug.Log需要在主线程执行,所以启动识别时用ConfigureAwait(true)确保回调回到主线程,或者如果你的项目用了异步主线程工具,也可以按需调整。

二、定时10秒录制+循环监听模式

如果需要固定录制时长(比如10秒),录制完成后返回结果,然后自动重启监听,可以通过Task.Delay配合停止/重启连续识别来实现:

using Microsoft.CognitiveServices.Speech;
using UnityEngine;
using System.Threading.Tasks;

public class AzureTimedSpeechManager : MonoBehaviour
{
    private SpeechRecognizer speechRecognizer;

    async void Start()
    {
        var config = SpeechConfig.FromSubscription("你的订阅密钥", "区域");
        speechRecognizer = new SpeechRecognizer(config);
        speechRecognizer.Recognized += OnSpeechRecognized;

        // 启动循环监听任务
        _ = StartTimedRecognitionLoop();
    }

    private async Task StartTimedRecognitionLoop()
    {
        while (true)
        {
            Debug.Log("开始10秒录制...");
            await speechRecognizer.StartContinuousRecognitionAsync().ConfigureAwait(true);
            
            // 等待10秒后停止录制
            await Task.Delay(10000).ConfigureAwait(true);
            
            await speechRecognizer.StopContinuousRecognitionAsync().ConfigureAwait(true);
            Debug.Log("10秒录制结束,等待结果...");

            // 可选:等待结果返回后再延迟几秒重启,避免频繁触发
            await Task.Delay(1000).ConfigureAwait(true);
        }
    }

    private void OnSpeechRecognized(object sender, SpeechRecognitionEventArgs e)
    {
        if (e.Result.Reason == ResultReason.RecognizedSpeech)
        {
            Debug.Log($"10秒录制识别结果:{e.Result.Text}");
        }
    }

    void OnDestroy()
    {
        speechRecognizer?.StopContinuousRecognitionAsync().Wait();
        speechRecognizer?.Dispose();
    }
}

这种模式下,每10秒自动停止一次识别,返回结果后1秒重新启动监听,循环往复。如果需要更精准的录制控制,也可以结合AudioClip录制,但Azure SDK本身的定时停止已经足够满足需求。

关键注意点

  • 确保Azure Speech SDK的版本兼容Unity,建议使用官方提供的Unity包
  • 订阅密钥和区域要正确配置,避免认证失败
  • 处理好资源释放,在场景销毁时停止识别并释放SpeechRecognizer实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:17:06