为什么我的文本转语音的 onRangeStart() 方法没有执行?
Why my onRangeStart() method of text to speech is not executing?
我正在开发文本转语音应用程序,文本转语音工作正常,但现在我想在语音转文本引擎朗读每个单词时突出显示它。
但是,我已经重写了 onRangeStart() 方法,但实际上,它没有在我的设备(API-25)及以下设备中执行。
Text to Speech 在所有设备上都运行良好,但文本仅在 26+ API 设备中突出显示(在 TTS 处理时)。为什么会这样?如何使此功能向后兼容?
这是我的代码。
已实现 OnInitListener()
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {...
**这里是 onInit(){...}
@Override
public void onInit(int i) {
if (i == TextToSpeech.SUCCESS) {
int result = mTTS.setLanguage(Locale.ENGLISH);
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "Language not supported");
} else {
mButtonSpeak.setEnabled(true);
}
} else {
Log.e("TTS", "Initialization failed");
}
mTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String s) { Log.d("TTS", "onStart: "+s); }
@Override
public void onDone(String s) { Log.d("TTS", "onDone: "); }
@Override
public void onError(String s) { Log.d("TTS", "onError: "); }
@Override
public void onRangeStart(String utteranceId, final int start, final int end, int frame) {
super.onRangeStart(utteranceId, start, end, frame);
Log.d(TAG, "onRangeStart: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Spannable coloredText = new SpannableString(mTextParagraph.getText());
coloredText.setSpan(new ForegroundColorSpan(Color.GREEN),
start,
end,
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
mTextParagraph.setText(coloredText);
Log.d(TAG, "Color: ");
}
});
}
});
}
这是因为 onRangeStart 是 added in API 26。因此,不幸的是,它不适用于 API 25.
我正在开发文本转语音应用程序,文本转语音工作正常,但现在我想在语音转文本引擎朗读每个单词时突出显示它。
但是,我已经重写了 onRangeStart() 方法,但实际上,它没有在我的设备(API-25)及以下设备中执行。
Text to Speech 在所有设备上都运行良好,但文本仅在 26+ API 设备中突出显示(在 TTS 处理时)。为什么会这样?如何使此功能向后兼容? 这是我的代码。
已实现 OnInitListener()
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {...
**这里是 onInit(){...}
@Override
public void onInit(int i) {
if (i == TextToSpeech.SUCCESS) {
int result = mTTS.setLanguage(Locale.ENGLISH);
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "Language not supported");
} else {
mButtonSpeak.setEnabled(true);
}
} else {
Log.e("TTS", "Initialization failed");
}
mTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String s) { Log.d("TTS", "onStart: "+s); }
@Override
public void onDone(String s) { Log.d("TTS", "onDone: "); }
@Override
public void onError(String s) { Log.d("TTS", "onError: "); }
@Override
public void onRangeStart(String utteranceId, final int start, final int end, int frame) {
super.onRangeStart(utteranceId, start, end, frame);
Log.d(TAG, "onRangeStart: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Spannable coloredText = new SpannableString(mTextParagraph.getText());
coloredText.setSpan(new ForegroundColorSpan(Color.GREEN),
start,
end,
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
mTextParagraph.setText(coloredText);
Log.d(TAG, "Color: ");
}
});
}
});
}
这是因为 onRangeStart 是 added in API 26。因此,不幸的是,它不适用于 API 25.