我正在使用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()中都具有相同的结果,尽管如果从按钮事件调用该函数运行正常。
这是课堂的限制,还是我能解决的问题?
这是因为你在加载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()命令。
希望这可以帮助!
问题是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);
}
}
}
}