Voskで会話を文字起しする②
Voskは精度がいいことがわかったので会話を文字起しすることにします。結構この会話を文字にするところの割り込みが難しかったりするのです。そこでMicrosoftのSystem.Speech.Recognitionを使用することにします。それ自体で文字起しする機能がありますがGrammar設定をしないと精度がよくないんです。イベント発動と録音の部分だけ拝借して文字起しはVoskにやってもらう作戦です。
Nuget情報
概要
マイクで話すとSpeechRecognizedイベントが発生し、読み取った音声をメモリストリームに書き込んでVoskに渡して文字起しをします。
using System.Speech.Recognition;
using System.Text.Json;
using Vosk;
namespace SpeechTest07
{
class Program
{
static void Main(string[] args)
{
//Vosk設定
Vosk.Vosk.SetLogLevel(-1); //LogメッセージOFF
Model model = new Model(Environment.GetEnvironmentVariable("LLMPATH", System.EnvironmentVariableTarget.User)+@"vosk\vosk-model-ja-0.22");
// SpeechRecognitionの設定
using (
SpeechRecognitionEngine recognizer =
new SpeechRecognitionEngine(
new System.Globalization.CultureInfo("ja-JP")))
{
recognizer.LoadGrammar(new DictationGrammar());
// SpeechRecognizedイベント定義
recognizer.SpeechRecognized += (sender, e) =>
{
//RecognizedしたwaveをMemoryStreamに書き込み
MemoryStream st = new MemoryStream();
e.Result.Audio.WriteToWaveStream(st);
st.Position = 0;
// byte buffer
VoskRecognizer rec = new VoskRecognizer(model, 16000.0f);
rec.SetMaxAlternatives(0);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = st.Read(buffer, 0, buffer.Length)) > 0)
rec.AcceptWaveform(buffer, bytesRead);
// Json形式のResultからテキストを抽出
string jsontext = rec.FinalResult();
string gettext = "";
var jsondoc = JsonDocument.Parse(jsontext);
if (jsondoc.RootElement.TryGetProperty("text", out var element))
{
gettext = element.GetString() ?? "";
}
Console.WriteLine($"★ 文字起し: {gettext.Replace(" ", "")}");
//MemoryStream破棄
st.Close();
st.Dispose();
};
// Configure input to the speech recognizer.
recognizer.SetInputToDefaultAudioDevice();
// Start asynchronous, continuous speech recognition.
recognizer.RecognizeAsync(RecognizeMode.Multiple);
Console.WriteLine("★★ マイクに向かって話してください ★★");
// Keep the console window open.
while (true)
{
Console.ReadLine();
}
}
}
}
}
結果
関西弁の「チャウチャウちゃうん」をしゃべったのですが、「チャウチャウちゃん」と認識するようですね
「せやんなあ」が「西安なぁ」になってるしw
けど合格ラインじゃないでしょうか。