音声ファイルを翻訳(Azure)C#

오늘은 투 비트 킥 자유형 영상입니다. 투 비트 킥은 킥 비트가 적기 때문에 아주 빠른 수연을 투비트 킥으로 하기에는 무리가 있습니다. 그렇지만 장점으로는 킥 비트가 적기 때문에 킥을 많이 하는 수영에 비해서 에너지 소모가 적고 글라이드가 길기 때문에 스트로크를 길게 할 수 있다는 점이 있습니다. 그럼 한번 배워볼까요?
今日の動画は2拍のキックフリースタイルです。二拍蹴りはキックビートが少ないので、非常に速いソヨンを二拍蹴りに変えるのは不可能です。しかし、その利点は、キックビートが少なく、長い滑空で泳ぐよりもエネルギーを節約できることです。では、学びましょうか?
양팔 스트로크 한 번에 킥 두 번을 찬다고 해서 투 비트 킥이라고도 하고 원 킥이라고도 합니다. 둘 중 편하게 생각하시면 돼요. 하다 보면 어느 쪽 팔에 어느 쪽 킥을 쳐야 하는지 헷갈릴 수 있습니다. 풀 기준으로 같은 발 같은 팔이며.
両腕で一度に2回蹴ることは、ツービートキックまたはワンキックとも呼ばれます。どちらも快適だと考えていいでしょう。その過程で、どのキックをどの腕に当てればいいのか混乱するかもしれません。足と腕は完全な基準で見れば同じです。
리커버리 기준으로 다른 발 다른 팔입니다 이렇게요.
回復状況から判断すると、別の足と腕のようです。
근데 이렇게 반대로 하시는 분들도 계세요. 투비티 킥의 장점인 글라이리를 쫙 쫙 쓰면서 가야 하는데 반대로 킥을 하면 이렇게 톡톡 막히는 수영을 하게 되며 호흡 자세가 부자연스럽게 됩니다. 더 자세히 비교해 볼게요.
しかし、逆のことをする人もいます。トゥーブティのキックであるグリリーの利点を活かさなければなりませんが、逆に蹴るとそのチョークで泳ぎ、呼吸姿勢が不自然になってしまいます。もっと詳しく比較してみましょう。
韓国語の音声ファイルを選択し日本語へ翻訳。翻訳作業が終了すると、テキストボックスに表示されます。アプリの実行フォルダーにテキストデータ(ファイル名は、TEXT。内容は、追記されます。)が作成されます。
音声翻訳とは何か
Speech サービスは、音声ストリームのリアルタイムの多言語音声変換と音声テキスト変換をサポートします。Speech SDK または Speech CLI を使用すると、アプリケーション、ツール、デバイスから、提供されたオーディオのソース トランスクリプションや翻訳出力にアクセスできます。 音声の検出中には中間トランスクリプションと翻訳結果が返され、最終的な結果は、合成された音声に変換することができます。
リアルタイム音声翻訳
リアルタイムの音声翻訳では、マイクまたはファイルからオーディオを認識すると、対象言語に翻訳します。
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.IO;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using Microsoft.CognitiveServices.Speech.Translation;
namespace FileToTranslation
{
public partial class Form1 : Form
{
private static string wavefile = "";
//private SpeechRecognizer recognizer;
private static string SpeechKey = "3mag************************************GzCEz"; // Replace with your key
private static string Endpoint = "https://japan****************************.com/"; // Replace with your region (e.g., "westus")
private static string FromLanguage = "en-US";
private static string ToLanguage = "ja";
//翻訳言語の設定
String[] GengoS = new String[9] { "01", "ja-JP", "日本語", "02", "en-US", "英語", "03", "ko-KR", "韓国語" };
String[] GengoT = new String[6] { "01", "ja", "日本語", "02", "en", "英語" };
[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 < GengoS.Length; i = i + 3)
{
//Console.WriteLine("{0}番目の要素の値は{1}です。", i + 1, Gengo[i]);
// コンボボックスに項目を追加する
comboBox1.Items.Add(GengoS[i]);
}
for (int i = 2; i < GengoT.Length; i = i + 3)
{
//Console.WriteLine("{0}番目の要素の値は{1}です。", i + 1, Gengo[i]);
// コンボボックスに項目を追加する
comboBox2.Items.Add(GengoT[i]);
}
// 初期値を設定する(日本語を選択する)
comboBox1.SelectedIndex = 1;
comboBox2.SelectedIndex = 0;
}
//End
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
//Clear
private void button3_Click(object sender, EventArgs e)
{
textBox1.Text = "";
}
//FileSelect
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;
FromLanguage = GengoS[comboBox1.SelectedIndex * 3 + 1];
ToLanguage = GengoT[comboBox2.SelectedIndex * 3 + 1];
wavefile = textBox4.Text;
button1.Enabled = false;
textBox1.Text += await FromFileTranslation();
button1.Enabled = true;
}
//
async static Task<string> FromFileTranslation()
{
//string Endpoint = "https://japaneast****************************";
//string SpeechKey = "3maga***************************************";
var speechconfig = SpeechTranslationConfig.FromEndpoint(new Uri(Endpoint), SpeechKey);
// Source language is required, but currently ignored.
speechconfig.SpeechRecognitionLanguage = FromLanguage;
speechconfig.AddTargetLanguage(ToLanguage);
var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromLanguages(new string[] { "ja-JP", "en-US", "ko-kR" });
var stopTranslation = new TaskCompletionSource<int>();
var sb = new StringBuilder();
using (var audioInput = AudioConfig.FromWavFileInput(wavefile))
{
using (var translationRecognizer = new TranslationRecognizer(speechconfig, audioInput))
{
// Subscribes to events.
/*
translationRecognizer.Recognizing += (s, e) =>
{
Console.WriteLine($"RECOGNIZING in '{FromLanguage}': Text={e.Result.Text}");
foreach (var element in e.Result.Translations)
{
Console.WriteLine($" TRANSLATING into '{element.Key}': {element.Value}");
}
};
*/
translationRecognizer.Recognized += (s, e) =>
{
if (e.Result.Reason == ResultReason.TranslatedSpeech)
{
Console.WriteLine($"RECOGNIZED in '{FromLanguage}': Text={e.Result.Text}");
if (e.Result.Text != "")
{
sb.Append(e.Result.Text + "\r\n");
File.AppendAllText(System.IO.Directory.GetCurrentDirectory() + @"\Text.txt", e.Result.Text + "\r\n");
foreach (var element in e.Result.Translations)
{
Console.WriteLine($" TRANSLATED into '{element.Key}': {element.Value}");
sb.Append(element.Value + "\r\n" + "" + "\r\n");
File.AppendAllText(System.IO.Directory.GetCurrentDirectory() + @"\Text.txt", element.Value + "\r\n" + "" + "\r\n");
}
}
}
else if (e.Result.Reason == ResultReason.RecognizedSpeech)
{
Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
Console.WriteLine($" Speech not translated.");
}
else if (e.Result.Reason == ResultReason.NoMatch)
{
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
}
};
translationRecognizer.SpeechStartDetected += (s, e) => {
Console.WriteLine("\nSpeech start detected event.");
};
translationRecognizer.SpeechEndDetected += (s, e) => {
Console.WriteLine("\nSpeech end detected event.");
};
translationRecognizer.SessionStarted += (s, e) => {
Console.WriteLine("\nSession started event.");
};
translationRecognizer.SessionStopped += (s, e) => {
Console.WriteLine("\nSession stopped event.");
Console.WriteLine($"\nStop translation.");
stopTranslation.TrySetResult(0);
};
// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
Console.WriteLine("Start translation...");
await translationRecognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);
// Waits for completion.
// Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopTranslation.Task });
// Stops translation.
await translationRecognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
}
}
return sb.ToString();
}
}
}