如果从任何生命周期方法运行,Xamarin Android TextToSpeech.Speak都没有说什么

问题描述 投票:0回答:2

我正在使用TextToSpeech的实例来转换一些文本,使用Speak()方法,如下所示:

textToSpeech = new TextToSpeech(context, this, "com.google.android.tts");
textToSpeech.SetPitch(1f);
textToSpeech.SetSpeechRate(1f);
textToSpeech.Speak(textToConvert, QueueMode.Flush, null, null);

该函数运行正常且没有错误,但是当没有从生命周期方法调用该函数时,实际上只能听到语音(并且isSpeaking属性仅变为true)。

我尝试将它放在OnCreate(),OnStart()和OnResume()中都具有相同的结果,尽管如果从按钮事件调用该函数运行正常。

这是课堂的限制,还是我能解决的问题?

c# android xamarin.android
2个回答
1
投票

这是因为你在加载TTS引擎之前调用了Speak()方法。它需要一些时间来初始化。

幸运的是,TextToSpeech.IOnInitListener接口提供了一种通过OnInit()方法知道引擎何时成功加载的方法。

因此,如果您希望应用程序在OnCreate()中说话,则需要将Speak()方法移动到OnInit()方法。这是我为你准备的一个工作示例......

using Android.App;
using Android.OS;
using Android.Runtime;
using Android.Speech.Tts;

namespace XamdroidMaster.Activities {

    [Activity(ParentActivity = typeof(MainActivity), Label = "Text to Speech")]
    public class TextToSpeechActivity : Activity, TextToSpeech.IOnInitListener {

        private TextToSpeech tts;

        protected override void OnCreate(Bundle savedInstanceState) {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.TextToSpeech);

            // Create text to speech object (first parameter: context; second parameter: object implementing TextToSpeech.IOnInitListener)
            // Note that it may take a few moments for the TTS engine to initialize (OnInit() will fire when it's ready)
            tts = new TextToSpeech(this, this, "com.google.android.tts");            
        }

        public void OnInit([GeneratedEnum] OperationResult status) {
            if (status == OperationResult.Success) {
                tts.SetPitch(1f);
                tts.SetSpeechRate(1f);
                tts.Speak("Hello Luke!", QueueMode.Flush, null);
            }
        }

    }
}

此外,通过在示例中显示的OnCreate()初始化TTS引擎,您应该能够稍后在OnResume()中触发Speak()命令。

希望这可以帮助!


1
投票

问题是TTS引擎初始化需要一些时间。如果初始化未结束,则speak方法调用将失败。如果你在点击按钮上“说”某些东西,你可能不会需要这个,因为用户在按下按钮之前需要一些时间思考,初始化将结束。如果您想在初始化完成后“说”某些内容,请使用以下代码:

public class MainActivity : AppCompatActivity
{
    private static  TextView speechtext;
    private static  TextToSpeech saytext;       

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.layout1);

        speechtext = FindViewById<TextView>(Resource.Id.textView1);

        saytext = new TextToSpeech(this, new MyListener(), "com.google.android.tts");


    }

    class MyListener : Java.Lang.Object, TextToSpeech.IOnInitListener
    {

        public void OnInit([GeneratedEnum] OperationResult status)
        {
            if(status==OperationResult.Success)
            {
                saytext.SetLanguage(Locale.Us);
                saytext.SetPitch(1.5f);
                saytext.SetSpeechRate(1.5f);
                saytext.Speak(speechtext.Text, QueueMode.Flush, null, null);
            }

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.