Windows.Media.SpeechRecognitionで文字起しする
VOSKの文字起しは早くていいんですが会話だと変換がうまくできなくて少し伝わりにくいので他を探していたところ、Windows.Media.SpeechRecognitionを発見しましたのでテストしたいと思います。
.NET 8.0ではサポートしてないっぽいので、もしかしたらなくなってしまう機能かも知れません。
Nugetは、Microsoft.Windows.SDK.Contractsをインポートしてください。そのままだと.NET 8.0ではエラーになりますので、Projectファイルを開いてPackageReference Conditionに下記の$(TargetFramework)' == 'netcoreapp3.1'"を追加してください。
<ItemGroup>
<PackageReference Condition="'$(TargetFramework)' == 'netcoreapp3.1'" Include="Microsoft.Windows.SDK.Contracts" Version="10.0.26100.1742" />
</ItemGroup>
あとは、Windowsの設定で、「時刻と言語」->「音声認識」->「音声認識のプライバシー」を順に開いて赤丸のところがONになっていることを確認してください。
これってオンラインで外に出ていくのか・・・まあ仕方ない。エロトークが漏れるのが嫌なひとはVOSKのままで。
概要
マイクで話した音声をテキストとして表示する。読み込み中は○で結果は●で表示する。
using Windows.Media.SpeechRecognition;
namespace WspeechTEST
{
class Program
{
static void Main(string[] args)
{
Task task = MainAsync();
task.Wait();
}
private static async Task MainAsync()
{
SpeechRecognizer recognizer = new SpeechRecognizer();
recognizer.Timeouts.InitialSilenceTimeout = TimeSpan.FromSeconds(6.0); // (認識結果が生成されるまでの) 無音を検出し、音声入力が続かないと見なす時間の長さ。
recognizer.Timeouts.BabbleTimeout = TimeSpan.FromSeconds(4.0); //認識できないサウンド (雑音) のリッスンを継続し、音声入力が終了したと見なし、認識処理を終了するまでの時間の長さ。
recognizer.Timeouts.EndSilenceTimeout = TimeSpan.FromSeconds(1.0); //(認識結果が生成された後の) 無音を検出し、音声入力が終了したと見なす時間の長さ。
await recognizer.CompileConstraintsAsync();
//イベント処理
recognizer.HypothesisGenerated += (sender, e) =>
{
Console.WriteLine($"○={e.Hypothesis.Text}");
};
recognizer.ContinuousRecognitionSession.ResultGenerated += (sender, e) =>
{
Console.WriteLine($"●={e.Result.Text}");
};
recognizer.ContinuousRecognitionSession.Completed += async (sender, e) =>
{
Console.WriteLine("TimeOut!");
//recognizer restart
await recognizer.ContinuousRecognitionSession.StartAsync();
};
//recognizer start
await recognizer.ContinuousRecognitionSession.StartAsync();
Console.ReadKey();
}
}
}
【結果】
結果は良好で処理は速いし予測変換もしてくれるので、かなりいい!
がしかし、「マ●コ」や「チ●コ」は***になります^^;
「おっぱい」「まん」はいけるのかぁ。TKとMKって言ったら「マ●コ」や「チ●コ」に置き換えるかな。