SSML では言語・地域コードを指定する必要があります。SAPI の音声との対応表が見当たらなかったため調査しました。
SAPI で SSML を使用する方法は以下の記事を参照してください。
対応表
先に結果を掲載します。
LangID | コード | 言語 | 地域 | 音声 |
---|---|---|---|---|
0c01 | ar-EG | Arabic | Egypt | Microsoft Hoda |
401 | ar-SA | Arabic | Saudi | Microsoft Naayf |
402 | bg-BG | Bulgarian | Bulgaria | Microsoft Ivan |
0403 | ca-ES | Catalan | Catalan | Microsoft Herena |
405 | cs-CZ | Czech | Czech Republic | Microsoft Jakub |
0406 | da-DK | Danish | Denmark | Microsoft Helle |
C07 | de-AT | German | Austria | Microsoft Michael |
807 | de-CH | German | Switzerland | Microsoft Karsten |
407 | de-DE | German | Germany | Microsoft Hedda Microsoft Katja Microsoft Stefan |
408 | el-GR | Greek | Greece | Microsoft Stefanos |
C09 | en-AU | English | Australia | Microsoft Catherine Microsoft James |
1009 | en-CA | English | Canada | Microsoft Linda Microsoft Richard |
809 | en-GB | English | United Kingdom | Microsoft George Microsoft Hazel Microsoft Susan |
1809 | en-IE | English | Ireland | Microsoft Sean |
4009 | en-IN | English | India | Microsoft Heera Microsoft Ravi |
409 | en-US | English | United States | Microsoft David Microsoft Mark Microsoft Zira |
C0A | es-ES | Spanish | Spain | Microsoft Helena Microsoft Laura Microsoft Pablo |
80A | es-MX | Spanish | Mexico | Microsoft Raul Microsoft Sabina |
040b | fi-FI | Finnish | Finland | Microsoft Heidi |
C0C | fr-CA | French | Canada | Microsoft Caroline Microsoft Claude Microsoft Nathalie(Canada) |
100C | fr-CH | French | Switzerland | Microsoft Guillaume |
40C | fr-FR | French | France | Microsoft Hortense Microsoft Julie Microsoft Paul |
40D | he-IL | Hebrew | Israel | Microsoft Asaf |
439 | hi-IN | Hindi | India | Microsoft Hemant Microsoft Kalpana |
41A | hr-HR | Croatian | Croatia | Microsoft Matej |
40E | hu-HU | Hungarian | Hungary | Microsoft Szabolcs |
421 | id-ID | Indonesian | Indonesia | Microsoft Andika |
410 | it-IT | Italian | Italy | Microsoft Cosimo Microsoft Elsa |
411 | ja-JP | Japanese | Japan | Microsoft Ayumi Microsoft Haruka Microsoft Ichiro Microsoft Sayaka |
412 | ko-KR | Korean | Korean | Microsoft Heami |
43E | ms-MY | Malay | Malaysia | Microsoft Rizwan |
0414 | nb-NO | Norwegian | Bokmål | Microsoft Jon |
0813 | nl-BE | Dutch | Belgium | Microsoft Bart |
0413 | nl-NL | Dutch | Netherlands | Microsoft Frank |
415 | pl-PL | Polish | Poland | Microsoft Adam Microsoft Paulina |
416 | pt-BR | Portuguese | Brazil | Microsoft Daniel Microsoft Maria |
0816 | pt-PT | Portuguese | Portugal | Microsoft Helia |
418 | ro-RO | Romanian | Romania | Microsoft Andrei |
419 | ru-RU | Russian | Russia | Microsoft Irina Microsoft Pavel |
41B | sk-SK | Slovak | Slovakia | Microsoft Filip |
424 | sl-SI | Slovenian | Slovenia | Microsoft Lado |
041d | sv-SE | Swedish | Sweden | Microsoft Bengt |
449 | ta-IN | Tamil | India | Microsoft Valluvar |
41E | th-TH | Thai | Thailand | Microsoft Pattara |
041f | tr-TR | Turkish | Turkey | Microsoft Tolga |
42A | vi-VN | Vietnamese | Vietnam | Microsoft An |
804 | zh-CN | Chinese | Simplified, PRC | Microsoft Huihui Microsoft Kangkang Microsoft Yaoyao |
C04 | zh-HK | Chinese | Traditional, Hong Kong S.A.R. | Microsoft Danny Microsoft Tracy |
404 | zh-TW | Chinese | Traditional, Taiwan | Microsoft Hanhan Microsoft Yating Microsoft Zhiwei |
- LangID は3桁だったり4桁だったりしますが、SAPI の出力をそのまま使っています。
- なぜか Nathalie は名前にも地域名が付いています。
Microsoft の資料には LangID の一覧はありますが、言語・地域コードとの対応は一部しか記載されていません。
Azure の Speech Service の資料には言語・地域コードと音声の一覧表がありますが、SAPI で使用できる音声とどこまで同じなのかは不明です。
調査方法
以下の記事のコードを流用して、Python で SAPI を扱います。
token には id があります。
【参考】 VBAでTTSエンジンの各種情報を列挙する | 初心者備忘録
id にはレジストリキーが使用され、言語・地域コードが含まれます。
sapitoken.py
import win32com.client
cat = win32com.client.Dispatch("SAPI.SpObjectTokenCategory")
cat.SetID(r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices", False)
for token in cat.EnumerateTokens():
print(token.id)
break
実行結果
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens\MSTTS_V110_jaJP_AyumiM
この情報を表の形に整理します。
sapicheck.py
import win32com.client
cat = win32com.client.Dispatch("SAPI.SpObjectTokenCategory")
cat.SetID(r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices", False)
codes = {}
for token in cat.EnumerateTokens():
lr = token.GetDescription().split(" - ")[1].split(" (")
l, r = lr[0], lr[1] if len(lr) > 1 else ""
if r.endswith(")"): r = r[:-1]
code = token.id.split("\\")[-1].split("_")[2]
if code[2] != "-": code = code[:2] + "-" + code[2:]
if not code in codes:
codes[code] = (token.GetAttribute("Language"), l, r, [])
codes[code][3].append(token.GetAttribute("Name"))
for k in sorted(codes.keys()):
lang, l, r, names = codes[k]
names.sort()
print("|".join([lang, k, l, r, "<br>".join(names)]))
このスクリプトから出力したのが先に掲載した対応表です。