音声ファイルからテキスト化(Azure)C#

音声ファイルを選択し実行。曲の歌詞は、難しいようです。会話は、うまくテキスト化できました。テキスト化が終了すると、テキストボックスに表示されます。アプリの実行フォルダーにテキストデータ(ファイル名は、TEXT。内容は、追記されます。)が作成されます。
音声テキスト変換の概要
Foundry Tools サービスの Azure Speech は、高度な音声テキスト変換機能を提供します。 この機能では、リアルタイムおよびバッチの両方の文字起こしをサポートしており、オーディオ ストリームをテキストに変換するための汎用性の高いソリューションを実現できます。
リアルタイム文字起こし
リアルタイムの音声テキスト変換では、マイクまたはファイルからオーディオを認識すると、その文字起こしを行います。
Microsoft Azure AI Speech SDKを使用するこれには、Azure Portal での Azure Speech リソースの設定、資格情報の取得、
SpeechRecognizerC# アプリケーションでの SDK のクラスの使用が含まれます。

- Azure アカウントと音声リソース:
- 有効な Azure サブスクリプションが必要です。無料で作成できます。
- Azure ポータルで、新しい「Speech」サービス リソースを作成します。
- 作成したら、リソースの「キーとエンドポイント」セクションに移動し、キー 1 またはキー 2 とエンドポイントをコピーします。
- 開発環境:
- 適切な Microsoft Visual C++ 再頒布可能パッケージがインストールされたVisual Studio (2015、2017、2019、または 2022) 。
- 互換性のある .NET プラットフォーム (.NET Core、.NET 5+、.NET Standard 2.0 など) を対象とする C# プロジェクト。
- Microsoft.CognitiveServices.Speech NuGet パッケージをインストールします。NuGet パッケージ マネージャー コンソールからインストールできます。
Form1


Microsoft.CognitiveServices.Speechのバージョンは、1.47ではなく1.45を導入。Formにて、1.47はSpeechConfig実行時にエラーが出て処理できません。(2025-12-11時点で)

Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
namespace FileToText
{
public partial class Form1 : Form
{
private static string wavefile = "";
//private SpeechRecognizer recognizer;
private static string SpeechKey = "3maga************************************zCEz"; // Replace with your key
private static string Endpoint = "https://japan****************************.com/"; // Replace with your region (e.g., "westus")
private static string Language = "ja-JP";
//翻訳言語の設定
String[] Gengo = new String[9] { "01", "ja-JP", "日本語", "02", "en-US", "英語", "03", "ko-KR", "韓国語" };
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();
public Form1()
{
InitializeComponent();
AllocConsole();
textBox2.Text = SpeechKey;
textBox3.Text = Endpoint;
for (int i = 2; i < Gengo.Length; i = i + 3)
{
//Console.WriteLine("{0}番目の要素の値は{1}です。", i + 1, Gengo[i]);
// コンボボックスに項目を追加する
comboBox1.Items.Add(Gengo[i]);
}
// 初期値を設定する(日本語を選択する)
comboBox1.SelectedIndex = 0;
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void button3_Click(object sender, EventArgs e)
{
textBox1.Text = "";
}
private void button4_Click(object sender, EventArgs e)
{
//OpenFileDialogクラスのインスタンスを作成
OpenFileDialog ofd = new OpenFileDialog();
//はじめのファイル名を指定する
//はじめに「ファイル名」で表示される文字列を指定する
ofd.FileName = "";
//はじめに表示されるフォルダを指定する
//指定しない(空の文字列)の時は、現在のディレクトリが表示される
ofd.InitialDirectory = @"C:\";
//[ファイルの種類]に表示される選択肢を指定する
//指定しないとすべてのファイルが表示される
ofd.Filter = "waveファイル(*.wav)|*.wav|すべてのファイル(*.*)|*.*";
//[ファイルの種類]ではじめに選択されるものを指定する
//2番目の「Waveファイル」が選択されているようにする
ofd.FilterIndex = 1;
//タイトルを設定する
ofd.Title = "開くファイルを選択してください";
//ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする
ofd.RestoreDirectory = true;
//存在しないファイルの名前が指定されたとき警告を表示する
//デフォルトでTrueなので指定する必要はない
ofd.CheckFileExists = true;
//存在しないパスが指定されたとき警告を表示する
//デフォルトでTrueなので指定する必要はない
ofd.CheckPathExists = true;
//ダイアログを表示する
if (ofd.ShowDialog() == DialogResult.OK)
{
//OKボタンがクリックされたとき、選択されたファイル名を表示する
Console.WriteLine(ofd.FileName);
textBox4.Text = ofd.FileName;
}
}
//start
private async void button1_Click(object sender, EventArgs e)
{
SpeechKey = textBox2.Text;
Endpoint = textBox3.Text;
Language = Gengo[comboBox1.SelectedIndex * 3 + 1];
wavefile = textBox4.Text;
button1.Enabled = false;
textBox1.Text += await FromFile();
button1.Enabled = true;
}
//FromFile
async static Task<string> FromFile()
{
//string Endpoint = "https://japaneast****************************";
//string SpeechKey = "3maga***************************************";
var speechConfig = SpeechConfig.FromEndpoint(new Uri(Endpoint), SpeechKey);
speechConfig.SpeechRecognitionLanguage = Language;
var stopRecognition = new TaskCompletionSource<int>();
var sb = new StringBuilder();
// FromToFileの開始
using (var audioConfig = AudioConfig.FromWavFileInput(wavefile))
{
using (var recognizer = new SpeechRecognizer(speechConfig, audioConfig))
{
recognizer.Recognized += (s, e) =>
{
if (e.Result.Reason == ResultReason.RecognizedSpeech)
{
var time = TimeSpan.FromSeconds(e.Result.OffsetInTicks / 10000000).ToString(@"hh\:mm\:ss");
var text = $"{time} {e.Result.Text}\n\r";
Console.Write(text);
sb.Append(text+"\n\r" + "\n\r");
File.AppendAllText(System.IO.Directory.GetCurrentDirectory() + @"\Text.txt", text);
}
else if (e.Result.Reason == ResultReason.NoMatch)
{
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
}
};
recognizer.Canceled += (s, e) =>
{
// Console.WriteLine($"CANCELED: Reason={e.Reason}");
if (e.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you update the subscription info?");
// ret = null;
}
stopRecognition.TrySetResult(0);
};
// recognizer.SessionStarted += (s, e) =>
// {
// Console.WriteLine("\n Session started event.");
// };
// recognizer.SessionStopped += (s, e) =>
// {
// Console.WriteLine("\n Session stopped event.");
// Console.WriteLine("\nStop recognition.");
// if (string.IsNullOrEmpty(ret))
// ret = "";
// stopRecognition.TrySetResult(0);
// };
// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);
// Waits for completion.
// Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopRecognition.Task });
// Stops recognition.
await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
}
}
return sb.ToString();
}
}
}