Android
텍스트 음성 변환 (TTS)
수색…
텍스트 기반 음성베이스
layout_text_to_speech.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter text here!"
android:id="@+id/textToSpeak"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/textToSpeak"
android:id="@+id/btnSpeak"/>
</RelativeLayout>
AndroidTextToSpeechActivity.java
public class AndroidTextToSpeechActivity extends Activity implements
TextToSpeech.OnInitListener {
EditText textToSpeak = null;
Button btnSpeak = null;
TextToSpeech tts;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textToSpeak = findViewById(R.id.textToSpeak);
btnSpeak = findViewById(R.id.btnSpeak);
btnSpeak.setEnabled(false);
tts = new TextToSpeech(this, this);
btnSpeak.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
speakOut();
}
});
}
@Override
public void onDestroy() {
// Don't forget to shutdown tts!
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
} else {
btnSpeak.setEnabled(true);
speakOut();
}
} else {
Log.e("TTS", "Initilization Failed!");
}
}
private void speakOut() {
String text = textToSpeak.getText().toString();
if(text == null || text.isEmpty())
return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
String utteranceId=this.hashCode() + "";
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
} else {
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
}
말할 언어는 setLanguage()
메소드에 Locale
을 제공하여 설정할 수 있습니다.
tts.setLanguage(Locale.CHINESE); // Chinese language
지원되는 언어의 수는 Android 수준에 따라 다릅니다. isLanguageAvailable()
메소드를 사용하여 특정 언어가 지원되는지 확인할 수 있습니다.
tts.isLanguageAvailable(Locale.CHINESE);
스피치 피치 레벨은 setPitch()
메소드를 사용하여 설정할 수 있습니다. 기본적으로 피치 값은 1.0입니다. 1.0보다 작은 값을 사용하여 음높이를 낮추거나 1.0보다 큰 값을 사용하여 음높이를 높이십시오.
tts.setPitch(0.6);
연설 속도는 setSpeechRate()
사용하여 설정할 수 있습니다. 기본 말하기 속도는 1.0입니다. 연설 속도는 2.0으로 설정하여 두 배가되거나 0.5로 설정하여 절반으로 만들 수 있습니다.
tts.setSpeechRate(2.0);
API를 통한 TextToSpeech 구현
TTS 엔진이 말하기를 끝내고 구독 할 때 말하기 시작하면 냉기 관찰 구현이 실현됩니다. API 레벨 21은 말하기를 수행하는 다른 방법을 소개합니다.
public class RxTextToSpeech {
@Nullable RxTTSObservableOnSubscribe audio;
WeakReference<Context> contextRef;
public RxTextToSpeech(Context context) {
this.contextRef = new WeakReference<>(context);
}
public void requestTTS(FragmentActivity activity, int requestCode) {
Intent checkTTSIntent = new Intent();
checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
activity.startActivityForResult(checkTTSIntent, requestCode);
}
public void cancelCurrent() {
if (audio != null) {
audio.dispose();
audio = null;
}
}
public Observable<Boolean> speak(String textToRead) {
audio = new RxTTSObservableOnSubscribe(contextRef.get(), textToRead, Locale.GERMANY);
return Observable.create(audio);
}
public static class RxTTSObservableOnSubscribe extends UtteranceProgressListener
implements ObservableOnSubscribe<Boolean>,
Disposable, Cancellable, TextToSpeech.OnInitListener {
volatile boolean disposed;
ObservableEmitter<Boolean> emitter;
TextToSpeech textToSpeech;
String text = "";
Locale selectedLocale;
Context context;
public RxTTSObservableOnSubscribe(Context context, String text, Locale locale) {
this.selectedLocale = locale;
this.context = context;
this.text = text;
}
@Override public void subscribe(ObservableEmitter<Boolean> e) throws Exception {
this.emitter = e;
if (context == null) {
this.emitter.onError(new Throwable("nullable context, cannot execute " + text));
} else {
this.textToSpeech = new TextToSpeech(context, this);
}
}
@Override @DebugLog public void dispose() {
if (textToSpeech != null) {
textToSpeech.setOnUtteranceProgressListener(null);
textToSpeech.stop();
textToSpeech.shutdown();
textToSpeech = null;
}
disposed = true;
}
@Override public boolean isDisposed() {
return disposed;
}
@Override public void cancel() throws Exception {
dispose();
}
@Override public void onInit(int status) {
int languageCode = textToSpeech.setLanguage(selectedLocale);
if (languageCode == android.speech.tts.TextToSpeech.LANG_COUNTRY_AVAILABLE) {
textToSpeech.setPitch(1);
textToSpeech.setSpeechRate(1.0f);
textToSpeech.setOnUtteranceProgressListener(this);
performSpeak();
} else {
emitter.onError(new Throwable("language " + selectedLocale.getCountry() + " is not supported"));
}
}
@Override public void onStart(String utteranceId) {
//no-op
}
@Override public void onDone(String utteranceId) {
this.emitter.onNext(true);
this.emitter.onComplete();
}
@Override public void onError(String utteranceId) {
this.emitter.onError(new Throwable("error TTS " + utteranceId));
}
void performSpeak() {
if (isAtLeastApiLevel(21)) {
speakWithNewApi();
} else {
speakWithOldApi();
}
}
@RequiresApi(api = 21) void speakWithNewApi() {
Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");
textToSpeech.speak(text, TextToSpeech.QUEUE_ADD, params, uniqueId());
}
void speakWithOldApi() {
HashMap<String, String> map = new HashMap<>();
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, uniqueId());
textToSpeech.speak(text, TextToSpeech.QUEUE_ADD, map);
}
private String uniqueId() {
return UUID.randomUUID().toString();
}
}
public static boolean isAtLeastApiLevel(int apiLevel) {
return Build.VERSION.SDK_INT >= apiLevel;
}
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow