Android 语音名称/代码的含义是什么?

问题描述 投票:0回答:2

我像这样调用

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 个字母首字母缩写 - 也许它是一个区域代码。
  • 您可能认为 Female1 和 Female2 是不同的配音人才,但她们的表现力似乎略有不同。
  • 我认为
    en-gb-x-rjs#male_1-local
    en-gb-x-rjs-local
    是相同的
  • 所有返回的品质均为 400。

有人对这些有更深入的了解吗?

android text-to-speech
2个回答
1
投票

这可能有帮助,也可能没有帮助,但对于那些不直接使用 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
等代码之间的映射,所以这是一个开始。


0
投票

在我的 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.