@kvellou

Как улучшить качество распознавания Vosk на C#?

Хочу создать голосовой ассистент на c# с использованием vosk. Протестировал код на офиц. гитхабе, но проблема в том что он распознает только некоторые слова. И как можно улучшить качество распознавания?

Модели:
vosk-model-ru-0.42
vosk-model-en-us-0.22
vosk-model-spk-0.4

using System;
using System.IO;
using Vosk;

public class VoskDemo
{
    public static void DemoBytes(Model model)
    {
        // Demo byte buffer
        VoskRecognizer rec = new VoskRecognizer(model, 16000.0f);
        rec.SetMaxAlternatives(0);
        rec.SetWords(true);
        using (Stream source = File.OpenRead(@"C:\Users\123\Downloads\test2.wav"))
        {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
            {
                if (rec.AcceptWaveform(buffer, bytesRead))
                {
                    Console.WriteLine(rec.Result());
                }
                else
                {
                    Console.WriteLine(rec.PartialResult());
                }
            }

        }
        Console.WriteLine($"Final Text: {rec.FinalResult()}");
    }

    public static void DemoFloats(Model model)
    {
        // Demo float array
        VoskRecognizer rec = new VoskRecognizer(model, 16000.0f);
        using (Stream source = File.OpenRead(@"C:\Users\123\Downloads\test2.wav"))
        {
            byte[] buffer = new byte[4096];
            int bytesRead;

            while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
            {
                float[] fbuffer = new float[bytesRead / 2];
                for (int i = 0, n = 0; i < fbuffer.Length; i++, n += 2)
                {
                    fbuffer[i] = BitConverter.ToInt16(buffer, n);
                }
                if (rec.AcceptWaveform(fbuffer, fbuffer.Length))
                {
                    Console.WriteLine(rec.Result());
                }
                else
                {
                    Console.WriteLine(rec.PartialResult());
                }
            }

        }
        Console.WriteLine($"Final Text: {rec.FinalResult()}");
    }

    public static void DemoSpeaker(Model model)
    {
        // Output speakers
        SpkModel spkModel = new SpkModel(@"C:\Users\123\Downloads\vosk-model-spk-0.4\vosk-model-spk-0.4");
        VoskRecognizer rec = new VoskRecognizer(model, 16000.0f);
        rec.SetSpkModel(spkModel);

        using (Stream source = File.OpenRead(@"C:\Users\123\Documents\test.wav"))
        {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
            {
                if (rec.AcceptWaveform(buffer, bytesRead))
                {
                    Console.WriteLine(rec.Result());
                }
                else
                {
                    Console.WriteLine(rec.PartialResult());
                }
            }
        }
        Console.WriteLine($"Final Text: {rec.FinalResult()}");
        
    }

    public static void Main()
    {
        // You can set to -1 to disable logging messages
        Vosk.Vosk.SetLogLevel(0);

        Model model = new Model(@"C:\Users\123\Downloads\vosk-model-en-us-0.22\vosk-model-en-us-0.22");
        DemoBytes(model);
        DemoFloats(model);
        DemoSpeaker(model);
    }
}
  • Вопрос задан
  • 617 просмотров
Решения вопроса 1
@RD07
Добрый день.
Перед распознаванием конвертируйте ваш файл в sample_rate (из вашего примера он = 16000) который вы указали.
По моему скромному мнению на 8000 vosk-model-ru-0.42 справляется лучше, но чуть дольше соответственно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы