WPF on .NET Core 3.0 で UWP の SpeechSynthesizer を使う

.NET Framework では、音声合成を利用するアプリケーションを System.Speech.Synthesis.SpeechSynthesizer クラスを利用することで作成できましたが、.NET Core では、上記クラスを利用することができません。そこで、UWP で利用できる Windows.Media.SpeechSynthesis.SpeechSynthesizer クラスを使用する WPF アプリケーションを試作してみました。

最初に .NET Framework で System.Speech.Synthesis.SpeechSynthesizer クラスを利用したアプリケーションを作成して、.NET Portability Report を表示してみた結果、Platform Extensions でも非対応となっています。

.NET Portability Report の画像
.NET Portability Report の画像

そこで、NuGet から Microsoft.Windows.SDK.Contracts パッケージを取得して UWP で利用できる Windows.Media.SpeechSynthesis.SpeechSynthesizer クラスの利用を検討してみました。SpeechSynthesizer.SynthesizeTextToStreamAsync(String) メソッドを利用することで音声合成結果を得ることができますが、このメソッドの返り値は Windows.Media.SpeechSynthesis.SpeechSynthesisStream クラスになっていて、そのままでは System.IO.Stream クラスとして扱うことはできません。ただ、内部にストリームを持っているはずなので、どうにかして簡単に取り出せないかなと試行錯誤していたら、WindowsRuntimeStreamExtensions.AsStreamForRead(IInputStream) 拡張メソッドを利用するとすぐに取り出すことができました(この拡張メソッドを呼び出すには using ディレクティブで System.Io 名前空間を指定しておく必要があります)。

ソースコード全体は、github のリポジトリに置いているので、必要な方はそちらを参照してください。ソリューション エクスプローラーのスクリーンショットで、全体の構造を表示しておきます。

ソリューション エクスプローラーのスクリーンショット
ソリューション エクスプローラーのスクリーンショット

UWP 用の Windows.Media.SpeechSynthesis.SpeechSynthesizer クラスを利用して WPF で音声合成を行う部分のコードは、次のようになります。取り出した Stream は、SoundPlayer を利用して音を出しています。

最後に作成したアプリケーションのスクリーンショットを掲載しておきます。

作成したアプリケーションのスクリーンショット
作成したアプリケーションのスクリーンショット

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です