我像这样调用
Voice.getName()
方法:
Set<Voice> voices = tts.getVoices();
String name = voice.getName();
这将返回代码名称而不是友好的显示名称。我想要的是一个显示名称,但似乎没有任何方法可以得到这个。
是否可以将代码翻译成有意义的内容来创建用户友好的名称?并消除重复项?很多听起来很相似——但只是有点不同。
这些是为英国英语返回的一些代码:
en-GB-language
en-gb-x-rjs-local
en-gb-x-rjs-network
en-gb-x-fis-local
en-gb-x-fis-network
en-gb-x-fis#female_1-local
en-gb-x-rjs#female_1-local
en-gb-x-rjs#female_2-local
en-gb-x-fis#female_2-local
en-gb-x-rjs#male_1-local
到目前为止我的想法:
rjs
和fis
重复很多,并且适用于男性和女性,但仅适用于英国英语。似乎每种语言都有一组或两组不同的 3 个字母首字母缩写 - 也许它是一个区域代码。 en-gb-x-rjs#male_1-local
和en-gb-x-rjs-local
是相同的有人对这些有更深入的了解吗?
这可能有帮助,也可能没有帮助,但对于那些不直接使用 Android 的人来说,因此无法访问列出语音代码的 API,我刚刚在论坛线程上找到了这个 URL,它似乎列出了 URL Android TTS 语音:
https://dl.google.com/dl/android/tts/v2/voices-list-r1.proto
将其读取为文本(utf-8)会出现一些解码错误,但这足以提取代码:
en-GBGhttps://dl.google.com/dl/android/tts/v2/en-gb-x-fis-phone-hmm-r2.zvoice ����dBfemaleJen-gb-x-fis-phone-hmmP�X�`hen-GB #1x�$�
en-GBJhttps://dl.google.com/dl/android/tts/v2/en-gb-x-fis-diphone-usel-r2.zvoice ؾ0���dBfemaleJen-gb-x-fis-diphone-uselP�X�`hen-GB #1x��
en-GBGhttps://dl.google.com/dl/android/tts/v2/en-gb-x-rjs-phone-hmm-r2.zvoice �0���dBmaleJen-gb-x-rjs-phone-hmmP�X�`hen-GB #2x��
en-GBJhttps://dl.google.com/dl/android/tts/v2/en-gb-x-rjs-diphone-usel-r2.zvoice ��0���dBmaleJen-gb-x-rjs-diphone-uselP�X�`hen-GB #2x���
en-USGhttps://dl.google.com/dl/android/tts/v2/en-us-x-sfg-phone-hmm-r2.zvoice �*0���dBfemaleJen-us-x-sfg-phone-hmmP�X�`hren-USx�6�
en-USJhttps://dl.google.com/dl/android/tts/v2/en-us-x-sfg-diphone-usel-r4.zvoice ��
0���dBfemaleJen-us-x-sfg-diphone-uselP�X�`hren-USx���
de-DEGhttps://dl.google.com/dl/android/tts/v2/de-de-x-nfh-phone-hmm-r2.zvoice �"0���dBfemaleJde-de-x-nfh-phone-hmmP�X�`hrde-DEx�+�
pt-BRGhttps://dl.google.com/dl/android/tts/v2/pt-br-x-afs-phone-hmm-r2.zvoice ����dBfemaleJpt-br-x-afs-phone-hmmP�X�`hrpt-BRx�#�
es-ESGhttps://dl.google.com/dl/android/tts/v2/es-es-x-ana-phone-hmm-r2.zvoice �#0���dBfemaleJes-es-x-ana-phone-hmmP�X�`hres-ESx�.�
es-USGhttps://dl.google.com/dl/android/tts/v2/es-us-x-sfb-phone-hmm-r2.zvoice �*0���dBfemaleJes-us-x-sfb-phone-hmmP�X�`hres-USx�6�
fr-FRGhttps://dl.google.com/dl/android/tts/v2/fr-fr-x-vlf-phone-hmm-r2.zvoice �.0���dBfemaleJfr-fr-x-vlf-phone-hmmP�X�`hrfr-FRx�>�
it-ITGhttps://dl.google.com/dl/android/tts/v2/it-it-x-kda-phone-hmm-r2.zvoice �,0���dBfemaleJit-it-x-kda-phone-hmmP�X�`hrit-ITx�>�
ko-KRGhttps://dl.google.com/dl/android/tts/v2/ko-kr-x-ism-phone-hmm-r2.zvoice �00���dBfemaleJko-kr-x-ism-phone-hmmP�X�`hrko-KRx�:
我仍然不知道这些代码的含义,但至少这给了我语言代码和
fis
、rjs
等代码之间的映射,所以这是一个开始。
在我的 flutter 开发中,我使用以下包通过传递“locale”来获取人类可读的名称。也许您可以查看该包代码并重建您自己的代码以制作友好的显示名称。
TTS 包:https://pub.dev/packages/flutter_tts
区域设置名称扩展包:https://pub.dev/packages/locale_names
飞镖代码:
String getHumanVoiceName(String locale) {
String name = locale;
List subs = locale.split("-");
Locale? _locale;
if (subs.length == 1) {
_locale = Locale.fromSubtags(languageCode: subs[0]);
} else if (subs.length == 2) {
_locale = Locale.fromSubtags(languageCode: subs[0], countryCode: subs[1]);
} else if (subs.length == 3) {
_locale = Locale.fromSubtags(
languageCode: subs[0], scriptCode: subs[1], countryCode: subs[2]);
}
name =
"${_locale!.nativeDisplayCountry} (${_locale!.defaultDisplayLanguage})";
return name;
}