이 저장소는 읽기 앱에서 소리내어 읽기 기능을 구현하기 위한 모범 사례를 식별하기 위한 대규모 프로젝트의 일부입니다.
다양한 브라우저와 OS에서 기본적으로 수백 개의 음성을 사용할 수 있으므로 개발자가 합리적인 기본값과 선별된 음성 목록을 제공하는 것은 까다로울 수 있습니다.
음성 선택에 초점을 맞춘 이 프로젝트의 목표는 다양한 플랫폼에서 사용할 수 있는 고품질 음성을 문서화하고 JSON 구성 파일을 사용하여 이러한 권장 사항을 쉽게 구현할 수 있는 방법을 제공하는 것입니다.
Readium Speech 프로젝트를 기반으로 한 라이브 데모를 사용할 수 있습니다.
이 데모는 이 저장소의 데이터와 함께 음성 선택에 대한 모범 사례를 모두 구현합니다.
이 프로젝트의 목표는 Windows 및 macOS에서 사용 가능한 43개 언어를 모두 지원하는 것입니다.
현재 상태에서는 43개 언어를 다루고 있습니다.
스펙트럼의 반대쪽 끝에서 이 프로젝트는 음성 선택기 구성 요소에서 필터링해야 하는 여러 음성도 식별합니다.
그 중 일부는 전반적인 독서 경험에 해로운 반면, 일부는 더 나은 사전 로드 옵션을 사용할 수 있는 플랫폼에서 품질이 매우 낮습니다.
JSON 스키마는 새로운 언어 또는 음성 추가에 대한 PR 공개에 관심이 있는 검증 또는 잠재적인 기여자를 위해 제공됩니다.
추천 음성마다 label
필요하며, 음성별로 인간 친화적인 라벨을 제공합니다.
이 문자열은 대상 언어로 현지화되었으며 일반적으로 다음 정보를 포함합니다.
예 1: Microsoft Natural 음성
자연스러운 목소리를 위해 Microsoft에서 문서화한 이름은 쉽게 이해할 수 있지만 매우 긴 경향이 있으며 모두 영어로 현지화되어 있습니다.
{
"label" : " Isabella (Italia) " ,
"name" : " Microsoft Isabella Online (Natural) - Italian (Italy) " ,
"language" : " it-IT "
}
예 2: Chrome OS 음성
Chrome OS는 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
속성도 사용할 수 있습니다.
여기에는 하위 태그 없이 두 글자 코드만 사용하는 언어 목록이 포함되어 있습니다.
Microsoft의 일부 새로운 음성은 다국어 출력도 가능합니다. 언어 전환은 문장 중간에 지원되지 않지만 출력은 각 문장의 언어를 자동 감지하여 그에 따라 채택할 수 있는 것으로 보입니다.
이를 지원하기 위해 프로세스에서 출력이 자동으로 다른 음성으로 전환될 수 있습니다.
이러한 음성은 multiLingual
부울을 사용하여 식별됩니다.
예 4: 다국어 출력이 가능한 음성
{
"label" : " Emma (US) " ,
"name" : " Microsoft EmmaMultilingual Online (Natural) - English (United States) " ,
"language" : " en-US " ,
"multiLingual" : true
}
예시 5: 제2언어를 처리할 수 있는 음성
{
"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
식별된 모든 OS 및 브라우저에 음성이 사전 로드되어 있는지 여부를 나타냅니다.
현재 접근 방식에서는 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 Voice
{
"label" : " Voix Google féminine (France) " ,
"name" : " Google français " ,
"language" : " fr-FR " ,
"gender" : " female " ,
"rate" : 1 ,
"pitch" : 0.8
}
추천 음성 목록을 문서화하는 작업을 통해 다양한 브라우저/OS를 테스트하여 어떻게 작동하는지 확인하게 되었습니다. 이 섹션은 이러한 정보 중 일부를 요약하기 위한 것입니다.
Apple, Google, Microsoft 또는 Mozilla에 보고된 외부 문제를 추적하기 위한 전용 레이블도 사용할 수 있습니다.
getVoices()
메서드를 통해 name
, voiceURI
, lang
, localService
및 default
필드를 반환합니다.voiceURI
이론적으로 음성을 식별하는 가장 일관된 방법이어야 하지만 실제로는 이는 진실과 더 이상 다를 수 없습니다. 대부분의 브라우저는 voiceURI
에 name
과 동일한 값을 사용하며 고유성을 적용하지 않습니다.name
도 일관되지 않게 구현되며 동일한 장치에서 동일한 음성에 대해 다른 값을 반환할 수 있습니다.localService
음성을 오프라인으로 사용할 수 있는지, 음성이 예상대로 작동하는지 여부를 나타냅니다. 따라서 현재 권장 음성 목록에는 해당 정보가 포함되어 있지 않습니다.lang
기본 언어가 소문자이고 하위 태그가 대문자( pt-BR
)인 BCP 47 언어 태그를 사용하여 언어를 반환하므로 구현 전반에 걸쳐 대부분 신뢰할 수 있는 것으로 보입니다.en_us
(관련 문제)eng-US-f000
)을 추가하여 훨씬 더 창의적입니다(관련 문제).default
은 음성이 현재 앱 언어의 기본 음성인지 여부를 나타냅니다. 이론적으로 이것은 매우 유용해야 하지만 실제로는 구현 간의 불일치, 제한된 컨텍스트(시스템 기본값 대 사용자 기본값) 및 언어별 기본 음성 설정 기능 부족으로 인해 실제로 사용하기가 정말 어렵습니다.default
사용 외에도 구현자는 항상 Accept-Language
HTTP 헤더 사용을 고려해야 합니다. 이 헤더에는 특정 사용자가 선호하는 언어/지역의 순서 목록이 포함되어 있기 때문입니다.default
을 사용하여 사용자가 선호하는 언어/지역을 표시하지 않습니다(관련 문제).voiceURI
에 대해 다른 접근 방식을 사용합니다.voiceURI
신뢰할 수 있는 음성 식별자로 사용할 수 있다면 문제가 되지 않지만, 그렇지 않습니다(관련 문제).default
으로 true
반환하므로 시스템/사용자 기본값을 감지하고 선택할 수 없습니다(관련 문제).