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
けど合格ラインじゃないでしょうか。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です