LLM Doghouseのgemma 3a の対応について

あいにく現バージョンのLLamaSharpはgema 3aの対応がまだです。映像だけでなくいよいよ音声も入力できるようなので待ち遠しいです。見る限りClipファイルがいらないっぽいですね。時期バージョンのLLM Doghouseの具体的な仕様は以下です。
・音声入力は直接LLMに渡す仕様に変更。
・テキスト入力は今まで通り。
・チャット履歴は文字で記録する。音声をデータベースに記録するかは未定。
・音声出力は今までどおりVOICEVOX、CeVIO AIを使用する。

音声入力方法についてWindows.Media.SpeechRecognitionではあいにく音声を抜き出すことができないためSystem.Speech.Recognitionを使ってヒアリングをしようと考えています。過去記事でVOSKのサンプルで書いたコードが一番近いと思います。

System.Speech.Recognitionで聞き取った音声をMemoryStreamに変換して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();
                }
            }
        }

    }
}

Follow me!

コメントを残す

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