NSLocale | AVSpeechSynthesisVoice.language |
---|---|
af | en-US |
af_NA | en-US |
af_ZA | en-ZA |
agq | en-US |
agq_CM | en-US |
ak | en-US |
ak_GH | en-US |
am | en-US |
am_ET | en-US |
ar | ar-SA |
ar_001 | ar-SA |
ar_AE | ar-SA |
ar_BH | ar-SA |
ar_DJ | ar-SA |
ar_DZ | ar-SA |
ar_EG | ar-SA |
ar_EH | ar-SA |
ar_ER | ar-SA |
ar_IL | ar-SA |
ar_IQ | ar-SA |
ar_JO | ar-SA |
ar_KM | ar-SA |
ar_KW | ar-SA |
ar_LB | ar-SA |
ar_LY | ar-SA |
ar_MA | ar-SA |
ar_MR | ar-SA |
ar_OM | ar-SA |
ar_PS | ar-SA |
ar_QA | ar-SA |
ar_SA | ar-SA |
ar_SD | ar-SA |
ar_SO | ar-SA |
ar_SS | ar-SA |
ar_SY | ar-SA |
ar_TD | ar-SA |
ar_TN | ar-SA |
ar_YE | ar-SA |
as | en-US |
as_IN | hi-IN |
asa | en-US |
asa_TZ | en-US |
ast | en-US |
ast_ES | es-ES |
az | en-US |
az_Cyrl | en-US |
az_Cyrl_AZ | en-US |
az_Latn | en-US |
az_Latn_AZ | en-US |
bas | en-US |
bas_CM | en-US |
be | en-US |
be_BY | en-US |
bem | en-US |
bem_ZM | en-US |
bez | en-US |
bez_TZ | en-US |
bg | en-US |
bg_BG | en-US |
bm | en-US |
bm_ML | en-US |
bn | en-US |
bn_BD | en-US |
bn_IN | hi-IN |
bo | en-US |
bo_CN | zh-CN |
bo_IN | hi-IN |
br | en-US |
br_FR | fr-FR |
brx | en-US |
brx_IN | hi-IN |
bs | en-US |
bs_Cyrl | en-US |
bs_Cyrl_BA | en-US |
bs_Latn | en-US |
bs_Latn_BA | en-US |
ca | en-US |
ca_AD | en-US |
ca_ES | es-ES |
ca_FR | fr-FR |
ca_IT | it-IT |
ce | en-US |
ce_RU | ru-RU |
cgg | en-US |
cgg_UG | en-US |
chr | en-US |
chr_US | en-US |
ckb | en-US |
ckb_IQ | en-US |
ckb_IR | en-US |
cs | cs-CZ |
cs_CZ | cs-CZ |
cy | en-US |
cy_GB | en-GB |
da | da-DK |
da_DK | da-DK |
da_GL | da-DK |
dav | en-US |
dav_KE | en-US |
de | de-DE |
de_AT | de-DE |
de_BE | de-DE |
de_CH | de-DE |
de_DE | de-DE |
de_IT | de-DE |
de_LI | de-DE |
de_LU | de-DE |
dje | en-US |
dje_NE | en-US |
dsb | en-US |
dsb_DE | de-DE |
dua | en-US |
dua_CM | en-US |
dyo | en-US |
dyo_SN | en-US |
dz | en-US |
dz_BT | en-US |
ebu | en-US |
ebu_KE | en-US |
ee | en-US |
ee_GH | en-US |
ee_TG | en-US |
el | el-GR |
el_CY | el-GR |
el_GR | el-GR |
en | en-US |
en_001 | en-US |
en_150 | en-US |
en_AD | en-US |
en_AG | en-US |
en_AI | en-US |
en_AL | en-US |
en_AR | en-US |
en_AS | en-US |
en_AT | en-US |
en_AU | en-AU |
en_BA | en-US |
en_BB | en-US |
en_BD | en-US |
en_BE | en-US |
en_BG | en-US |
en_BI | en-US |
en_BM | en-US |
en_BR | en-US |
en_BS | en-US |
en_BW | en-US |
en_BZ | en-US |
en_CA | en-US |
en_CC | en-US |
en_CH | en-US |
en_CK | en-US |
en_CM | en-US |
en_CN | en-US |
en_CX | en-US |
en_CY | en-US |
en_CZ | en-US |
en_DE | en-US |
en_DG | en-US |
en_DK | en-US |
en_DM | en-US |
en_EE | en-US |
en_ER | en-US |
en_ES | en-US |
en_FI | en-US |
en_FJ | en-US |
en_FK | en-US |
en_FM | en-US |
en_FR | en-US |
en_GB | en-GB |
en_GD | en-US |
en_GG | en-US |
en_GH | en-US |
en_GI | en-US |
en_GM | en-US |
en_GR | en-US |
en_GU | en-US |
en_GY | en-US |
en_HK | en-US |
en_HR | en-US |
en_HU | en-US |
en_ID | en-US |
en_IE | en-IE |
en_IL | en-US |
en_IM | en-US |
en_IN | en-US |
en_IO | en-US |
en_IS | en-US |
en_IT | en-US |
en_JE | en-US |
en_JM | en-US |
en_JP | en-US |
en_KE | en-US |
en_KI | en-US |
en_KN | en-US |
en_KR | en-US |
en_KY | en-US |
en_LC | en-US |
en_LR | en-US |
en_LS | en-US |
en_LT | en-US |
en_LU | en-US |
en_LV | en-US |
en_ME | en-US |
en_MG | en-US |
en_MH | en-US |
en_MO | en-US |
en_MP | en-US |
en_MS | en-US |
en_MT | en-US |
en_MU | en-US |
en_MV | en-US |
en_MW | en-US |
en_MY | en-US |
en_NA | en-US |
en_NF | en-US |
en_NG | en-US |
en_NL | en-US |
en_NO | en-US |
en_NR | en-US |
en_NU | en-US |
en_NZ | en-US |
en_PG | en-US |
en_PH | en-US |
en_PK | en-US |
en_PL | en-US |
en_PN | en-US |
en_PR | en-US |
en_PT | en-US |
en_PW | en-US |
en_RO | en-US |
en_RU | en-US |
en_RW | en-US |
en_SA | en-US |
en_SB | en-US |
en_SC | en-US |
en_SD | en-US |
en_SE | en-US |
en_SG | en-US |
en_SH | en-US |
en_SI | en-US |
en_SK | en-US |
en_SL | en-US |
en_SS | en-US |
en_SX | en-US |
en_SZ | en-US |
en_TC | en-US |
en_TH | en-US |
en_TK | en-US |
en_TO | en-US |
en_TR | en-US |
en_TT | en-US |
en_TV | en-US |
en_TW | en-US |
en_TZ | en-US |
en_UG | en-US |
en_UM | en-US |
en_US | en-US |
en_US_POSIX | en-US |
en_VC | en-US |
en_VG | en-US |
en_VI | en-US |
en_VU | en-US |
en_WS | en-US |
en_ZA | en-ZA |
en_ZM | en-US |
en_ZW | en-US |
eo | en-US |
es | es-ES |
es_419 | es-ES |
es_AG | es-ES |
es_AI | es-ES |
es_AR | es-ES |
es_AW | es-ES |
es_BB | es-ES |
es_BL | es-ES |
es_BM | es-ES |
es_BO | es-ES |
es_BQ | es-ES |
es_BR | es-ES |
es_BS | es-ES |
es_BZ | es-ES |
es_CL | es-ES |
es_CO | es-ES |
es_CR | es-ES |
es_CU | es-ES |
es_CW | es-ES |
es_DM | es-ES |
es_DO | es-ES |
es_EA | es-ES |
es_EC | es-ES |
es_ES | es-ES |
es_FK | es-ES |
es_GD | es-ES |
es_GF | es-ES |
es_GL | es-ES |
es_GP | es-ES |
es_GQ | es-ES |
es_GT | es-ES |
es_GY | es-ES |
es_HN | es-ES |
es_HT | es-ES |
es_IC | es-ES |
es_KN | es-ES |
es_KY | es-ES |
es_LC | es-ES |
es_MF | es-ES |
es_MQ | es-ES |
es_MS | es-ES |
es_MX | es-MX |
es_NI | es-ES |
es_PA | es-ES |
es_PE | es-ES |
es_PH | es-ES |
es_PM | es-ES |
es_PR | es-ES |
es_PY | es-ES |
es_SR | es-ES |
es_SV | es-ES |
es_SX | es-ES |
es_TC | es-ES |
es_TT | es-ES |
es_US | es-ES |
es_UY | es-ES |
es_VC | es-ES |
es_VE | es-ES |
es_VG | es-ES |
es_VI | es-ES |
et | en-US |
et_EE | en-US |
eu | en-US |
eu_ES | es-ES |
ewo | en-US |
ewo_CM | en-US |
fa | en-US |
fa_AF | en-US |
fa_IR | en-US |
ff | en-US |
ff_CM | en-US |
ff_GN | en-US |
ff_MR | en-US |
ff_SN | en-US |
fi | fi-FI |
fi_FI | fi-FI |
fil | en-US |
fil_PH | en-US |
fo | en-US |
fo_DK | da-DK |
fo_FO | en-US |
fr | fr-FR |
fr_BE | fr-FR |
fr_BF | fr-FR |
fr_BI | fr-FR |
fr_BJ | fr-FR |
fr_BL | fr-FR |
fr_CA | fr-CA |
fr_CD | fr-FR |
fr_CF | fr-FR |
fr_CG | fr-FR |
fr_CH | fr-FR |
fr_CI | fr-FR |
fr_CM | fr-FR |
fr_DJ | fr-FR |
fr_DZ | fr-FR |
fr_FR | fr-FR |
fr_GA | fr-FR |
fr_GF | fr-FR |
fr_GN | fr-FR |
fr_GP | fr-FR |
fr_GQ | fr-FR |
fr_HT | fr-FR |
fr_KM | fr-FR |
fr_LU | fr-FR |
fr_MA | fr-FR |
fr_MC | fr-FR |
fr_MF | fr-FR |
fr_MG | fr-FR |
fr_ML | fr-FR |
fr_MQ | fr-FR |
fr_MR | fr-FR |
fr_MU | fr-FR |
fr_NC | fr-FR |
fr_NE | fr-FR |
fr_PF | fr-FR |
fr_PM | fr-FR |
fr_RE | fr-FR |
fr_RW | fr-FR |
fr_SC | fr-FR |
fr_SN | fr-FR |
fr_SY | fr-FR |
fr_TD | fr-FR |
fr_TG | fr-FR |
fr_TN | fr-FR |
fr_VU | fr-FR |
fr_WF | fr-FR |
fr_YT | fr-FR |
fur | en-US |
fur_IT | it-IT |
fy | en-US |
fy_NL | nl-NL |
ga | en-US |
ga_IE | en-IE |
gd | en-US |
gd_GB | en-GB |
gl | en-US |
gl_ES | es-ES |
gsw | en-US |
gsw_CH | en-US |
gsw_FR | fr-FR |
gsw_LI | en-US |
gu | en-US |
gu_IN | hi-IN |
guz | en-US |
guz_KE | en-US |
gv | en-US |
gv_IM | en-US |
ha | en-US |
ha_GH | en-US |
ha_NE | en-US |
ha_NG | en-US |
haw | en-US |
haw_US | en-US |
he | he-IL |
he_IL | he-IL |
hi | hi-IN |
hi_IN | hi-IN |
hr | en-US |
hr_BA | en-US |
hr_HR | en-US |
hsb | en-US |
hsb_DE | de-DE |
hu | hu-HU |
hu_HU | hu-HU |
hy | en-US |
hy_AM | en-US |
id | id-ID |
id_ID | id-ID |
ig | en-US |
ig_NG | en-US |
ii | en-US |
ii_CN | zh-CN |
is | en-US |
is_IS | en-US |
it | it-IT |
it_CH | it-IT |
it_IT | it-IT |
it_SM | it-IT |
it_VA | it-IT |
iu | en-US |
iu_CA | fr-CA |
ja | ja-JP |
ja_JP | ja-JP |
jgo | en-US |
jgo_CM | en-US |
jmc | en-US |
jmc_TZ | en-US |
ka | en-US |
ka_GE | en-US |
kab | en-US |
kab_DZ | en-US |
kam | en-US |
kam_KE | en-US |
kde | en-US |
kde_TZ | en-US |
kea | en-US |
kea_CV | en-US |
khq | en-US |
khq_ML | en-US |
ki | en-US |
ki_KE | en-US |
kk | en-US |
kk_KZ | en-US |
kkj | en-US |
kkj_CM | en-US |
kl | en-US |
kl_GL | en-US |
kln | en-US |
kln_KE | en-US |
km | en-US |
km_KH | en-US |
kn | en-US |
kn_IN | hi-IN |
ko | ko-KR |
ko_KP | ko-KR |
ko_KR | ko-KR |
kok | en-US |
kok_IN | hi-IN |
ks | en-US |
ks_IN | hi-IN |
ksb | en-US |
ksb_TZ | en-US |
ksf | en-US |
ksf_CM | en-US |
ksh | en-US |
ksh_DE | de-DE |
kw | en-US |
kw_GB | en-GB |
ky | en-US |
ky_KG | en-US |
lag | en-US |
lag_TZ | en-US |
lb | en-US |
lb_LU | en-US |
lg | en-US |
lg_UG | en-US |
lkt | en-US |
lkt_US | en-US |
ln | en-US |
ln_AO | en-US |
ln_CD | en-US |
ln_CF | en-US |
ln_CG | en-US |
lo | en-US |
lo_LA | en-US |
lrc | en-US |
lrc_IQ | en-US |
lrc_IR | en-US |
lt | en-US |
lt_LT | en-US |
lu | en-US |
lu_CD | en-US |
luo | en-US |
luo_KE | en-US |
luy | en-US |
luy_KE | en-US |
lv | en-US |
lv_LV | en-US |
mas | en-US |
mas_KE | en-US |
mas_TZ | en-US |
mer | en-US |
mer_KE | en-US |
mfe | en-US |
mfe_MU | en-US |
mg | en-US |
mg_MG | en-US |
mgh | en-US |
mgh_MZ | en-US |
mgo | en-US |
mgo_CM | en-US |
mk | en-US |
mk_MK | en-US |
ml | en-US |
ml_IN | hi-IN |
mn | en-US |
mn_MN | en-US |
mr | en-US |
mr_IN | hi-IN |
ms | en-US |
ms_Arab | en-US |
ms_Arab_BN | en-US |
ms_Arab_MY | en-US |
ms_BN | en-US |
ms_MY | en-US |
ms_SG | en-US |
mt | en-US |
mt_MT | en-US |
mua | en-US |
mua_CM | en-US |
my | en-US |
my_MM | en-US |
mzn | en-US |
mzn_IR | en-US |
naq | en-US |
naq_NA | en-US |
nb | en-US |
nb_NO | no-NO |
nb_SJ | en-US |
nd | en-US |
nd_ZW | en-US |
nds | en-US |
nds_DE | de-DE |
nds_NL | nl-NL |
ne | en-US |
ne_IN | hi-IN |
ne_NP | en-US |
nl | nl-NL |
nl_AW | nl-NL |
nl_BE | nl-BE |
nl_BQ | nl-NL |
nl_CW | nl-NL |
nl_NL | nl-NL |
nl_SR | nl-NL |
nl_SX | nl-NL |
nmg | en-US |
nmg_CM | en-US |
nn | en-US |
nn_NO | no-NO |
nnh | en-US |
nnh_CM | en-US |
nus | en-US |
nus_SS | en-US |
nyn | en-US |
nyn_UG | en-US |
om | en-US |
om_ET | en-US |
om_KE | en-US |
or | en-US |
or_IN | hi-IN |
os | en-US |
os_GE | en-US |
os_RU | ru-RU |
pa | en-US |
pa_Arab | en-US |
pa_Arab_PK | en-US |
pa_Guru | en-US |
pa_Guru_IN | hi-IN |
pl | pl-PL |
pl_PL | pl-PL |
ps | en-US |
ps_AF | en-US |
pt | pt-PT |
pt_AO | pt-PT |
pt_BR | pt-BR |
pt_CH | pt-PT |
pt_CV | pt-PT |
pt_FR | pt-PT |
pt_GQ | pt-PT |
pt_GW | pt-PT |
pt_LU | pt-PT |
pt_MO | pt-PT |
pt_MZ | pt-PT |
pt_PT | pt-PT |
pt_ST | pt-PT |
pt_TL | pt-PT |
qu | en-US |
qu_BO | en-US |
qu_EC | en-US |
qu_PE | en-US |
rm | en-US |
rm_CH | en-US |
rn | en-US |
rn_BI | en-US |
ro | ro-RO |
ro_MD | ro-RO |
ro_RO | ro-RO |
rof | en-US |
rof_TZ | en-US |
ru | ru-RU |
ru_BY | ru-RU |
ru_KG | ru-RU |
ru_KZ | ru-RU |
ru_MD | ru-RU |
ru_RU | ru-RU |
ru_UA | ru-RU |
rw | en-US |
rw_RW | en-US |
rwk | en-US |
rwk_TZ | en-US |
sah | en-US |
sah_RU | ru-RU |
saq | en-US |
saq_KE | en-US |
sbp | en-US |
sbp_TZ | en-US |
se | en-US |
se_FI | fi-FI |
se_NO | no-NO |
se_SE | sv-SE |
seh | en-US |
seh_MZ | en-US |
ses | en-US |
ses_ML | en-US |
sg | en-US |
sg_CF | en-US |
shi | en-US |
shi_Latn | en-US |
shi_Latn_MA | en-US |
shi_Tfng | en-US |
shi_Tfng_MA | en-US |
si | en-US |
si_LK | en-US |
sk | sk-SK |
sk_SK | sk-SK |
sl | en-US |
sl_SI | en-US |
smn | en-US |
smn_FI | fi-FI |
sn | en-US |
sn_ZW | en-US |
so | en-US |
so_DJ | en-US |
so_ET | en-US |
so_KE | en-US |
so_SO | en-US |
sq | en-US |
sq_AL | en-US |
sq_MK | en-US |
sq_XK | en-US |
sr | en-US |
sr_Cyrl | en-US |
sr_Cyrl_BA | en-US |
sr_Cyrl_ME | en-US |
sr_Cyrl_RS | en-US |
sr_Cyrl_XK | en-US |
sr_Latn | en-US |
sr_Latn_BA | en-US |
sr_Latn_ME | en-US |
sr_Latn_RS | en-US |
sr_Latn_XK | en-US |
sv | sv-SE |
sv_AX | sv-SE |
sv_FI | sv-SE |
sv_SE | sv-SE |
sw | en-US |
sw_CD | en-US |
sw_KE | en-US |
sw_TZ | en-US |
sw_UG | en-US |
ta | en-US |
ta_IN | hi-IN |
ta_LK | en-US |
ta_MY | en-US |
ta_SG | en-US |
te | en-US |
te_IN | hi-IN |
teo | en-US |
teo_KE | en-US |
teo_UG | en-US |
tg | en-US |
tg_TJ | en-US |
th | th-TH |
th_TH | th-TH |
ti | en-US |
ti_ER | en-US |
ti_ET | en-US |
tk | en-US |
tk_TM | en-US |
to | en-US |
to_TO | en-US |
tr | tr-TR |
tr_CY | tr-TR |
tr_TR | tr-TR |
twq | en-US |
twq_NE | en-US |
tzm | en-US |
tzm_MA | en-US |
ug | en-US |
ug_CN | zh-CN |
uk | en-US |
uk_UA | en-US |
ur | en-US |
ur_IN | hi-IN |
ur_PK | en-US |
uz | en-US |
uz_Arab | en-US |
uz_Arab_AF | en-US |
uz_Cyrl | en-US |
uz_Cyrl_UZ | en-US |
uz_Latn | en-US |
uz_Latn_UZ | en-US |
vai | en-US |
vai_Latn | en-US |
vai_Latn_LR | en-US |
vai_Vaii | en-US |
vai_Vaii_LR | en-US |
vi | en-US |
vi_VN | en-US |
vun | en-US |
vun_TZ | en-US |
wae | en-US |
wae_CH | en-US |
xog | en-US |
xog_UG | en-US |
yav | en-US |
yav_CM | en-US |
yi | en-US |
yi_001 | en-US |
yo | en-US |
yo_BJ | en-US |
yo_NG | en-US |
yue | en-US |
yue_Hans | en-US |
yue_Hans_CN | zh-CN |
yue_Hant | en-US |
yue_Hant_HK | zh-HK |
zgh | en-US |
zgh_MA | en-US |
zh | zh-CN |
zh_Hans | zh-CN |
zh_Hans_CN | zh-CN |
zh_Hans_HK | zh-HK |
zh_Hans_MO | zh-CN |
zh_Hans_SG | zh-CN |
zh_Hant | zh-CN |
zh_Hant_HK | zh-HK |
zh_Hant_MO | zh-CN |
zh_Hant_TW | zh-TW |
zu | en-US |
zu_ZA | en-ZA |
Created
April 10, 2018 05:31
-
-
Save blacklee/44f78528b7258518ca0a917d4b2aa0f0 to your computer and use it in GitHub Desktop.
Get AVSpeechSynthesisVoice by [NSLocale preferredLanguages]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
AVSpeechSynthesisVoice *SpeechVoiceFromLocaleLanguageCode(NSString *langCode) { | |
NSArray<NSString*> *langCodeParts = [[langCode stringByReplacingOccurrencesOfString:@"-" withString:@"_"] componentsSeparatedByString:@"_"]; | |
NSArray<AVSpeechSynthesisVoice*> *availTTSVoices = [AVSpeechSynthesisVoice speechVoices]; | |
NSMutableArray<AVSpeechSynthesisVoice*> *filteredVoices = [NSMutableArray array]; | |
AVSpeechSynthesisVoice *selectedVoice = nil, *defaultVoice = nil; | |
// first round filter, uses prefix. | |
for (AVSpeechSynthesisVoice *voice in availTTSVoices) { | |
if (!defaultVoice && [voice.language isEqualToString:@"en-US"]) { | |
defaultVoice = voice; | |
} | |
if ([voice.language hasPrefix:langCodeParts.firstObject]) { | |
[filteredVoices addObject:voice]; | |
} | |
} | |
if (!filteredVoices.count) { | |
// second round filter, uses other parts | |
for (AVSpeechSynthesisVoice *voice in availTTSVoices) { | |
for (NSUInteger idx = 1; idx < langCodeParts.count; idx++) { | |
if ([voice.language rangeOfString:langCodeParts[idx]].location != NSNotFound) { | |
[filteredVoices addObject:voice]; | |
break; | |
} | |
} | |
} | |
} | |
if (filteredVoices.count) { // now start pick | |
// first round, similar to equal | |
for (AVSpeechSynthesisVoice *voice in filteredVoices) { | |
for (NSUInteger idx = 1; idx < langCodeParts.count; idx++) { | |
if ([voice.language rangeOfString:langCodeParts[idx]].location != NSNotFound) { | |
selectedVoice = voice; | |
break; | |
} | |
} | |
} | |
if (!selectedVoice) { | |
NSDictionary *multiLangsDict = @{@"en": @"en-US", @"fr": @"fr-FR", @"es": @"es-ES", @"nl": @"nl-NL", @"zh": @"zh-CN", @"pt": @"pt-PT"}; | |
// if the prefix is in the keys, then pick a voice by the relative value, | |
// do not pick by random, because it may pick [en-AU] instead of [en-US] for [en_XX] | |
if ([multiLangsDict.allKeys indexOfObject:langCodeParts.firstObject] != NSNotFound) { | |
NSString *voiceLang = multiLangsDict[langCodeParts.firstObject]; | |
for (AVSpeechSynthesisVoice *voice in filteredVoices) { | |
if ([voice.language isEqualToString:voiceLang]) { | |
selectedVoice = voice; | |
break; | |
} | |
} | |
} | |
} | |
if (!selectedVoice) { | |
selectedVoice = filteredVoices.firstObject; | |
} | |
} | |
return selectedVoice ?: defaultVoice; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment