基于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
相关产品推荐
相关产品推荐

