Help us understand the problem. What is going on with this article?

SAPIで発音を指定する

Windows で音声を読み上げるのに使用する SAPI で、発音を指定する方法を調べました。

応用として未サポートの言語を読み上げる方法については、以下の記事を参照してください。

準備

Windows 10 でサポートされる音声の一覧です。

日本語以外の言語を使用する場合は追加します。

次の記事で作成した SAPI をラップしたコマンド wintts を使用します。

指定方法

SAPI では 2種類の XML が使えます。

  1. SAPI TTS XML: 独自規格
  2. SSML (Speech Synthesis Markup Language): 標準化されたマークアップ言語

アメリカ英語の hello を例に取ります。

これを各種方法で発音を指定して読み上げます。

  • SAPI TTS XML
wintts -v zira '<pron sym="h eh - l ow 1"/>'
  • SSML(3種類の表記方法)
wintts '<speak version="1.0" xml:lang="en-US"><phoneme alphabet="sapi" ph="h eh - l ow 1"/></speak>'
wintts '<speak version="1.0" xml:lang="en-US"><phoneme alphabet="ups" ph="h eh . l o + uh s1"/></speak>'
wintts '<speak version="1.0" xml:lang="en-US"><phoneme alphabet="ipa" ph="hɛ.ˈloʊ"/></speak>'

上例の SSML は SAPI が受け付けるのに最低限必要な要素だけに簡略化しています。XML として正式な形式は以下の通りです。

hello.ssml
<?xml version="1.0" encoding="UTF-8"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <phoneme alphabet="ipa" ph="hɛ.ˈloʊ">hello</phoneme>
</speak>
実行方法
wintts -i hello.ssml

SAPI TTS XML

使用できるタグについては以下に記載されています。

このうち、発音を指定するのは pron タグの sym 属性です。

<PRON SYM = "h eh l ow"/>

発音の表記体系は、言語ごとにカスタマイズされたものと、共通化されたものとがあります。

SAPI

言語ごとにカスタマイズされた表記体系は、他の表記体系と区別するため便宜上 SAPI と呼びます。

言語別に記載されています。

Azure の資料にはもう少し詳しい説明があります。英語(アメリカ)、フランス語(フランス)、ドイツ語(ドイツ)、スペイン語(スペイン)、中国語(大陸)、中国語(台湾)、日本語(日本)について記載されています。

言語と地域の組み合わせは重要です。上記7つの組み合わせだけが専用の表記体系を持っています。それ以外は Universal Phone Set (UPS) という共通化された表記体系を使用します。アメリカ以外の英語や、フランス以外のフランス語なども UPS です。

※ 7つの組み合わせは初期に実装されたため、まだ共通化の構想がなく、個別に実装されたのではないかと推測します。

UPS

UPS は 1993 年時点での国際音声記号(IPA)といくつかの付加記号を ASCII 文字だけで表記できるようにした Microsoft 独自の表記体系です。

  1. UPS covers the IPA 1993 Unicode character set, plus some extra SAPI phones including some suprasegmental labels that are used in speech synthesis markup but are not found in IPA.

※ 表記の類似性から ARPABET の 2-letter をベースにしているのではないかと推測します。

以下の言語一覧の最初の7つ以外が UPS でサポートされる言語です。ただしすべての言語の TTS エンジンが用意されているわけではありません。

音素についての資料を示します。なお、UPS は大文字と小文字を区別しません。(case-insensitive)

UPS の資料には音素の一覧は列挙されていますが、個別の言語でどの音素が使用できるのかは判然としません。その言語でサポートされない音素を渡しても、無音になったり別の音で代替されたりするようです。例えばイタリア語に h の音素は存在しないため k で代替されます。

レジストリ

SAPI や UPS の音素はレジストリに記載されています。

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\PhoneConverters\Tokens

各表記体系の下位階層にある Attributes には、使用できる言語がコードで記載されています。

SSML

標準化されたマークアップ言語です。各社のクラウド TTS サービスでも採用されているため、SAPI 以外でも使用できます。

Azure の Speech Service でサポートされる SSML については以下に記載されています。

まずトップレベルの speak タグの仕様です。

構文

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="string"></speak>

属性

属性 説明 必須/省略可能
version ドキュメント マークアップの解釈に使用される SSML 仕様のバージョンを指定します。 現行バージョンは 1.0 です。 必須
xml:lang ルート ドキュメントの言語を指定します。 この値には、小文字、2 文字の言語コード (en など)、または言語コードと大文字の国/地域 (en-US など) を含めることができます。 必須
xmlns SSML のドキュメントのマークアップ ボキャブラリ (要素型と属性名) を定義するドキュメントへの URI を指定します。 現在の URI は http://www.w3.org/2001/10/synthesis です。 必須

xml:lang に指定する言語・地域コードは以下の記事を参照してください。

SAPI では SSML で言語を指定しても OneCore の音声は選択されません。wintts では -v オプションによる音声の指定と併用した方が無難です。

wintts -v hoda '<speak version="1.0" xml:lang="ar-EG">(略)</speak>'

phoneme

SSML のすべてのタグが SAPI でもサポートされているかは不明ですが、今回必要となる phoneme タグは SAPI でも利用できます。サポートされる発音表記体系(alphabet 属性)は SAPI, UPS, IPA の3種類です。

構文

<phoneme alphabet="string" ph="string"></phoneme>

属性

属性 説明 必須/省略可能
alphabet ph 属性の文字列の発音を合成するときに使用する音標文字を指定します。アルファベット順を指定する文字列は、小文字で指定する必要があります。指定できる可能性のあるアルファベットは次のとおりです。
  • ipa – 国際音標文字
  • sapi – Speech サービス発音アルファベット
  • ups – 汎用音素セット
アルファベットは、要素内の phoneme にのみ適用されます。
省略可能
ph phoneme 要素内の単語の発音を指定する音素を含む文字列。指定した文字列に認識されない音素が含まれている場合、テキスト読み上げ (TTS) サービスは SSML ドキュメント全体を拒否し、ドキュメントに指定されている音声出力を生成しません。 音素を使用する場合は必須です。

アメリカ英語に対して SAPI TTS XML では専用の表記体系(SAPI)を使用しましたが、SSML では UPS や IPA の使用が可能です。もともと専用の表記体系が用意されていない言語では、UPS と IPA のみ使用可能です。

X-SAMPA

現状の SAPI ではサポートされていませんが、他社では X-SAMPA のサポートが進んでいることから、将来的には標準的に使用されることが予想されます。

X-SAMPA(Extended SAM Phonetic Alphabet)、拡張SAM音声記号(かくちょうエスエイエムおんせいきごう)は発音記号のひとつ。SAMPAの変種で、1995年にロンドン大学の音声学教授ジョン・C・ウェルズによって開発された。すべての国際音声記号の文字記号をASCII文字のみで表すことができる。

UPS の資料にも X-SAMPA が併記されているため、対応を確認できます。

Amazon Polly

Amazon の TTS サービスである Polly の資料には、サポートする各言語について音素一覧が記載されています。

Polly の資料にある X-SAMPA と、UPS の資料にある X-SAMPA を比較することで、特定の音素の UPS での表記方法を調べることができます。

なお、Polly では SSML で指定できる表記体系は IPA と X-SAMPA です。

  • alphabet
    • ipa— 国際音声記号 (IPA) が使用されることを表します。
    • x-sampa— 拡張 SAM 音声記号 (X-SAMPA) システムが使用されることを表します。

IPA から UPS への変換の例

アラビア語の「サバーハルハイル(おはようございます)」を例に UPS への変換方法を示します。

SAPI でも SSML によって IPA で読み上げができます。

wintts -v hoda '<speak version="1.0" xml:lang="ar-EG"><phoneme alphabet="ipa" ph="sˤa.baːħ al.xajr"/></speak>'

SSML は記述が長くなり、IPA の入力も手間が掛かるため、できれば UPS での表記方法も知っておきたいところです。

Polly のアラビア語の資料を参照して、IPA から X-SAMPA に変換します。

  • /sˤa.baːħ al.xajr/ → s_?\a.ba:X\ al.xajr

※ 咽頭化子音 /sˤ/ の後の母音 /a/ は咽頭化するため A_?\ の方が正確です。しかし SAPI では母音に付加しても反映されないようです。

以下の3つの資料を参照して X-SAMPA に対応する UPS を確認します。特殊なものだけ括弧書きで示します。

X-SAMPA から UPS に変換します。UPS では各要素間にスペースが必要です。

  • s_?\a.ba:X\ al.xajrS phr A . B A lng HH A L . X A J R

SAPI で読み上げます。SSML は冗長なので SAPI TTS XML を使用します。

wintts -v hoda '<pron sym="S phr A . B A lng HH A L . X A J R"/>'

最後の R が聞こえません。震えを強調する RR を試みます。

wintts -v hoda '<pron sym="S phr A . B A lng HH A L . X A J RR"/>'

うまく発音できたようです。

利用方法

Polly の資料にフリーライドするようで申し訳ないため、利用方法についての記事を紹介します。

Amazon Pollyの初回利用から12カ月間は、500万字/月まで無料。500万字なら、音声の長さで100時間超は使える計算となるので、試しに使ってみるには十分です。

変換プログラム

各種発音表記体系を変換するプログラムです。

SAPI はアメリカ英語のみのサポートで、UPS はサポートされていません。IPA と X-SAMPA の変換に有用そうです。

経緯

利用する観点からは、ここまで情報が揃ってようやくスタート地点です。

当初、どこを見れば良いのか分からずに試行錯誤しました。参考までに個人的な経緯を書いておきます。

アラビア語やヘブライ語の勉強のため SAPI で読み上げを試そうとしました。しかし普通の方法ではそれらの言語エンジンが使用できませんでした。どうにか裏技的な方法を見付けて使用できるようになりました。

VBScript は言語仕様の進化が止まっており、書くのが辛かったため Python に移植して WSL から使えるようにしました。

アラビア語やヘブライ語を読み上げると、いくつか想定していたのと発音が違うことがありました。そのため発音を指定する方法を調べて、pron タグで指定できることが分かりました。しかし発音の表記体系が分からなかったため、利用することができませんでした。英語などいくつかの言語の資料はすぐに見付かりましたが、アラビア語やヘブライ語に言及した資料は見当たりませんでした。

あれこれ探しているうちに、英語の表記体系が ARPABET の 2-letter に似ていることに気付きました。そこでスクリプトを書いて、総当たりで2文字の組み合わせのうち SAPI が受け付けるものを調べました。

得られた結果から、資料が揃っている言語ではそれぞれの言語にカスタマイズされた表記体系を使っているのに対して、それ以外は表記体系を共有していることが分かりました。共有されている表記体系に現れる音素で検索したところ、それらが UPS と呼ばれることが分かりました。UPS という用語が分かれば、後はスムーズに資料が見付かりました。それらをまとめたのが今回の記事です。

発音が指定できれば、古代語や人工言語を読ませることもできると期待しています。

7shi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした