21
VB 資料 【電脳梁山泊 烏賊塾】 -1- System.Speech の利用 System.Speech.Synthesis 名前空間 音声合成には、此の名前空間のクラスを使用する。主に使用するクラス等を下記に示す。 クラス 説明 SpeechSynthesizer 音声合成のエンジン Prompt 発声内容(テキスト、オーディオファイル) PromptBuilder 発声内容の定義(内容、音声、発音等) InstalledVoice インストールされている音声合成の音声 SpeechSynthesizer クラスが音声合成機能を提供するクラスで有る。 Prompt クラスは、音声合成エンジンに依りレンダリング出来る物(テキストやオーディオファイル) に付いての情報を示し、プレーンテキストか、SSMLSpeech Synthesis Markup Language)でマー クアップされたテキストか、予め録音されたオーディオファイル(hAV ファイル等)を保持して居る。 PromptBuilder クラスは、Prompt オブジェクトを作成し、コンテンツの追加、音声の択、音声属性 の制御、語彙発音の制御の為のメソッドを提供する。 猶、此の名前空間のクラスを使用するには、System.Speech の参照を追加する必要が有る。亦、此の名 前空間をインポートして置くと良い。 Visual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis;

音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-1-

■ System.Speech の利用 ■

■ System.Speech.Synthesis 名前空間 音声合成には、此の名前空間のクラスを使用する。主に使用するクラス等を下記に示す。

クラス 説明

SpeechSynthesizer 音声合成のエンジン

Prompt 発声内容(テキスト、オーディオファイル)

PromptBuilder 発声内容の定義(内容、音声、発音等)

InstalledVoice インストールされている音声合成の音声

SpeechSynthesizer クラスが音声合成機能を提供するクラスで有る。 Prompt クラスは、音声合成エンジンに依りレンダリング出来る物(テキストやオーディオファイル)

に付いての情報を示し、プレーンテキストか、SSML(Speech Synthesis Markup Language)でマー

クアップされたテキストか、予め録音されたオーディオファイル(hAV ファイル等)を保持して居る。 PromptBuilder クラスは、Prompt オブジェクトを作成し、コンテンツの追加、音声の選択、音声属性

の制御、語彙発音の制御の為のメソッドを提供する。 猶、此の名前空間のクラスを使用するには、System.Speech の参照を追加する必要が有る。亦、此の名

前空間をインポートして置くと良い。

Visual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis;

音音声声合合成成

Page 2: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-2-

■ SpeechSynthesizer クラス(System.Speech. Synthesis 名前空間) 一般に、音声認識処理をする為には、下記の手順が必要で有る(2と3は省略可)。 1.音声合成エンジンを用意する(インスタンス生成)。 2.音声合成エンジンの音声を指定する(SelectVoice メソッド)。 3.音声合成エンジンの出力デバイスを指定する(SetOutputToDefaultAudioDevice メソッド等)。 4.音声合成エンジンで発声する(Speak メソッド等)。

亦、必要に応じて、下記の手順を追加する。

1.音声合成エンジンに発声させる物を設定する(Prompt オブジェクト等)。 2.音声合成エンジンのイベント処理を設定する(各種イベント)。

インスタンス生成

SpeechSynthesizer クラスのインスタンスを生成するコードを、下記に示す。 Visual Basic 2010 ' 音声合成のインスタンス生成 Private Syn As SpeechSynthesizer = New SpeechSynthesizer() Visual C# 2010 // 音声合成のインスタンス生成 private SpeechSynthesizer syn = new SpeechSynthesizer();

音声の指定 日本語の音声(女性、成人)を、変数 Syn で示される SpeechSynthesizer クラスのインスタンスの音

声に設定するコードを、下記に示す。 Visual Basic 2010 ' 声音の設定 Syn.SelectVoice("Microsoft Haruka Desktop") Visual C# 2010 // 声音の設定 syn.SelectVoice("Microsoft Haruka Desktop");

猶、インストール済の音声を取得して、其の情報をリストボックス(lstVoice)に追加するコードを、

下記に示す。SelectVoice メソッドでは、Name 属性の値を指定する。 Visual Basic 2010 ' 音声の取得 For Each V As InstalledVoice In Syn.GetInstalledVoices() Dim I As VoiceInfo = V.VoiceInfo lstVoice.Items.Add("Name: " & I.Name) lstVoice.Items.Add("Culture: " & I.Culture.ToString()) lstVoice.Items.Add("Age: " & I.Age) lstVoice.Items.Add("Gender: " & I.Gender) lstVoice.Items.Add("Description: " & I.Description) lstVoice.Items.Add("ID: " & I.Id) lstVoice.Items.Add("Enabled: " & V.Enabled) lstVoice.Items.Add(New String("-"c, 65)) Next

Page 3: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-3-

Visual C# 2010 // 音声の取得 foreach (InstalledVoice v in syn.GetInstalledVoices()) { VoiceInfo i = v.VoiceInfo; lstVoice.Items.Add(" Name: " + i.Name); lstVoice.Items.Add(" Culture: " + i.Culture); lstVoice.Items.Add(" Age: " + i.Age); lstVoice.Items.Add(" Gender: " + i.Gender); lstVoice.Items.Add(" Description: " + i.Description); lstVoice.Items.Add(" ID: " + i.Id); lstVoice.Items.Add(" Enabled: " + v.Enabled); lstVoice.Items.Add(new string('-', 65)); }

出力デバイスの指定 実行環境の標準の出力を、変数 Syn で示される SpeechSynthesizer クラスのインスタンスの出力に設

定するコードを、下記に示す。 Visual Basic 2010 ' 実行環境の標準の出力を音声合成エンジンの出力に設定 Syn.SetOutputToDefaultAudioDevice() Visual C# 2010 // 実行環境の標準の出力を音声合成エンジンの出力に設定 syn.SetOutputToDefaultAudioDevice();

猶、出力をオーディオストリームに指定する時は SetOutputToAudioStream メソッドを、hAV ファイ

ルに指定する時は SetOutputTohaveFile メソッドを、何処へも出力しない時(意味が分からないが)

は SetOutputToNull メソッド使用する。 発声 日本語の『こんにちは』と謂う言葉を、変数 Syn で示される SpeechSynthesizer クラスのインスタン

スで、同期の発声を実行するコードを、下記に示す。 Visual Basic 2010 ' 発声 Syn.Speak("こんにちは")

Visual C# 2010 // 発声 syn.Speak("こんにちは");

猶、非同期の発声の時は SpeakAsync メソッドを、SSML(Speech Synthesis Markup Language)で

マークアップされたテキストを同期の発声の時は SpeakSsml メソッドを、SSML でマークアップされ

たテキストを非同期の発声の時は SpeakSsmlAsync メソッドを使用する。 Speech Synthesis Markup Language (SSML) Version 1.0 の詳細は下記のサイトで得られる。 https://www.w3.org/TR/speech-synthesis/(英文) http://www.asahi-net.or.jp/~ax2s-kmtn/ref/accessibility/REC-speech-synthesis11-20100907.html(邦訳) https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html(日本語)

Page 4: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-4-

イベントハンドラの設定 音声合成エンジンは、各種イベントを発生する。イベントの種類と発生するタイミングを、下記に示す。

イベント 内容

SpeakStarted 発声開始時

SpeakProgress 各単語発声後

SpeakCompleted 発声完了時

BookmarkReached ブックマーク到達時

PhonemeReached 音素(Phoneme)到達時

VisemeReached 口形素(Viseme = Visual Phoneme)到達時

StateChanged 状態(State プロパティ)変化時

VoiceChange 音声(Voice プロパティ)変化時

イベントハンドラを追加するコードを、下記に示す。 Visual Basic 2010 AddHandler Syn.SpeakStarted, AddressOf Syn_SpeakStarted AddHandler Syn.SpeakProgress, AddressOf Syn_SpeakProgress AddHandler Syn.SpeakCompleted, AddressOf Syn_SpeakCompleted AddHandler Syn.BookmarkReached, AddressOf Syn_BookmarkReached AddHandler Syn.PhonemeReached, AddressOf Syn_PhonemeReached AddHandler Syn.VisemeReached, AddressOf Syn_VisemeReached AddHandler Syn.StateChanged, AddressOf Syn_StateChanged AddHandler Syn.VoiceChange, AddressOf Syn_VoiceChange Visual C# 2010 syn.SpeakStarted += syn_SpeakStarted; syn.SpeakProgress += syn_SpeakProgress; syn.SpeakCompleted += syn_SpeakCompleted; syn.BookmarkReached += syn_BookmarkReached; syn.PhonemeReached += syn_PhonemeReached; syn.VisemeReached += syn_VisemeReached; syn.StateChanged += syn_StateChanged; syn.VoiceChange += syn_VoiceChange;

上記に対応するイベントプロシージャを、下記に示す。 Visual Basic 2010 Private Sub Syn_SpeakStarted(ByVal sender As Object, _ ByVal e As System.Speech.Synthesis.SpeakStartedEventArgs) Ens Sub Private Sub Syn_SpeakProgress(ByVal sender As Object, _ ByVal e As System.Speech.Synthesis.SpeakProgressEventArgs) Ens Sub Private Sub Syn_SpeakCompleted(ByVal sender As Object, _ ByVal e As System.Speech.Synthesis.SpeakCompletedEventArgs) Ens Sub Private Sub Syn_BookmarkReached(ByVal sender As Object, _ ByVal e As System.Speech.Synthesis.BookmarkReachedEventArgs) Ens Sub

Page 5: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-5-

Private Sub Syn_PhonemeReached(ByVal sender As Object, _ ByVal e As System.Speech.Synthesis.PhonemeReachedEventArgs) Ens Sub Private Sub Syn_VisemeReached(ByVal sender As Object, _ ByVal e As System.Speech.Synthesis.VisemeReachedEventArgs) Ens Sub Private Sub Syn_StateChanged(ByVal sender As Object, _ ByVal e As System.Speech.Synthesis.StateChangedEventArgs) Ens Sub Private Sub Syn_VoiceChange(ByVal sender As Object, _ ByVal e As System.Speech.Synthesis.VoiceChangeEventArgs) Ens Sub Visual C# 2010 private void syn_SpeakStarted(System.Object sender, SpeakStartedEventArgs e) { } private void syn_SpeakProgress(System.Object sender, SpeakProgressEventArgs e) { } private void syn_SpeakCompleted(System.Object sender, SpeakCompletedEventArgs e) { } private void syn_BookmarkReached(System.Object sender, BookmarkReachedEventArgs e) { } private void syn_PhonemeReached(System.Object sender, PhonemeReachedEventArgs e) { } private void syn_VisemeReached(System.Object sender, VisemeReachedEventArgs e) { } private void syn_StateChanged(System.Object sender, StateChangedEventArgs e) { } private void syn_VoiceChange(System.Object sender, VoiceChangeEventArgs e) { }

音量と速度の設定 音量は Volume プロパティで取得や設定を行う。値の範囲は 0 から 100 で有る(既定値は 100)。 亦、読上げ速度はプロパティで取得や設定を行う。値の範囲は-10 から 10 で有る(既定値は 0)。 日本語の『こんにちは』と謂う言葉を、変数 Syn で示される SpeechSynthesizer クラスのインスタン

スで、小さめの声で早口で話すコードを、下記に示す。 Visual Basic 2010 Dim Syn As SpeechSynthesizer = New SpeechSynthesizer() Syn.SelectVoice("Microsoft Haruka Desktop") Syn.Volume = 70 Syn.Rate = 10 Syn.Speak("こんにちは")

Visual C# 2010 SpeechSynthesizer syn = new SpeechSynthesizer(); syn.SelectVoice("Microsoft Haruka Desktop"); syn.Volume = 70; syn.Rate = 10; syn.Speak("こんにちは");

Page 6: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-6-

語彙(Lexicon)の設定 語彙に対する其の発音を定義した辞書(XML ファイル)の追加は AddLexicon メソッドで、削除は

RemoveLexicon メソッドで行う。 発音辞書を読み込んで、変数 Syn で示される SpeechSynthesizer クラスのインスタンスで、発声する

コードを、下記に示す。因みに、下記を実行すると、Haruka(日本女性)は邦訳を、と Zira(米国女

性)は原文を発声する。 Visual Basic 2010 ' レキシコン追加 Dim P As String = Application.StartupPath If Not P.Endshith("¥") Then P &= "¥" Syn.AddLexicon(New Uri(P + "translate.pls"), "application/pls+xml") ' 発声 Syn.Speak("squid is beautiflu.") Syn.Speak("octopus is pretty.") ' レキシコン削除 Syn.RemoveLexicon(New Uri(P + "translate.pls")) Visual C# 2010 // レキシコン追加 string p = Application.StartupPath; if (!p.Endshith(@"¥")) p += @"¥"; syn.AddLexicon(new Uri(p + "translate.pls"), "application/pls+xml"); // 発声 syn.Speak("squid is beautiflu."); syn.Speak("octopus is pretty."); // レキシコン削除 syn.RemoveLexicon(new Uri(p + "translate.pls"));

上記で使用した発音辞書(h3C-PLS ファイル)translate.pls の内容は、下記の通りで有る(格納場所

は実行ファイルと同じ場所で有る)。 XML <?xml version="1.0" encoding="UTF-8"?> <lexicon version="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" alphabet="ipa" xml:lang="ja-JP"> <lexeme> <grapheme>squid</grapheme> <phoneme>ika</phoneme> </lexeme> <lexeme> <grapheme>octopus</grapheme> <phoneme>tako</phoneme> </lexeme>

Page 7: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-7-

<lexeme> <grapheme>is</grapheme> <phoneme>wa</phoneme> </lexeme> <lexeme> <grapheme>beautiful</grapheme> <phoneme>utukusii</phoneme> </lexeme> <lexeme> <grapheme>pretty</grapheme> <phoneme>kawaii</phoneme> </lexeme> </lexicon>

猶、lexicon タグの alphabet 属性に、x-KANA や x-JEITA を指定すると、既定の状態では、例外が発

生する。 亦、複数の表記に同じ発音を割り当てる例を、下記に示す。 XML <?xml version="1.0" encoding="UTF-8"?> <lexicon version="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd" alphabet="ipa" xml:lang="ja"> <lexeme> <grapheme>nihongo<!-- ローマ字 --></grapheme> <grapheme>日本語<!-- 漢字 --></grapheme> <grapheme>にほんご<!-- ひらがな --></grapheme> <phoneme>nihoɴgo <!-- Unicode 文字を含む --> <!-- IPA 文字 : "&H0272 iho &H014B o" --></phoneme> </lexeme> </lexicon>

※ IPA に付いては、後述の発音辞書の項を参照され度い。

Page 8: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-8-

■ Prompt クラス SpeechSynthesizer クラスの Speak メソッド(同期)や SpeakAsync メソッド(非同期)の引数には

String、Prompt、PromptBuilder の孰れかを指定する事が出来る。 プレーンテキストと、SSML でマークアップされたテキストと、PromptBuilder クラスで生成された

Prompt クラスで定義した内容を、変数 Syn で示される SpeechSynthesizer クラスのインスタンスで、

発声するコードを、下記に示す。 Visual Basic 2010 '===================================== ' 文字列から Prompt オブジェクトを生成 '=====================================

' プロンプトのインスタンス生成 Dim P As Prompt = New Prompt("烏賊が好きです。")

' 発声 Syn.Speak(P) '=================================================== ' 文字列から書式を指定して Prompt オブジェクトを生成 '===================================================

' SSML 文字列の生成 Dim S As String = "<speak version='1.0' " S &= "xmlns='http://www.w3.org/2001/10/synthesis' " S &= "xml:lang='ja-JP'>" S &= "烏賊が好きです。<mark name='squid' />" ' ブックマークも設定して居る。 S &= "</speak>"

' プロンプトのインスタンス生成 Dim P As Prompt = New Prompt(S, SynthesisTextFormat.Ssml)

' 発声 Syn.Speak(P) '========================================================= ' PromptBuilder オブジェクトから Prompt オブジェクトを生成 '=========================================================

' PromptBuilder の生成 Dim B As PromptBuilder B = New PromptBuilder(New System.Globalization.CultureInfo("ja-JP")) B.AppendText("烏賊は", PromptVolume.Loud) B.AppendTexthithPronunciation("可愛い", "meɴkoi") ' Unicode 文字を含む B.AppendText("です。", PromptRate.Slow)

' プロンプトのインスタンス生成 Dim P As Prompt = New Prompt(B) ' 発声 Syn.Speak(P)

Page 9: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-9-

Visual C# 2010 //===================================== // 文字列から Prompt オブジェクトを生成 //=====================================

// プロンプのインスタンス生成 Prompt p = new Prompt("烏賊が好きです。"); // 発声 syn.Speak(p); //=================================================== // 文字列から書式を指定して Prompt オブジェクトを生成 //===================================================

// SSML 文字列の生成 string s = "<speak version='1.0' "; s += "xmlns='http://www.w3.org/2001/10/synthesis' "; s += "xml:lang='ja-JP'>"; s += "烏賊が好きです。<mark name='squid' />"; // ブックマークも設定して居る。 s += "</speak>"; // プロンプトのインスタンス生成 Prompt p = new Prompt(S, SynthesisTextFormat.Ssml); // 発声 syn.Speak(p); //========================================================= // PromptBuilder オブジェクトから Prompt オブジェクトを生成 //=========================================================

// PromptBuilder の生成 PromptBuilder b; b = new PromptBuilder(new System.Globalization.CultureInfo("ja-JP")); b.AppendText("烏賊は", PromptVolume.Loud); b.AppendTexthithPronunciation("可愛い", "meɴkoi"); // Unicode 文字を含む b.AppendText("です。", PromptRate.Slow); // プロンプのインスタンス生成 p = new Prompt(b); syn.Speak(p);

※ SSML に付いては、後述の音声合成マークアップ言語の項を参照され度い。

Page 10: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-10-

■ PromptBuilder クラス 下記に PromptBuilder クラスの主要なメソッドの一覧を示す。

メソッド 説明

AppendAudio オーディオファイルを追加

AppendBookmark ブックマークを追加

AppendBreak ブレーク(間合い)を追加

AppendPromptBuilder 他のプロンプトビルダーを追加

AppendSsml SSML ファイルを追加

AppendSsmlMarkup SSML マークアップを追加

AppendText テキストを追加

AppendTexthithAlias 別名付きのテキストを追加

AppendTexthithHint ヒント付きのテキストを追加

AppendTexthithPronunciation 発音付きのテキストを追加

ClearContent コンテンツのクリア

EndParagraph 段落の終わりを指定

EndSentence 文章の終わりを指定

EndStyle スタイルの終わりを指定

EndVoice 声色の終わりを指定

StartParagraph 段落の始まりを指定

StartSentence 文章の始まりを指定

StartStyle スタイルの始まりを指定

StartVoice 声色の終わりを指定

ToXml() SSML を生成

テキストを追加する時には、発声の速度や音量を指定する事や(強調度は現在サポートされて居ない)、

発音(国際音声記号 IPA を使用)を指定する事も出来る。

メソッド詳細 説明

AppendText(String) 文字列を追加

AppendText(String, PromptEmphasis) 強調度を指定して文字列を追加(使用不可)

AppendText(String, PromptRate) 速度を指定して文字列を追加

AppendText(String, PromptVolume) 音量を指定して文字列を追加

AppendTexthithPronunciation(String, String) 発音を指定して文字列を追加 PromptBuilder クラスで定義した内容は、Prompt クラスを通さずに、直接 Speak メソッドの引数に指

定する事も出来る。 PromptBuilder クラスで定義した内容を、変数 Syn で示される SpeechSynthesizer クラスのインスタ

ンスで、発声するコードを、下記に示す。 Visual Basic 2010 ' プロンプトビルダーのインスタンス生成 Dim B As PromptBuilder B = New PromptBuilder(New System.Globalization.CultureInfo("ja-JP")) B.AppendText("烏賊は", PromptVolume.Loud) B.AppendTexthithPronunciation("可愛い", "meɴkoi") ' Unicode 文字を含む B.AppendText("です。", PromptRate.Slow) ' 発声 Syn.Speak(B)

Page 11: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-11-

Visual C# 2010 // プロンプトビルダーのインスタンス生成 PromptBuilder b; b = new PromptBuilder(new System.Globalization.CultureInfo("ja-JP")); b.AppendText("烏賊は", PromptVolume.Loud); b.AppendTexthithPronunciation("可愛い", "meɴkoi"); // Unicode 文字を含む b.AppendText("です。", PromptRate.Slow); // 発声 syn.Speak(b);

亦、予め録音して置いたオーディオファイル(hAV ファイル)を追加して PromptBuilder クラスで定

義した内容を、変数 Syn で示される SpeechSynthesizer クラスのインスタンスで、発声するコードを、

下記に示す。 Visual Basic 2010 ' 起動パスの取得 Dim P As String = Application.StartupPath If Not P.Endshith("¥") Then P &= "¥" ' PromptBuilder の生成 Dim B As PromptBuilder B = New PromptBuilder() B.AppendAudio(P & "squid.wav") ' 発声 Syn.Speak(B) Visual C# 2010 // 起動パスの取得 string p = Application.StartupPath; if(!p.Endshith(@"¥")) p += @"¥"; // PromptBuilder の生成 PromptBuilder b; b = new PromptBuilder(); b.AppendAudio(p + "squid.wav"); // 発声 syn.Speak(b);

Page 12: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-12-

■ 発音辞書 h3C-PLS(Pronunciation Lexicon Specification)音声合成発音辞書 此の規格を利用すれば、語彙に対する発音を定義する事が出来る。例えば、『めんこい』と謂う語彙に

対して『可愛い』と謂う発音を定義すると、『めんこい』の表記は、『可愛い』と発声される等が出来る。 音声認識文法の定義に使用する XML 形式のタグを、下記に示す。

タグ 説明

<lexicon> PLS のルート要素(PLS 言語の他の総ての要素のコンテナ)

<meta> メタデータが含まれて居る要素

<metadata> メタデータが含まれて居る要素

<lexeme> 1 個の字句エントリー用コンテナ要素

<grapheme> 語彙素の綴り法に関する情報が含まれて居る要素

<phoneme> 語彙素の発音情報が含まれて居る要素

<alias> 頭字語の展開と綴り法の代替が含まれて居る要素

<example> 語彙素の使用例が含まれて居る要素

※頭字語とは、PersonalComputer に対して PC の様な名前の頭文字で省略した語等を謂う。 各タグの属性を、下記に示す。

タグ 属性 説明

<lexicon> version ドキュメントに用いる仕様のバージョン(1.0)

xml:base ドキュメント内の総ての相対参照が基底とする URI

xmlns PLS の名前空間(http://www.w3.org/2005/01/pronunciation-lexicon)

xml:lang 発音辞書に適した言語

alphabet デフォルトの発音文字

<meta> name 名前の宣言(http-equiv と同時使用は不可)

http-equiv http-equiv コンテンツの宣言(name と同時使用は不可))

content 内容

<lexeme> xml:id 他のドキュメントから参照する為の ID

role 綴りは同じだが発音方法が異なる単語を区別する為の識別

<phoneme> prefer true か false(デフォルト値は false)

alphabet 此の要素而巳に用いられる発音文字

<alias> prefer true か false(デフォルト値は false)

※alphabet 属性の有効な値は、IPA((InternationalPhoneticAlphabet)と x-jeita、x-jeita-2000、x-sampa

等の x-organization や x-organization-alphabet 形式で示されるベンダー定義の文字列で有る。 但し、標準状態では、IPA 以外の値を使用すると、例外が発生するか、発生しない場合でも、何等

効果が表れず、無視される。 猶、PronunciationLexiconSpecification(PLS)Version1.0 の詳細は下記のサイトで得られる(上の方の

サイトが原文で、下の方のサイトは邦訳)。 https://www.w3.org/TR/2008/REC-pronunciation-lexicon-20081014/ http://www.asahi-net.or.jp/~ax2s-kmtn/ref/accessibility/REC-pronunciation-lexicon-20081014.html

Page 13: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-13-

英単語を日本語の発音で発生するレキシコンの例を、下記に示す(再掲)。此のレキシコンを使用する

と、日本語を話す Haruka の場合は邦訳を話し、英語を話す Zira の場合は原文を話す。 XML <?xml version="1.0" encoding="UTF-8"?> <lexicon version="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" alphabet="ipa" xml:lang="ja-JP"> <lexeme> <grapheme>squid</grapheme> <phoneme>ika</phoneme> </lexeme> <lexeme> <grapheme>octopus</grapheme> <phoneme>tako</phoneme> </lexeme> <lexeme> <grapheme>is</grapheme> <phoneme>wa</phoneme> </lexeme> <lexeme> <grapheme>beautiful</grapheme> <phoneme>utukusii</phoneme> </lexeme> <lexeme> <grapheme>pretty</grapheme> <phoneme>kawaii</phoneme> </lexeme> </lexicon>

亦、函館弁(東北以北?)の表記を標準語で発生するレキシコンの例を、下記に示す。 XML <?xml version="1.0" encoding="UTF-8"?> <lexicon version="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" alphabet="ipa" xml:lang="ja-JP"> <lexeme> <grapheme>なまら</grapheme> <phoneme>totemo</phoneme> </lexeme> <lexeme> <grapheme>うまい</grapheme> <phoneme>oisiii</phoneme> </lexeme>

Page 14: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-14-

<lexeme> <grapheme>しょ</grapheme> <phoneme>desjo</phoneme> </lexeme> </lexicon>

他にも、ベンダー定義の文字列が使用出来る環境に在れば、下記の様に、alphabet 属性に x-KANA を

指定したり、x-JEITA を指定したりして、発音の記述を判り易くする事が出来る様で有る。 XML <?xmlversion="1.0"encoding="UTF-8"?> <lexiconversion="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd" alphabet="x-KANA" xml:lang="ja-JP"> <lexeme> <grapheme>お早う</grapheme> <phoneme>{{x-KANA|おはよー}}</phoneme> </lexeme> <lexeme> <grapheme>今日は</grapheme> <phoneme>{{x-KANA|こんにちわ}}</phoneme> </lexeme> <lexeme> <grapheme>今晩は</grapheme> <phoneme>{{x-KANA|こんばんわ}}</phoneme> </lexeme> </lexicon>

XML <lexicon version="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" alphabet="x-JEITA" xml:lang="jp"> <lexeme> <grapheme>近衛文麿</grapheme> <phoneme>コノエ/フミマロ</phoneme> </lexeme> <lexeme> <grapheme>東久邇宮</grapheme> <phoneme>ヒガシ/クニノミヤ</phoneme> </lexeme> </lexicon>

h3C-PLS(Pronunciation Lexicon Specification)を利用した Visual Basic や Visual C#の出力のコー

ド例に付いては、前述した語彙(Lexicon)の設定を参照され度い。

Page 15: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-15-

国際音声記号 日本語の音韻を国際音声記号で表した一覧表を、下記に示す。

-a -i -u -e -o -ja -ju -jo

∅- あ い う え お や ゆ よ

k- か き く け こ きゃ きゅ きょ

g- が ぎ ぐ げ ご ぎゃ ぎゅ ぎょ

s- さ し す せ そ しゃ しゅ しょ

z- ざ じ ず ぜ ぞ じゃ じゅ じょ

t- た ち つ て と ちゃ ちゅ ちょ

d- だ で ど

n- な に ぬ ね の にゃ にゅ にょ

h- は ひ ふ へ ほ ひゃ ひゅ ひょ

p- ぱ ぴ ぷ ぺ ぽ ぴゃ ぴゅ ぴょ

b- ば び ぶ べ ぼ びゃ びゅ びょ

m- ま み む め も みゃ みゅ みょ

r- ら り る れ ろ りゃ りゅ りょ

w- わ

※ 左欄の記号と、上欄の記号を繋いで 1 個の音韻とする。例えば、『ぎゃ』は『gja』と成る。 亦、特殊モーラ(拍)は、下記の様に表記する。

ɴ ん

Q っ 特殊モーラ

R ー

猶、IPA(International Phonetic Association)の詳細は下記のサイトで得られる。 IPA(InternationalPhoneticAssociation) https://www.internationalphoneticassociation.org/ weblio 辞書 国際音声記号 https://www.weblio.jp/wkpja/content/国際音声記号_国際音声記号の概要 ウィキペディア国際音声記号の文字一覧 https://ja.wikipedia.org/wiki/国際音声記号の文字一覧 日本語の音韻 https://ja.m.wikipedia.org/wiki/日本語の音韻

Page 16: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-16-

■ 音声合成マークアップ言語(SSML) 音声合成マークアップ言語 SSML(Speech Synthesis Markup Language)は、XML ベースのマーク

アップ言語で、発音、音量、ピッチ、速度等の読み上げに関する制御を行う為の標準的な方法で有る。 h3C の音声合成マークアップ言語(SSML)のタグを、下記に示す。

タグ 説明

audio オーディオファイルの再生

break 音声の中での休止

emphasis 音声の強調(強調では、音声の速さと音量を変える)

lang 言語モデルとルールの指定

lexicon 辞書(Lexicon)の位置を指定

lookup 参照する辞書(Lexicon)を指定

mark ブックマークを設定

meta ドキュメントに関する情報を記述

metadata ドキュメントに関する情報を記述

p 段落 paragraph(タグの前後に extra-strong の休止を入れる)

phoneme 音素や音声的な発音の指定

prosody 声の音量、高さ、速さの指定

say-as テキストを解釈する方法を指定

speak SSML ドキュメントのルート要素

sub alias 属性で指定した語句に置き換えて発音

s 文 sentence(タグの前後に strong の休止を入れる)

token 字句 token(単語や文節に相当?)

voice 音声の指定

w 字句(token のエイリアス)

各要素の属性を、下記に示す。 audio 要素

属性 説明

src オーディオファイルの URI(任意)

fetchtimeout 取得のタイムアウト(任意)

fetchhint 事前取得の可否(prefetch(既定値)か safe の値、任意)

maxage 期限切れのコンテンツの使用の可否(任意)

maxstale 期限切れのコンテンツの使用の可否(任意)

clipBegin 再生開始場所のメディアの開始点からのオフセット(任意)

clipEnd 再生終了場所のメディアの開始点からのオフセット(任意)

repeatCount 再生の繰り返し回数(任意)

repeatDur メディアを繰り返し再生する合計時間(任意)

soundLevel 音量(+か-が付く相対的な dB 値、任意)

speed 速度(元の波形の速度に対するパーセンテージ x%で設定、任意)

desc 要素 desc 要素は、audio 要素のコンテンツ内にしか記述出来ない。audio 内で参照されて居るオーディオソ

ースが音声でない場合に、オーディオソースに関して記述したテキストのコンテンツを記述する。

Page 17: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-17-

break 要素

属性 説明

strength 韻律の休止の強さ(none、x-weak、weak、medium、strong、x-strong、任意) none の値は、韻律の休止の境界が出力しない事を示す。

time 出力に挿入される休止の時間長を秒(3s)かミリ秒(250ms)で示す(任意)

emphasis 要素

属性 説明

level 適用する強調の強さ(strong、moderate、none、reduced、任意)

lang 要素

属性 説明

xml:lang 使用言語(言語コードを参照され度い)

lexicon 要素

属性 説明

uri 辞書ドキュメントの位置を識別する URI(必須)

xml:id 辞書ドキュメントの名前(必須)

type 辞書ドキュメントのメディアタイプ(既定値は application/pls+xml、任意)

fetchtimeout データ取得のタイムアウト(任意)

maxage 期限切れのコンテンツの使用の可否(任意)

maxstale 期限切れのコンテンツの使用の可否(任意)

lookup 要素

属性 説明

ref 参照する辞書ドキュメントの名前(lexicon 要素の xml:id 属性、必須)

mark 要素

属性 説明

name マーカーの名前(必須)

p 要素

属性 説明

xml:lang 使用言語(言語コードを参照され度い)

phoneme 要素

属性 説明

ph 音素や音声を表す文字列(必須)

alphabet 音素や音声の発音文字(任意)

type 発音情報の解釈方法に関する付加的な情報(任意)

Page 18: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-18-

prosody 要素

属性 説明

pitch 記述されて居るテキストのベースラインピッチ(任意) 正当な値は、Hz が後続する数値(例 100Hz)か、 x-low、low、medium、high、x-high、default

contour 記述されて居るテキストの実際のピッチ曲線(任意)

range 記述されているテキストのピッチレンジ(任意) 正当な値は、Hz が後続する数値(100Hz)か、 x-low、low、medium、high、x-high、default

rate 記述されて居るテキストの読み上げ速度(任意) 正当な値は、負でないパーセンテージか、 x-slow、slow、medium、fast、x-fast、default

duration 記述されて居るテキストの望ましい読み上げの所要時間(秒かミリ秒、任意)

volume 記述されて居るテキストに対する音量(任意) 正当な値は、前に+か-が、直後に dB が付いた数値か、 silent、x-soft、soft、medium、loud、x-loud、default(デフォルトは+0.0dB)

※ 入れ子に成った子の prosody 要素は、default の値を用いて、現在の音量レベルをリセット出来る。

say-as 要素

属性 説明

interpret-as 記述されているテキスト構成子のコンテンツの種類(必須)

format テキストの正確なフォーマット(任意)

detail 読み上げや表示の正確さのレベル(任意)

speak 要素

属性 説明

xml:lang ルートドキュメントの言語(必須)

xml:base ルートドキュメントの基底 URI(任意)

onlangfailure 読み上げ失敗時の望ましい挙動(任意) changevoice:別の音声が存在すれば、切り替えてコンテンツを読み上げる。 ignoretext:失敗した言語で記述されて居るテキストを無視する。 ignorelang:言語の変更を無視し、以前の言語で読み上げる。 processorchoice:changevoice、ignoretext、ignorelang の孰れかを選択する。

version ドキュメントに用いる仕様のバージョン(必須)

startmark 再生の開始を指定するマーク(任意)

endmark 再生の終了を指定するマーク(任意)

※ トリミング属性(startmark 属性と endmark 属性)は、mark タグで設定する。 例:<mark name="mark1"/>

※ speak 要素には、表示用テキストと audio、break、emphasis、lang、lexicon、lookup、mark、

meta、metadata、p、phoneme、prosody、say-as、sub、s、token、voice、w の要素を含む事が

出来る。

Page 19: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-19-

s 要素

属性 説明

xml:lang 使用言語(言語コードを参照され度い)

sub 要素

属性 説明

alias 囲み込んだ文字列の代わりに、読み上げ用の文字列を指定(必須)

token 要素

属性 説明

xml:lang 使用言語(言語コードを参照され度い)

role 他の仕様との同期に役に立つ追加情報等

voice 要素

属性 説明

gender 音声の性別("male"、"female"、"neutral"、""、任意)

age 音声の年齢を(任意の)

variant 音声特性の望ましい其の他の選択肢(任意)

name 音声の名前(任意)値は、名前を優先度の最も高い物から順に並べたスペースで区

切られたリストや空の文字列も可

languages 音声で読み上げることが望ましい言語のリスト(任意)

w 要素

属性 説明

xml:lang 使用言語(言語コードを参照され度い)

参考迄に、Alexa Skills Kit の音声合成マークアップ言語(SSML)のタグを、下記に示す。

タグ 説明

audio MP3 ファイルの再生

break 音声の中での休止

emphasis 音声の強調(強調では、音声の速さと音量を変える)

lang 言語モデルとルールの指定

p 段落 paragraph(タグの前後に extra-strong の休止を入れる) phoneme 音素や音声的な発音の指定

prosody 声の音量、高さ、速さの指定

s 文章 sentence(タグの前後に strong の休止を入れる)

say-as テキストを解釈する方法を指定

speak SSML ドキュメントのルート要素

sub alias 属性で指定した語句に置き換えて発音

voice 音声の指定

w 字句

Page 20: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-20-

SpeechSynthesizer クラスの Speak メソッド(同期)や SpeakAsync メソッド(非同期)の引数のテ

キストに指定する事の出来る SSML(Speech Synthesis Markup Language)でマークアップされたテ

キストの例を、下記に示す。 XML <?xml version="1.0"?> <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis11/synthesis.xsd" xml:lang="ja-JP"> <prosody rate = "200%">早く話す</prosody> <prosody rate = "30%">遅く話す</prosody> <prosody volume = "x-loud">大声で話す。</prosody> <prosody volume = "x-soft">小声で話す。</prosody> <prosody pitch = "+50%">高い声で話す。</prosody> <prosody pitch = "-30%">低い声で話す。</prosody> </speak>

下記の例では、say-as 要素の interpret-as 属性に digits を指定しても、『イチ、ニイ、サン、ヨン、ゴ』

とは発声せず、『イチマン、ニセン、サンビャク、ヨンジュウ、ゴ』と発声する事が有る。各文字の間

にスペースを入れると、『イチ、ニイ、サン、ヨン、ゴ』と発声する様に成る。 XML <?xml version="1.0"?> <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis11/synthesis.xsd" xml:lang="ja-JP"> 基数として発音される数字の例です。 <say-as interpret-as="cardinal">12345</say-as>。 同じ数字を別々に発音した例です。 <say-as interpret-as="digits">12345</say-as>。 単語をスペルアウトする例です。 <say-as interpret-as="spell-out">hello</say-as> <s>hello</s> </speak>

SpeechSynthesisMarkupLanguage(SSML)Version1.0 の詳細は下記のサイトで得られる。 https://www.w3.org/TR/speech-synthesis/(英文) http://www.asahi-net.or.jp/~ax2s-kmtn/ref/accessibility/REC-speech-synthesis11-20100907.html(邦訳) https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html(日本語)

Page 21: 音声合成 - xdomainjunko036.html.xdomain.jp/school/practice/vb2010/vb17a2.pdfVisual Basic 2010 Imports System.Speech.Synthesis Visual C# 2010 using System.Speech.Synthesis; 音声合成

VB 資料 【電脳梁山泊 烏賊塾】

-21-

■ 言語コード 言語コードの一覧を、下記に示す。

言語/国名 言語コード 言語/国名 言語コード アフリカ af 英語 en

アルバニア sq 英語(オーストラリア) en-AU

バスク eu 英語(ベリーズ) en-BZ

ベラルーシ be 英語(カナダ) en-CA

ブルガリア bg 英語(アイルランド) en-IE

カタロニア ca 英語(ジャマイカ) en-JM

中国語(簡体) zh-CN 英語(ニュージーランド) en-NZ

中国語(繁体) zh-Th 英語(フィリピン) en-PH

クロアチア hr 英語(南アフリカ) en-ZA

チェコ cs 英語(タイ) en-TT

デンマーク da 英語(イギリス) en-GB

オランダ nl 英語(米国) en-US

オランダ(ベルギー) nl-BE 英語(ジンバブエ) en-Zh

オランダ(Netherlands) nl-NL ドイツ語 de

エストニア et ドイツ語(オーストリア) de-AT

フェロー諸島 fo ドイツ語(ドイツ) de-DE

フィンランド語 fi ドイツ語(リヒテンシュタイン) de-LI

フランス語 fr ドイツ語(ルクセンブルグ) de-LU

フランス語(ベルギー) fr-BE ドイツ語(スイス) de-CH

フランス語(カナダ) fr-CA ギリシア語 el

フランス語(フランス) fr-FR ハワイ haw

フランス語(ルクセンブルグ) fr-LU ハンガリー hu

フランス語(モナコ) fr-MC アイスランド語 is

フランス語(スイス) fr-CH インドネシア in

ガリシア gl アイルランド語 ga

ゲール語 gd イタリア語 it

日本語 ja イタリア語(イタリア) it-IT

韓国語 ko イタリア語(スイス) it-CH

マケドニア mk スペイン es

ノルウェー語 no スペイン語(アルゼンチン) es-AR

ポーランド語 pl スペイン語(ボリビア) es-BO

ポルトガル語 pt スペイン語(チリ) es-CL

ポルトガル語(ブラジル) pt-BR スペイン語(コロンビア) es-CO

ポルトガル語(ポルトガル) pt-PT スペイン語(コスタリカ) es-CR

ルーマニア語 ro スペイン語(ドミニカ共和国) es-DO

ルーマニア語(モルドバ) ro-MO スペイン語(エクアドル) es-EC

ルーマニア語(ルーマニア) ro-RO スペイン語(エルサルバドル) es-SV

ロシア語 ru スペイン語(ガテマラ) es-GT

ロシア語(モルドバ) ru-MO スペイン語(ホンジュラス) es-HN

ロシア語(ロシア) ru-RU スペイン語(メキシコ) es-MX

セルビア sr スペイン語(ニカラグア) es-NI

スロバキア語 sk スペイン語(パナマ) es-PA

スロベニア sl スペイン語(パラグアイ) es-PY

スウェーデン語 sv スペイン語(ペルー) es-PE

スウェーデン語(フィンランド) sv-FI スペイン語(プエルトリコ) es-PR

スウェーデン語(スウェーデン) sv-SE スペイン語(スペイン) es-ES

トルコ語 tr スペイン語(ウルグアイ) es-UY

ウクライナ語 uk スペイン語(ベネズエラ) es-VE