如何判断Xamarin中TTS语音合成是否完成?
判断Xamarin Android TTS朗读完成的解决方案
嗨,我来帮你搞定这个TTS完成状态判断的问题~ 官方示例里确实没包含这个监听逻辑,不过我们可以通过UtteranceProgressListener来实现这个需求,具体步骤如下:
1. 自定义TTS进度监听器
首先创建一个继承自UtteranceProgressListener的子类,用来监听朗读的开始、完成和错误事件:
public class MyTtsListener : UtteranceProgressListener { private readonly Action _onDoneCallback; private readonly Action<string> _onErrorCallback; public MyTtsListener(Action onDone, Action<string> onError) { _onDoneCallback = onDone; _onErrorCallback = onError; } // 朗读完成时触发 public override void OnDone(string utteranceId) { // 切换回UI线程执行回调(避免跨线程更新UI报错) Android.App.Application.SynchronizationContext.Post(_ => _onDoneCallback?.Invoke(), null); } // 朗读出错时触发 public override void OnError(string utteranceId) { Android.App.Application.SynchronizationContext.Post(_ => _onErrorCallback?.Invoke(utteranceId), null); } // 可选:朗读开始时的处理逻辑 public override void OnStart(string utteranceId) { // 比如更新UI显示"正在朗读..." } }
2. 给TTS实例绑定监听器
在你的MainActivity里,找到TTS初始化成功的回调(也就是OnInit方法),添加监听器的绑定:
public void OnInit(OperationResult status) { if (status.Equals(OperationResult.Success)) { // 初始化成功后,创建并绑定监听器 var ttsListener = new MyTtsListener( onDone: () => { // 这里写TTS完成后的业务逻辑,比如: Toast.MakeText(this, "朗读完成啦!", ToastLength.Short).Show(); // 触发助手的下一个任务,比如等待用户输入 }, onError: (utteranceId) => { Toast.MakeText(this, $"朗读出错啦,任务ID:{utteranceId}", ToastLength.Short).Show(); } ); textToSpeech.SetOnUtteranceProgressListener(ttsListener); } }
3. 调用Speak时传入唯一任务ID
每次调用TTS朗读时,需要传入一个唯一的utteranceId,这样监听器才能准确识别是哪个朗读任务完成了:
// 要朗读的文本 var speechText = "欢迎使用简易助手!"; // 生成唯一ID(用Guid就行) var uniqueUtteranceId = Guid.NewGuid().ToString(); // 构造参数字典,传入utteranceId var speechOptions = new Dictionary<string, string>(); speechOptions.Add(TextToSpeech.Engine.KeyParamUtteranceId, uniqueUtteranceId); // 开始朗读 textToSpeech.Speak(speechText, QueueMode.Flush, speechOptions);
这样一来,每当TTS完成一次朗读,OnDone方法就会触发,你就能在回调里处理后续逻辑啦~
内容的提问来源于stack exchange,提问作者Adrián Mera
相关产品推荐
相关产品推荐

