godot-tts/src/main/java/games/lightsout/godot/tts/TTS.java

108 lines
3.1 KiB
Java
Raw Normal View History

2019-12-30 18:57:19 +00:00
package games.lightsout.godot.tts;
import java.util.Arrays;
2020-09-30 20:13:17 +00:00
import java.util.HashSet;
2020-05-28 17:05:21 +00:00
import java.util.List;
2020-09-30 20:13:17 +00:00
import java.util.Set;
2020-05-28 17:05:21 +00:00
import org.godotengine.godot.Godot;
import org.godotengine.godot.plugin.GodotPlugin;
2020-09-30 20:13:17 +00:00
import org.godotengine.godot.plugin.SignalInfo;
2020-05-28 17:05:21 +00:00
import android.accessibilityservice.AccessibilityServiceInfo;
2019-12-30 18:57:19 +00:00
import android.content.Context;
import android.speech.tts.TextToSpeech;
2020-09-30 20:13:17 +00:00
import android.speech.tts.UtteranceProgressListener;
2020-05-28 17:05:21 +00:00
import android.view.accessibility.AccessibilityManager;
public class TTS extends GodotPlugin implements TextToSpeech.OnInitListener {
2019-12-30 18:57:19 +00:00
private TextToSpeech tts = null;
2020-05-28 17:05:21 +00:00
private float rate = 1f;
private Integer utteranceId = 0;
2019-12-30 18:57:19 +00:00
2020-09-30 20:13:17 +00:00
public int speak(String text, boolean interrupt) {
2019-12-30 18:57:19 +00:00
int mode = TextToSpeech.QUEUE_ADD;
if (interrupt)
mode = TextToSpeech.QUEUE_FLUSH;
tts.speak(text, mode, null, this.utteranceId.toString());
2020-09-30 20:13:17 +00:00
int rv = this.utteranceId.intValue();
this.utteranceId++;
2020-09-30 20:13:17 +00:00
return rv;
2019-12-30 18:57:19 +00:00
}
public void stop() {
tts.stop();
}
public float get_rate() {
2020-05-28 17:05:21 +00:00
return this.rate;
}
2020-05-28 17:29:44 +00:00
public void set_rate(float rate) {
2020-05-28 17:05:21 +00:00
this.rate = rate;
tts.setSpeechRate(rate);
}
public boolean is_speaking() {
return tts.isSpeaking();
}
2020-05-28 17:05:21 +00:00
public boolean has_screen_reader() {
AccessibilityManager accessibilityManager = (AccessibilityManager) getActivity()
2020-05-28 17:05:21 +00:00
.getSystemService(Context.ACCESSIBILITY_SERVICE);
if (accessibilityManager != null) {
List<AccessibilityServiceInfo> screenReaders = accessibilityManager
.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN);
2020-05-28 17:05:21 +00:00
return screenReaders.size() != 0;
} else {
2020-05-28 17:05:21 +00:00
return false;
}
2020-05-28 17:05:21 +00:00
}
2020-09-30 20:13:17 +00:00
class Listener extends UtteranceProgressListener {
public void onStart(String utteranceId) {
Integer id = Integer.parseInt(utteranceId);
TTS.this.emitSignal("utterance_begin", id);
}
public void onDone(String utteranceId) {
Integer id = Integer.parseInt(utteranceId);
TTS.this.emitSignal("utterance_end", id);
}
public void onError(String utteranceId) {
Integer id = Integer.parseInt(utteranceId);
TTS.this.emitSignal("utterance_end", id);
}
}
public TTS(Godot godot) {
super(godot);
this.tts = new TextToSpeech(this.getActivity(), this);
2020-09-30 20:13:17 +00:00
tts.setOnUtteranceProgressListener(new Listener());
2019-12-30 18:57:19 +00:00
}
@Override
public String getPluginName() {
return "GodotTTS";
2019-12-30 18:57:19 +00:00
}
@Override
public List<String> getPluginMethods() {
return Arrays.asList("speak", "stop", "get_rate", "set_rate", "has_screen_reader", "is_speaking");
2019-12-30 18:57:19 +00:00
}
2020-09-30 20:13:17 +00:00
@Override
public Set<SignalInfo> getPluginSignals() {
SignalInfo begin = new SignalInfo("utterance_begin", Integer.class);
SignalInfo end = new SignalInfo("utterance_end", Integer.class);
return new HashSet(Arrays.asList(begin, end));
}
2019-12-30 18:57:19 +00:00
public void onInit(int status) {
}
}