该存储库是一个更大项目的一部分,旨在确定在阅读应用程序中实现朗读功能的最佳实践。
默认情况下,各种浏览器和操作系统都有数百种可用的语音,因此开发人员提供合理的默认值和精选的语音列表可能会很棘手。
该项目专注于语音选择,其目标是记录各种平台上可用的更高质量的语音,并提供一种使用 JSON 配置文件实施这些建议的简单方法。
提供基于 Readium Speech 项目的现场演示。
该演示实现了语音选择的最佳实践以及该存储库中的数据。
该项目的目标是支持 Windows 和 macOS 上可用的所有 43 种语言。
目前,它涵盖 43 种语言:
另一方面,该项目还确定了一些应从语音选择器组件中过滤掉的语音。
其中一些对整体阅读体验有害,而另一些则在有更好的预加载选项的平台上质量非常低。
JSON 模式可用于验证或有兴趣为新语言或语音添加打开 PR 的潜在贡献者。
每个推荐的语音都需要label
,并为每个语音提供一个人性化的标签。
该字符串针对目标语言进行了本地化,通常包含以下信息:
示例 1:Microsoft Natural 语音
虽然微软记录的自然声音名称很容易理解,但它们往往很长,而且都是英语本地化的。
{
"label" : " Isabella (Italia) " ,
"name" : " Microsoft Isabella Online (Natural) - Italian (Italy) " ,
"language" : " it-IT "
}
示例 2:Chrome 操作系统声音
Chrome 操作系统通过其 Android 子系统提供了许多高质量的声音,但它们给最终用户带来了一些可能最糟糕的名称。
{
"label" : " Female voice 1 (US) " ,
"name" : " Android Speech Recognition and Synthesis from Google en-us-x-tpc-network " ,
"language" : " en-US "
}
每个推荐的语音都需要name
,它被用作本项目中语音的主要标识符。
名称在浏览器中大多是稳定的,这意味着对于大多数声音来说,单个字符串就足够了。
但不幸的是,也有一些异常情况:Android、iOS、iPadOS 和 macOS 的声音。
对于这些声音,字符串的至少一部分通常是本地化的,跨浏览器的命名可能不一致,并且它们可能会根据安装的变体数量而变化。
因此,每个列表还可以包含以下属性:
altNames
包含给定语音的备用字符串数组localizedName
标识用于本地化这些语音的字符串模式示例 3:Apple 预加载语音的替代版本
{
"label" : " Samantha (US) " ,
"name" : " Samantha " ,
"localizedName" : " apple " ,
"altNames" : [
" Samantha (Enhanced) " ,
" Samantha (English (United States)) "
],
"language" : " en-US "
}
每个推荐的语音都需要language
。
它包含 BCP 47 语言标签,其中小写的两个字母的语言代码后跟大写的两个字母的国家/地区代码。
语言和国家/地区代码使用连字符 (-) 分隔。
有些语音还能够处理另一种语言,例如美国的西班牙语语音也可能能够处理英语。
因此, additionalLanguages
属性也可用,尽管现在很少使用它。
它包含仅使用两个字母代码的语言列表,没有子标签。
微软的一些全新声音也能够进行多语言输出。句子中间不支持语言切换,但输出似乎能够自动检测每个句子的语言并相应地采用自己的语言。
为了支持这一点,输出可能会在此过程中自动切换到不同的声音。
这些声音是使用multiLingual
布尔值来识别的。
示例 4:多语言输出的语音
{
"label" : " Emma (US) " ,
"name" : " Microsoft EmmaMultilingual Online (Natural) - English (United States) " ,
"language" : " en-US " ,
"multiLingual" : true
}
示例 5:能够处理第二语言的语音
{
"label" : " Sylvie (Canada) " ,
"name" : " Microsoft Sylvie Online (Natural) - French (Canada) " ,
"language" : " fr-CA " ,
"otherLanguages" : [
" en "
]
}
gender
是每个声音的可选属性,记录与每个声音相关的性别。
支持以下值: female
、 male
或neutral
。
children
也是可选的,并使用布尔值识别儿童的声音。
例6:女童声
{
"label" : " Ana (US) " ,
"name" : " Microsoft Ana Online (Natural) - English (United States) " ,
"language" : " en-US " ,
"gender" : " female " ,
"children" : true
}
quality
是每个语音的可选属性,它记录了语音各种变体的质量。
支持以下值:
示例 7:Apple 语音具有三种质量变体
{
"label" : " Ava (US) " ,
"name" : " Ava " ,
"note" : " This voice can be installed on all Apple devices and offers three variants. Like all voices that can be installed on Apple devices, it suffers from inconsistent naming due to localization. " ,
"altNames" : [
" Ava (Premium) " ,
" Ava (Enhanced) " ,
" Ava (English (United States)) " ,
],
"language" : " en-US " ,
"gender" : " female " ,
"quality" : [
" low " ,
" normal " ,
" high "
],
"rate" : 1 ,
"pitch" : 1 ,
"os" : [
" macOS " ,
" iOS " ,
" iPadOS "
]
}
os
和browser
都是可选属性。它们用于指示哪些操作系统和浏览器可以使用语音。
这两个属性应该单独解释,而不是作为组合来解释。
示例 8:Edge 和 Windows 中均提供 Microsoft 语音
{
"label" : " Denise (France) " ,
"name" : " Microsoft Denise Online (Natural) - French (France) " ,
"note" : " This voice is preloaded in Edge on desktop. In other browsers, it requires the user to run Windows 11 and install the voice pack. " ,
"language" : " fr-FR " ,
"gender" : " female " ,
"os" : [
" Windows "
],
"browser" : [
" Edge "
]
}
此外, preloaded
表示语音是否已预加载到已识别的所有操作系统和浏览器中。
使用当前方法,无法表明语音在 Chrome 和 Windows 上可用,但需要在 Windows 上下载。
示例 9:Chrome 桌面中预加载的 Google 语音
{
"label" : " Google female voice (UK) " ,
"name" : " Google UK English Female " ,
"language" : " en-GB " ,
"gender" : " female " ,
"browser" : [
" ChromeDesktop "
],
"preloaded" : true
}
使用 Web Speech API 时, SpeechSynthesisUtterance
支持以下可选值:
rate
来控制语速pitch
来控制音调此存储库中记录的每个语音都支持以下可选属性:
pitchControl
是一个布尔值,默认为true
,指示语音是否可以进行音调控制rate
是 0.1 到 10 之间的整数,默认为 1,并为每个语音提供建议的默认语速pitch
是 0 到 2 之间的整数,默认为 1,并为每个语音提供建议的默认音高示例 10:无法调整音调的 Microsoft 语音
{
"label" : " Ana (US) " ,
"name" : " Microsoft Ana Online (Natural) - English (United States) " ,
"language" : " en-US " ,
"gender" : " female " ,
"pitchControl" : false
}
示例 11:具有推荐音调和速度的 Google 语音
{
"label" : " Voix Google féminine (France) " ,
"name" : " Google français " ,
"language" : " fr-FR " ,
"gender" : " female " ,
"rate" : 1 ,
"pitch" : 0.8
}
通过记录推荐声音列表的工作,我还最终测试了各种浏览器/操作系统以了解它们的行为方式。本节旨在总结其中一些信息。
还可以使用专用标签来跟踪向 Apple、Google、Microsoft 或 Mozilla 报告的外部问题。
getVoices()
方法返回以下字段: name
、 voiceURI
、 lang
、 localService
和default
。voiceURI
应该是识别语音的最一致的方式,但在实践中,这与事实相差甚远。大多数浏览器使用与voiceURI
name
相同的值,并且不强制唯一性。name
的实现也不一致,并且可以为同一设备上的相同语音返回不同的值。localService
指示语音是否可用于离线使用,并且它似乎按预期工作,这就是当前推荐语音列表不包含该信息的原因。lang
似乎在跨实现中最为可靠,返回使用 BCP 47 语言标签的语言,主语言为小写,子标签为大写 ( pt-BR
)。en_us
(相关问题)eng-US-f000
(相关问题)default
旨在指示语音是否是当前应用程序语言的默认语音。从理论上讲,这应该非常有用,但在实践中,由于实现之间的不一致、有限的上下文(系统默认与用户默认)以及缺乏为每种语言设置默认语音的功能,它确实很难使用。default
之外,实现者还应该考虑使用Accept-Language
HTTP 标头,因为它包含给定用户的首选语言/区域的有序列表。default
指示用户的首选语言/区域(相关问题)。voiceURI
有一种不同的方法,其中每个语音都由唯一的 URN 真正标识。voiceURI
可以用作语音的可靠标识符,那么这不会成为问题,但事实并非如此(相关问题)。default
返回true
,这使得无法检测和选择系统/用户默认值(相关问题)。