弹来弹去跑马灯!

C#利用Vosk开源模型语音识别

#C#利用Vosk开源模型语音识别

#by wgscd

模型下载:VOSK Models (alphacephei.com) 找到chinese 

Chinese        
vosk-model-small-cn-0.22 42M 23.54 (SpeechIO-02) 38.29 (SpeechIO-06) 17.15 (THCHS) Lightweight model for Android and RPi Apache 2.0
vosk-model-cn-0.22 1.3G 13.98 (SpeechIO-02) 27.30 (SpeechIO-06) 7.43 (THCHS)

测试效果用麦克风+大模型(不是small模型包)还是挺不错,

如果识别系统电脑声音(系统音频卡输出语音,我们使用外部输入语音)就基本是无法准确识别!可惜!

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Vosk;

namespace DYLive
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

        }

        private Model model; //= new Model("modelcn");//程序根目录下  //   modelsmall-cn-0.22 小模型
        private WasapiLoopbackCapture waveIn;//WasapiLoopbackCapture 系统音频卡输出语音,我们使用外部输入语音
        //new WaveIn() 如果是录制麦克风用WaveIn
        private VoskRecognizer rec;
         
        private void InitRec()
        {
            waveIn = new WasapiLoopbackCapture(); //new WaveIn()、如果是录制麦克风用WaveIn
            waveIn.WaveFormat = new WaveFormat(16000, 16, 1);//44100 采样率16K就可以,太高会导致识别率下降,百度也使用16K
            waveIn.DataAvailable += WaveIn_DataAvailable;
            rec = new VoskRecognizer(model, waveIn.WaveFormat.SampleRate);//加载模型
            rec.SetMaxAlternatives(0);//设置备选项
            rec.SetWords(false);//设置是否显示时间
        }

        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (waveIn != null)
                {
                    waveIn.StartRecording();
                }
                else
                {
                    InitRec();
                }
            }
            catch
            {
            }
        }

        string result = ""; 
        private void WaveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            //int recLen = e.BytesRecorded;
            //byte[] data = new byte[recLen];
            //Array.Copy(e.Buffer, data, recLen);
            if (rec.AcceptWaveform(e.Buffer, e.BytesRecorded))
            {
                result = rec.Result()+ rec.PartialResult();
                if (result.Trim() != "")
                {
                    Debug.Print(result);
                    Dispatcher.Invoke(() => { txt.Text = result; });
                }
            }
            else
            {
                //Console.WriteLine(rec.FinalResult());//不要片段去分析,不然因为语义太少分析不出来
                //Console.WriteLine("---------");
              //  Debug.Print(rec.PartialResult());
                Dispatcher.Invoke(() => { Title = rec.PartialResult();  });
                
            }
        }

        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (waveIn != null)
                {
                    waveIn.StopRecording();
                }
            }
            catch
            {
            }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            App.CloseSlashWindow();
            model= new Model("modelcn");//程序根目录下 new Model("modelsmall-cn-0.22");//程序根目录下
           // model =  new Model("modelsmall-cn-0.22");//程序根目录下
            InitRec();
        }


    }
}

  

posted @ 2024-10-09 15:04  wgscd  阅读(74)  评论(0编辑  收藏  举报