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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:27:54