AI時代において、テキスト読み上げは現在AIの注目機能の一つであり、各大手企業がこの分野で事業を展開しています。APIを通じて様々なテキストを音声に変換でき、さらには人間を模倣することも可能で、非常に強力です。.NETの本家であるMicrosoftにも、この分野のサービスがあります。もしテキスト読み上げの要求がそこまで高くなければ、Microsoft自身の音声変換ライブラリを使用することができ、実装は非常に簡単で、わずか5行のコードで実現できます。本記事ではその使用方法を紹介します。
使用手順
- 環境準備
コンソールプロジェクトを新規作成し、nugetツールを使用してSystem.Speechをインストールします。ローカルのライブラリに追加インストールすることも可能です。下図のようにnugetインストールを行います。

- 以下のコードを入力し、参照
using System.Speech.Synthesis;を追加します。
static void Main(string[] args)
{
// SpeechSynthesizerのインスタンス化
SpeechSynthesizer synth = new SpeechSynthesizer();
// 音声出力の設定
synth.SetOutputToDefaultAudioDevice();
// 文字列を音声に変換
synth.Speak("こんにちは!DotNet開発転職");
Console.WriteLine();
Console.WriteLine("任意のキーを押して終了...");
Console.ReadKey();
}
「こんにちは!DotNet開発転職」と読み上げが成功します。ここではコンソールアプリですが、WinFormsやWPFを使ってより完成度の高いものを作成することも可能です。
拡張例
ここでは.NETのWebサイトを使用して音声変換機能を実装します。要件は、テキストボックスに一文を入力し、このSystem.Speechコントロールを使用して音声に変換し、ページに読み込んで再生することです。
まず、新しい
.NETのWebアプリケーションを作成し、上記の例と同様にnugetでSystem.Speechを導入します。新しい
index.shtmlページを作成し、シンプルなテキストボックスと検索ボタン、そして音声出力コントロールをデザインします。コードは以下の通りです。
<form>
<p>
Title: <input type="text" asp-for="Speektext" />
<input type="submit" value="音声生成" />
</p>
</form>
<audio style="width:350px;height:50px;" id="bofang" controls>
<source src="@Model.filename" type="audio/mpeg" />
</audio>
Index.cshtml.csページで、入力テキスト変換用のプロパティとファイルパス用のプロパティを新規作成し、コンストラクタインジェクションでパス読み取り用ミドルウェアを注入します。
private readonly IHostingEnvironment _IhostingEnvironment;
[BindProperty(SupportsGet = true)]
// 変換するテキストの入力に使用
public string? Speektext { get; set; }
// ファイルパスの出力に使用
public string filename { get; set; }
// リソースファイルのパスを読み取るための注入
public IndexModel(IHostingEnvironment hostingEnvironment)
{
_IhostingEnvironment= hostingEnvironment;
}
OnGetAsyncメソッド内で音声処理ロジックを記述します。コードは以下の通りです。
public async Task OnGetAsync()
{
string wavname = "test";
string filePath = _IhostingEnvironment.WebRootPath+ $"\\speech\\{wavname}.wav";
bool isFile = System.IO.File.Exists(filePath);
if (isFile)
{
// ファイルを削除
System.IO.File.Delete(filePath);
}
if (string.IsNullOrEmpty(Speektext))
Speektext = "こんにちは!「dotnet開発転職」へようこそ!";
if (!string.IsNullOrEmpty(Speektext))
{
using (SpeechSynthesizer synth = new SpeechSynthesizer())
{
// 音声ファイルを設定、出力ストリームとファイル形式を指定
synth.SetOutputToWaveFile(filePath, new SpeechAudioFormatInfo(32000, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
// 空のPromptオブジェクトを作成し、コンテンツの追加、音声の選択、音声プロパティの制御、単語の発音制御を提供
PromptBuilder builder = new PromptBuilder();
builder.AppendText(Speektext);
// ファイル出力
synth.Speak(builder);
}
// ファイルパスを返す
filename = $"\\speech\\{wavname}.wav";
}
}
- フロントエンドでJavaScriptを使用して音声コントロールに読み込みます。
<input type="button" id="aa" value="再生" onclick="bofang()" />
<script type="text/javascript">
function bofang() {
var url = "@Model.filename.Replace("\\","\\\\")";
var audio = document.getElementById('bofang');
$('#bofang').attr('src',url);
audio.play();
}
</script>
これでテキストボックスに内容を入力し、音声を読み上げることができます。このコードをカプセル化して、ニュースの音声読み上げなどに応用できます。効果は以下の通りです。

サンプルコードのリンク:
https://pan.baidu.com/s/1IJadMleVEM3ePHE_KHqRqA?pwd=soiq
抽出コード:soiq
まとめ
本記事では、.NETで簡単にテキストを音声に変換する方法を紹介しました。参考にして、独自のメソッドにカプセル化してください。この例はWindows環境のみ対応している点に注意してください。クロスプラットフォームのプロジェクトでは、各自調査を行ってください。本記事が皆様の学習や業務に少しでも参考になれば幸いです。ご支援ありがとうございます。
本記事の参考:Microsoft公式技術ドキュメント
サイト管理者による拡張
元記事.NET 3行コードでテキスト読み上げ機能を実現を参考に、サイト管理者がMAUI Blazorプロジェクトを作成し、記事の手順に従ってnugetパッケージを追加し、テキスト読み上げ機能を実現しました。キーコードを掲載し、撮影した動画も添付します。
@page "/"
@using System.Speech.Synthesis
<h1>変換したいテキストを入力し、再生ボタンをクリックしてください</h1>
<MRow>
<MCol Cols="12" Md="4">
<MTextField @bind-Value="_message" Label="変換するテキスト"></MTextField>
</MCol>
</MRow>
<MRow>
<MCol Cols="12" Md="4">
<MButton Class="mr-4" Color="@(string.IsNullOrEmpty(_message) ? "warning" : "success")" OnClick="PlayWord">再生</MButton>
</MCol>
</MRow>
@code{
private string _message;
private SpeechSynthesizer _synth;
private void PlayWord()
{
if (_synth == null)
{
_synth = new SpeechSynthesizer();
_synth.SetOutputToDefaultAudioDevice();
}
_synth.Speak(_message);
}
}