我有一个duo lingo(英语+西班牙语)android应用程序。我正在我的应用程序中实现辅助功能,我希望Talkback能够阅读西班牙语中的西班牙语单词和英语中的英语单词。英语和西班牙语单词将在单独的文本视图中。我的应用程序区域设置是英语,因此Talkback +谷歌文本到语音引擎不会读取西班牙语的西班牙语单词,它们用英语阅读,更常见的是它们的字母被读出(预期的行为)。
是否有任何解决方案或Android推荐的解决方案来实现相同的目标。
最终,我希望Talkback或自定义辅助功能服务能够用英语读出英语单词,用西班牙语读出西班牙语单词。
答案 0 :(得分:1)
免责声明:您必须非常小心这个解决方案!覆盖TalkBack的TTS行为非常非常粗略。从可访问性的角度来看,有许多边缘情况可能会使这种行为变得笨拙,笨拙且非常糟糕。仅当公告的样式是特定于应用程序和必需功能的行为时,才应使用此解决方案。否则,此解决方案会破坏与用户代理兼容的各种WCAG 2.0成功标准,从可访问性/可用性的角度来看,这通常是一个糟糕的想法!
在很多情况下,当我看到这样的问题时,我对提供答案犹豫不决,以免给开发人员提供他们不了解的工具。请不要在典型的应用程序中这样做,这是一个糟糕的主意。话虽如此,我相信这种特殊情况需要它,鉴于这种情况,这是一个非常干净的解决方案。在创建活动时,请执行以下操作:
findViewById(android.R.id.content).setAccessibilityDelegate(new View.AccessibilityDelegate() {
private TextToSpeech mTts = new TextToSpeech(MainActivity.this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
mTts.setLanguage(new Locale("es"));
//Probably other things you should do to ensure TTS is initialized before requesting it speaks something.
}
});
private boolean isSpanishView(View view) {
return true;
}
@Override
public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
switch (event.getEventType()) {
case AccessibilityEvent.TYPE_ANNOUNCEMENT:
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
if (isSpanishView(child)) {
String speakableText = null;
if (event.getText() != null) {
speakableText = event.getText().toString();
} else if (event.getContentDescription() != null) {
speakableText = event.getContentDescription().toString();
}
if (speakableText != null) {
mTts.speak(speakableText.toString(), TextToSpeech.QUEUE_ADD, null);
//Prevent the default propagation of this event, have have handled it.
return false;
}
}
}
default:
return super.onRequestSendAccessibilityEvent(host, child, event);
}
}
});
基本上我们在这里说的是将可访问性委托附加到我们活动的根视图。查看弹出的所有可访问性事件。检查是否是宣布某事的事件。如果是,请检查它是否包含西班牙文本。如果是,请允许我们的西班牙语TTS引擎宣布它,而不是允许通风口传播。在所有其他情况下让android做它的事情。
答案 1 :(得分:0)
谷歌宣布了一项更新,允许您指定要大声朗读文本的语言。这里提供了链接答案:https://stackoverflow.com/a/44461540/494879