Whisper.netで録音した声を文字起しする
文字起しにはいろんな方法がありますが話題のWhisperをC#で扱えるWhisper.netを使って文字起しする例を掲載します。
Nugetで「Whisper」で検索してください。Whisper.netをまずNugetして、CPUの場合は「Whisper.net.Runtime」をGPUを使う場合は「Whisper.net.Runtime.Cblast」をNugetします。
ProjectのNugetの内容です。
前回と同じくNaudioを使います。自分の場合はGPUを使いますので「Whisper.net.Runtime.Cblast」をNugetしています。
ローカルでWhisperを動かすにはモデルファイルが必要です。small、base、medium、largeとありますがmedium以上でないと精度が悪いそうです。確かにそんな気がしますね。
モデルは下記のhuggingfaceからダウンロードして所定の場所に置いてください。自分はLm StudioのLLMを入れているフォルダに置いています。
huggingfaceリンク=>https://huggingface.co/ggerganov/whisper.cpp/tree/main
コーディングは下記のとおり。実行すると録音が開始されますのでしゃべり終わったらEnterを押してください。
文字起し結果が表示されます。
using Whisper.net;
using NAudio.Wave;
public class Program
{
// NAudioを使ってマイク音声をメモリに記録し、メモリからWhisperで文字起こしする
static WaveFileWriter waveWriter;
static string modelFileName = @"E:\lm-studio\Whisper\ggml-medium.bin";
public static async Task Main(string[] args)
{
using var wFactory = WhisperFactory.FromPath(modelFileName);
using var wProcessor = wFactory.CreateBuilder().WithLanguage("ja").Build();
WaveInEvent waveIn = new WaveInEvent();
waveIn.WaveFormat = new WaveFormat(16000, 1);
//NAudioイベント定義
waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
MemoryStream memSt = new MemoryStream();
waveWriter = new WaveFileWriter(memSt, waveIn.WaveFormat);
//録音開始
Console.WriteLine("**録音開始**");
waveIn.StartRecording();
Console.WriteLine("**録音を終了する時はEnterを押す**");
string strInput = Console.ReadLine() ?? "";
//録音停止
waveIn.StopRecording();
waveIn.Dispose();
waveWriter.Close();
waveWriter.Dispose();
//waveOutをDisposeしたためmemStをクローン
memSt = new MemoryStream(memSt.ToArray());
//WhisperでmemStを文字に変換
await foreach (var rst in wProcessor.ProcessAsync(memSt))
{
Console.WriteLine($"{rst.Text}");
}
}
static void waveSource_DataAvailable(object sender, WaveInEventArgs e)
{
//録音イベント
waveWriter.WriteData(e.Buffer, 0, e.BytesRecorded);
}
}