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();
}
}
}
}
}