Java 如何加速文本到语音的初始化
我正在开发一个应用程序,它需要使用类文本到语音来阅读文本。问题是初始化非常慢,大约4秒。我遵循了以下教程:。我做了一些研究,但我没有找到真正好的答案,或者我想念他们 例如,我尝试在线程中调用checkTTS函数,但在可见的地方没有结果。而且,他们说我的checkTTS函数的意图可能不是那么有用,我可以看看我需要的语言是否可用 所以我的问题是: 我真的可以只检查我的语言是否存在吗?动作检查TTS数据和只检查语言是否可用之间的最大区别是什么? 我能改进一下别的吗? 这是我的活动代码:Java 如何加速文本到语音的初始化,java,android,performance,initialization,text-to-speech,Java,Android,Performance,Initialization,Text To Speech,我正在开发一个应用程序,它需要使用类文本到语音来阅读文本。问题是初始化非常慢,大约4秒。我遵循了以下教程:。我做了一些研究,但我没有找到真正好的答案,或者我想念他们 例如,我尝试在线程中调用checkTTS函数,但在可见的地方没有结果。而且,他们说我的checkTTS函数的意图可能不是那么有用,我可以看看我需要的语言是否可用 所以我的问题是: 我真的可以只检查我的语言是否存在吗?动作检查TTS数据和只检查语言是否可用之间的最大区别是什么? 我能改进一下别的吗? 这是我的活动代码: public
public class MyActivity extends Activity {
private Speaker _speaker;
private final int CHECK_CODE = 0x1;
private final int SHORT_DURATION = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("I'm just before checkTTS");
checkTTS();
}
private void checkTTS(){
System.out.println("I'm in checkTTS");
Intent check = new Intent();
check.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(check, CHECK_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == CHECK_CODE){
if(resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){
System.out.println("I'm in onActivityResult");
_speaker = new Speaker(this);
}else {
Intent install = new Intent();
install.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(install);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
_speaker.destroy();
}
}
这是我的演讲者课程:
public class Speaker implements OnInitListener {
private TextToSpeech _tts;
private boolean _ready = false;
private boolean _allowed = false;
public Speaker(Context context){
_tts = new TextToSpeech(context, this);
}
public void setSpeedRate(float speechrate) {
_tts.setSpeechRate(speechrate);
}
public boolean isAllowed(){
return _allowed;
}
public void allow(boolean allowed){
_allowed = allowed;
}
@Override
public void onInit(int status) {
System.out.println("I'm in onInit from Speaker");
if(status == TextToSpeech.SUCCESS){
_tts.setLanguage(Locale.UK);
_ready = true;
} else{
_ready = false;
}
}
public void speak(String text){
if(_ready && _allowed) {
HashMap<String, String> hash = new HashMap<String,String>();
hash.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION));
_tts.speak(text, TextToSpeech.QUEUE_ADD, hash);
}
}
public boolean isSpeaking() {
return _tts.isSpeaking();
}
public void pause(int duration){
_tts.playSilence(duration, TextToSpeech.QUEUE_ADD, null);
}
public void stop() {
_tts.stop();
}
public void destroy(){
_tts.shutdown();
}
}
谢谢你的帮助,
顺致敬意,
Zed13
Ps:对不起,我犯了错误
编辑:有趣的事实是,三星voices比谷歌voices推出得更快
根据操作,检查TTS数据从平台TextToSpeech引擎启动活动,以验证系统上资源文件的正确安装和可用性。在这种情况下,在您收到CHECK\u VOICE\u DATA\u PASS之前创建TTS实例是没有意义的。或者,如果出于某种原因,您确信系统已安装所需的TTS资源,您可以使用乐观的方法,即跳过此步骤,例如在onCreate方法中初始化TTS实例,然后检查or。由于您正在跳过一个步骤操作\u检查\u TTS\u数据,如果一切都成功,您的初始化将更快。
您可以检查系统中安装的引擎,并使用该信息启动更准确的操作检查数据意图
从性能的角度来看,代码的其余部分看起来不错。但是,请记住,您可以同时启动操作\u检查\u TTS\u数据意图和初始化TTS实例!如果缺少某些内容,则意图已经启动,TTS将无法按预期工作。如果设备拥有所有TTS资源,则意向将通过,TTS已初始化。你可以把它作为这种行为的一个例子;
我做了修改,赢了2秒。所以现在我的问题是,认为TTS将安装在android 4.0或更高版本的智能手机上是否乐观?在我的Galaxy S3上,在Galaxy Tab 2和xperia上没有问题。如果你看一看,虽然所有支持TTS功能的Android设备都附带了引擎,但有些设备的存储空间有限,可能缺少特定于语言的资源文件。如果用户想要安装这些资源,TTS API允许应用程序查询平台上语言文件的可用性,并可以启动语言文件的下载和安装。因此,在创建活动时,最好的第一步是检查TTS资源是否存在。它在三星voices上工作得更快的原因是三星手机默认使用三星TTSEngine,它不像谷歌TTS引擎那样具有初始化延迟。说到这里,你找到解决问题的办法了吗?
15:14:58.897: D/dalvikvm(23966): GC_CONCURRENT freed ...
15:15:00.014: I/System.out(23966): I'm just before checkTTS
15:15:00.014: I/System.out(23966): I'm in checkTTS
15:15:00.046: D/AbsListView(23966): unregisterIRListener() is called
15-13 15:15:01.272: I/System.out(23966): I'm in onActivityResult
15:15:01.311: I/TextToSpeech(23966): Sucessfully bound to com.samsung.SMT
15:15:01.663: D/AbsListView(23966): onVisibilityChanged() is called, visibility : 4
15:15:01.663: D/AbsListView(23966): unregisterIRListener() is called
15:15:02.600: I/TextToSpeech(23966): Connected to ComponentInfo{com.samsung.SMT/...}
15:15:02.608: I/TextToSpeech(23966): onServiceConnected but waiting
15:15:02.608: I/System.out(23966): I'm in onInit from Speaker
15:15:02.616: I/System.out(23966): Speaker ready
15:15:02.616: I/TextToSpeech(23966): onServiceConnected waiting end