Reputation: 61
In Safari, it is necessary to set a voice on an utterance as well as the lang property to get it to use the correct language.
On other platforms, speechSynthesis.getVoices() returns all available voices on the device. You can then filter to the language you need and pick one.
However, although I have a Japanese voice downloaded onto my iPhone 16 (simulator, iOS 18.0), it isn't included in the array returned from getVoices.
I've tried setting Japanese as a preferred language. I've tried changing to another Japanese voice under Speak Selection in the accessibility settings. I've tried setting the html lang property to 'ja'. There is still no Japanese voice present in the array.
Here's the array:
0
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ar-001.Maged", name: "Majed", lang: "ar-001", localService: true, default: true}
1
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.bg-BG.Daria", name: "Daria", lang: "bg-BG", localService: true, default: true}
2
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ca-ES.Montserrat", name: "Montse", lang: "ca-ES", localService: true, default: true}
3
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.cs-CZ.Zuzana", name: "Zuzana", lang: "cs-CZ", localService: true, default: true}
4
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.da-DK.Sara", name: "Sara", lang: "da-DK", localService: true, default: true}
5
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.de-DE.Anna", name: "Anna", lang: "de-DE", localService: true, default: true}
6
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.el-GR.Melina", name: "Melina", lang: "el-GR", localService: true, default: true}
7
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-AU.Karen", name: "Karen", lang: "en-AU", localService: true, default: true}
8
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-IE.Moira", name: "Moira", lang: "en-IE", localService: true, default: true}
9
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-IN.Rishi", name: "Rishi", lang: "en-IN", localService: true, default: true}
10
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Trinoids", name: "Trinoids", lang: "en-US", localService: true, default: true}
11
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Albert", name: "Albert", lang: "en-US", localService: true, default: true}
12
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Hysterical", name: "Jester", lang: "en-US", localService: true, default: true}
13
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-US.Samantha", name: "Samantha", lang: "en-US", localService: true, default: true}
14
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Whisper", name: "Whisper", lang: "en-US", localService: true, default: true}
15
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Princess", name: "Superstar", lang: "en-US", localService: true, default: true}
16
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Bells", name: "Bells", lang: "en-US", localService: true, default: true}
17
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Organ", name: "Organ", lang: "en-US", localService: true, default: true}
18
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.BadNews", name: "Bad News", lang: "en-US", localService: true, default: true}
19
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Bubbles", name: "Bubbles", lang: "en-US", localService: true, default: true}
20
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Junior", name: "Junior", lang: "en-US", localService: true, default: true}
21
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Bahh", name: "Bahh", lang: "en-US", localService: true, default: true}
22
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Deranged", name: "Wobble", lang: "en-US", localService: true, default: true}
23
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Boing", name: "Boing", lang: "en-US", localService: true, default: true}
24
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.GoodNews", name: "Good News", lang: "en-US", localService: true, default: true}
25
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Zarvox", name: "Zarvox", lang: "en-US", localService: true, default: true}
26
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Ralph", name: "Ralph", lang: "en-US", localService: true, default: true}
27
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Cellos", name: "Cellos", lang: "en-US", localService: true, default: true}
28
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Kathy", name: "Kathy", lang: "en-US", localService: true, default: true}
29
SpeechSynthesisVoice {voiceURI: "com.apple.speech.synthesis.voice.Fred", name: "Fred", lang: "en-US", localService: true, default: true}
30
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-ZA.Tessa", name: "Tessa", lang: "en-ZA", localService: true, default: true}
31
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.es-ES.Monica", name: "Mónica", lang: "es-ES", localService: true, default: true}
32
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.es-MX.Paulina", name: "Paulina", lang: "es-MX", localService: true, default: true}
33
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.fi-FI.Satu", name: "Satu", lang: "fi-FI", localService: true, default: true}
34
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.fr-CA.Amelie", name: "Amélie", lang: "fr-CA", localService: true, default: true}
35
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.fr-FR.Thomas", name: "Thomas", lang: "fr-FR", localService: true, default: true}
36
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.he-IL.Carmit", name: "Carmit", lang: "he-IL", localService: true, default: true}
37
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.hi-IN.Lekha", name: "Lekha", lang: "hi-IN", localService: true, default: true}
38
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.hr-HR.Lana", name: "Lana", lang: "hr-HR", localService: true, default: true}
39
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.hu-HU.Mariska", name: "Tünde", lang: "hu-HU", localService: true, default: true}
40
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.id-ID.Damayanti", name: "Damayanti", lang: "id-ID", localService: true, default: true}
41
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.it-IT.Alice", name: "Alice", lang: "it-IT", localService: true, default: true}
42
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ko-KR.Yuna", name: "Yuna", lang: "ko-KR", localService: true, default: true}
43
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ms-MY.Amira", name: "Amira", lang: "ms-MY", localService: true, default: true}
44
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.nb-NO.Nora", name: "Nora", lang: "nb-NO", localService: true, default: true}
45
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.nl-BE.Ellen", name: "Ellen", lang: "nl-BE", localService: true, default: true}
46
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.nl-NL.Xander", name: "Xander", lang: "nl-NL", localService: true, default: true}
47
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.pl-PL.Zosia", name: "Zosia", lang: "pl-PL", localService: true, default: true}
48
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.pt-BR.Luciana", name: "Luciana", lang: "pt-BR", localService: true, default: true}
49
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.pt-PT.Joana", name: "Joana", lang: "pt-PT", localService: true, default: true}
50
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ro-RO.Ioana", name: "Ioana", lang: "ro-RO", localService: true, default: true}
51
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ru-RU.Milena", name: "Milena", lang: "ru-RU", localService: true, default: true}
52
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.sk-SK.Laura", name: "Laura", lang: "sk-SK", localService: true, default: true}
53
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.sl-SI.Tina", name: "Tina", lang: "sl-SI", localService: true, default: true}
54
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.sv-SE.Alva", name: "Alva", lang: "sv-SE", localService: true, default: true}
55
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.th-TH.Kanya", name: "Kanya", lang: "th-TH", localService: true, default: true}
56
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.tr-TR.Yelda", name: "Yelda", lang: "tr-TR", localService: true, default: true}
57
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.uk-UA.Lesya", name: "Lesya", lang: "uk-UA", localService: true, default: true}
58
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.vi-VN.Linh", name: "Linh", lang: "vi-VN", localService: true, default: true}
59
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.zh-CN.Tingting", name: "Tingting", lang: "zh-CN", localService: true, default: true}
60
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.zh-HK.Sinji", name: "Sinji", lang: "zh-HK", localService: true, default: true}
61
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.zh-TW.Meijia", name: "Meijia", lang: "zh-TW", localService: true, default: true}
62
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.tr-TR.Yelda", name: "Yelda", lang: "tr-TR", localService: true, default: true}
63
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.fr-FR.Thomas", name: "Thomas", lang: "fr-FR", localService: true, default: true}
64
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.de-DE.Anna", name: "Anna", lang: "de-DE", localService: true, default: true}
65
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.pl-PL.Zosia", name: "Zosia", lang: "pl-PL", localService: true, default: true}
66
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.vi-VN.Linh", name: "Linh", lang: "vi-VN", localService: true, default: true}
67
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.da-DK.Sara", name: "Sara", lang: "da-DK", localService: true, default: true}
68
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-IE.Moira", name: "Moira", lang: "en-IE", localService: true, default: true}
69
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.el-GR.Melina", name: "Melina", lang: "el-GR", localService: true, default: true}
70
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.es-ES.Monica", name: "Mónica", lang: "es-ES", localService: true, default: true}
71
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ru-RU.Milena", name: "Milena", lang: "ru-RU", localService: true, default: true}
72
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ca-ES.Montserrat", name: "Montse", lang: "ca-ES", localService: true, default: true}
73
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.es-MX.Paulina", name: "Paulina", lang: "es-MX", localService: true, default: true}
74
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-ZA.Tessa", name: "Tessa", lang: "en-ZA", localService: true, default: true}
75
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-AU.Karen", name: "Karen", lang: "en-AU", localService: true, default: true}
76
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.hu-HU.Mariska", name: "Tünde", lang: "hu-HU", localService: true, default: true}
77
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.nl-NL.Xander", name: "Xander", lang: "nl-NL", localService: true, default: true}
78
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ms-MY.Amira", name: "Amira", lang: "ms-MY", localService: true, default: true}
79
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.zh-CN.Tingting", name: "Tingting", lang: "zh-CN", localService: true, default: true}
80
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-IN.Rishi", name: "Rishi", lang: "en-IN", localService: true, default: true}
81
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ro-RO.Ioana", name: "Ioana", lang: "ro-RO", localService: true, default: true}
82
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.hi-IN.Lekha", name: "Lekha", lang: "hi-IN", localService: true, default: true}
83
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.sl-SI.Tina", name: "Tina", lang: "sl-SI", localService: true, default: true}
84
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.he-IL.Carmit", name: "Carmit", lang: "he-IL", localService: true, default: true}
85
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.fr-CA.Amelie", name: "Amélie", lang: "fr-CA", localService: true, default: true}
86
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.cs-CZ.Zuzana", name: "Zuzana", lang: "cs-CZ", localService: true, default: true}
87
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.hr-HR.Lana", name: "Lana", lang: "hr-HR", localService: true, default: true}
88
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.pt-PT.Joana", name: "Joana", lang: "pt-PT", localService: true, default: true}
89
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.zh-TW.Meijia", name: "Meijia", lang: "zh-TW", localService: true, default: true}
90
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.nb-NO.Nora", name: "Nora", lang: "nb-NO", localService: true, default: true}
91
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ko-KR.Yuna", name: "Yuna", lang: "ko-KR", localService: true, default: true}
92
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.pt-BR.Luciana", name: "Luciana", lang: "pt-BR", localService: true, default: true}
93
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.it-IT.Alice", name: "Alice", lang: "it-IT", localService: true, default: true}
94
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.id-ID.Damayanti", name: "Damayanti", lang: "id-ID", localService: true, default: true}
95
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.th-TH.Kanya", name: "Kanya", lang: "th-TH", localService: true, default: true}
96
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.sv-SE.Alva", name: "Alva", lang: "sv-SE", localService: true, default: true}
97
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.ar-001.Maged", name: "Majed", lang: "ar-001", localService: true, default: true}
98
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.en-US.Samantha", name: "Samantha", lang: "en-US", localService: true, default: true}
99
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.uk-UA.Lesya", name: "Lesya", lang: "uk-UA", localService: true, default: true}
100
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.sk-SK.Laura", name: "Laura", lang: "sk-SK", localService: true, default: true}
101
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.zh-HK.Sinji", name: "Sinji", lang: "zh-HK", localService: true, default: true}
102
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.nl-BE.Ellen", name: "Ellen", lang: "nl-BE", localService: true, default: true}
103
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.fi-FI.Satu", name: "Satu", lang: "fi-FI", localService: true, default: true}
104
SpeechSynthesisVoice {voiceURI: "com.apple.voice.compact.bg-BG.Daria", name: "Daria", lang: "bg-BG", localService: true, default: true}
As you can see, there are plenty of languages in there, just not Japanese.
Setting the lang of the utterance to 'ja' while leaving voice unset doesn't work, it just uses the English voice and says nothing because it doesn't know how to handle Japanese characters. This also has no effect on the array of voices (requesting the Japanese speech doesn't trigger any Japanese voice to load).
MRE:
const voices = speechSynthesis.getVoices();
const voice = voices.filter((v) => v.lang.startsWith('ja'))[0];
const utterance = new SpeechSynthesisUtterance('こんにちは');
utterance.voice = voice;
utterance.lang = 'ja';
speechSynthesis.speak(utterance);
Upvotes: 0
Views: 72