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

}

Follow me!

コメントを残す

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