c# 开发语音识别程序

C#开发语音识别程序

概述

语音识别是当前比较热门的领域之一,它可以应用在语音助手、音频转写等领域。本文主要介绍如何使用C#开发语音识别程序。

准备工作

在使用C#开发语音识别程序之前,我们需要安装语音识别的开发库。我们可以使用Microsoft Speech Platform SDK 11来实现对语音的识别,这个库在Windows 7以及之后的版本中默认已经安装了。如果没有安装,则需要从Microsoft官网上下载并安装。

步骤

1.添加引用

打开Visual Studio,新建一个控制台应用程序,并添加对Microsoft.Speech.dll的引用。方法是右键“应用程序名称” -> “添加” -> “引用” -> “浏览”,找到Microsoft.Speech.dll文件,添加即可。

2.配置识别引擎

在程序中添加如下代码,以配置识别引擎

using Microsoft.Speech.Recognition;
using Microsoft.Speech.Recognition.SrgsGrammar;
using System.Collections.Generic;

public class SpeechRecognition
{
    private SpeechRecognitionEngine _recognizer;
    public SpeechRecognition()
    {
        var options = new SpeechRecognitionEngineOptions
        {
            SynchronousGrammarCompilation = true
        };
        _recognizer = new SpeechRecognitionEngine(options);
        AddCommands();
    }

    public void AddCommands()
    {
        var command = new GrammarBuilder(new Choices(new string[] { "hello", "how are you" }));
        var grammar = new Grammar(command);
        _recognizer.LoadGrammar(grammar);
        _recognizer.SpeechRecognized += Recognizer_SpeechRecognized;
    }

    public void Start()
    {
        _recognizer.SetInputToDefaultAudioDevice();
        _recognizer.RecognizeAsync(RecognizeMode.Multiple);
        Console.ReadLine();
    }

    private void Recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        Console.WriteLine("Recognized: " + e.Result.Text.ToString());
    }
}

以上代码中,我们创建了一个名为SpeechRecognition的类,并在构造函数中初始化了一个名为_recognizer的变量对识别引擎进行配置,通过AddCommands方法添加了几个命令,然后通过Start方法启动识别。当用户说出识别的命令时,会在控制台输出“Recognized:”和识别到的命令文本。

3.运行程序

在程序的Main方法中添加如下代码:

var speak = new SpeechRecognition();
speak.Start();

运行程序后,试着对着麦克风说“Hello”或者“How are you”,可以看到程序能够成功识别出语音并输出识别的结果。

示例说明

示例一:简单的计算器

我们可以通过识别语音命令来实现简单的计算器功能。例如,如果用户说:“What is 2 plus 2”,程序可以识别出命令,并输出结果:“4”。

public void AddCommands()
{
    var builder = new SrgsDocument();
    var items = new List<string> { "plus", "minus", "times", "divided by" };
    var operations = new GrammarBuilder(new Choices(items));
    var digits = new SrgsRule("digit", new SrgsRule[] {
        new SrgsAny("1", "2", "3", "4", "5", "6", "7", "8", "9", "0"),
        new SrgsOneOf(new string[]{ "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}),
        new SrgsOneOf(new string[]{ "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"})
    });
    var digitList = new SrgsZeroOrMore(digits);
    var a = new SrgsIdentifier("a", digitList);
    var b = new SrgsIdentifier("b", digitList);

    var opPlus = new SrgsRule("opPlus", new SrgsItem[]{operations, new SrgsSemanticInterpretationTag("out=\"+\";")});
    var opMinus = new SrgsRule("opMinus", new SrgsItem[]{operations, new SrgsSemanticInterpretationTag("out=\"-\";")});
    var opTimes = new SrgsRule("opTimes", new SrgsItem[]{operations, new SrgsSemanticInterpretationTag("out=\"*\";")});
    var opDividedBy = new SrgsRule("opDividedBy", new SrgsItem[]{operations, new SrgsSemanticInterpretationTag("out=\"/\";")});

    builder.Rules.Add(digits);
    builder.Rules.Add(opPlus);
    builder.Rules.Add(opMinus);
    builder.Rules.Add(opTimes);
    builder.Rules.Add(opDividedBy);

    var main = new SrgsRule(
        "main",
        new SrgsItem[]
        {
            new SrgsSemanticInterpretationTag("out=\"result = \";"),
            new SrgsOneOf(new SrgsItem[] { a, b }),
            new SrgsSemanticInterpretationTag("out+=\" \" + a.value + \" \" + out + \" \" + b.value + \";\";")
        }
    );
    builder.Rules.Add(main);

    builder.Root = main;
    _recognizer.LoadGrammar(new Grammar(builder));
}

以上代码中,我们通过一个GrammarBuilder对象来定义识别语音命令的语法规则。其中包括四个操作符,可以和数字或者纯数字组合成算式。使用SemantcInterpretationTag对命令进行解析并计算结果。

示例二:实时语音翻译

我们还可以使用语音识别来实现实时语音翻译。例如,当用户说“Hello,我是中国人”,程序可以将中文翻译成英文,并输出结果:“Hello, I am Chinese”。

public void AddCommands()
{
     var requestURI = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en";
     var request = (HttpWebRequest)WebRequest.Create(requestURI);
     request.Headers.Add("Ocp-Apim-Subscription-Key", "<YOUR_KEY_HERE>");

     var command = new GrammarBuilder();
     command.AppendDictation();
     var grammar = new Grammar(command);

     _recognizer.LoadGrammar(grammar);
     _recognizer.SpeechRecognized += (s, e) => {
        if (e.Result.Text != null)
        {
            var query = e.Result.Text;
            var encodeQuery = HttpUtility.UrlEncode(query);
            var postData = "[{\"Text\": \"" + encodeQuery + "\"}]";
            request.ContentType = "application/json";
            request.Method = "POST";
            var data = Encoding.UTF8.GetBytes(postData);
            using (var stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }
            var response = (HttpWebResponse)request.GetResponse();
            var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
            var translatedText = Regex.Match(responseString, "\"text\": ?\"([^\"]+)\"", RegexOptions.IgnoreCase).Groups[1].Value;
            Console.WriteLine(translatedText);
        }
     };
}

在以上代码中,我们首先定义一个requestURI的变量包含翻译的API地址,然后构造一个命令语法规则,当语音被识别后就发送翻译的请求,然后将得到的翻译结果输出到控制台。

结论

通过上述步骤,我们学习了如何使用C#来开发语音识别程序。在实际应用中,我们可以根据不同的需求来定义语法规则和实现对命令的解析。同时,我们还看到了如何使用语音识别来实现实时语音翻译、计算器等功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 开发语音识别程序 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • c# 使用Entity Framework操作Access数据库的示例

    下面是详细讲解“c#使用EntityFramework操作Access数据库的示例”的完整攻略: 一、概述 在使用C#编程时,我们常常需要对数据库进行操作。其中较为常见的数据库有MySQL、SQL Server等。而今天我们要介绍的是如何使用EntityFramework操作Access数据库。 EntityFramework是.NET Framework中…

    C# 2023年5月15日
    00
  • C#Web应用程序入门经典学习笔记之一

    C#Web应用程序入门经典学习笔记之一学习攻略 C#Web应用程序入门经典学习笔记之一是一本入门级别的C#网络开发学习笔记,主要介绍了通过ASP.NET Core Web应用程序搭建Web应用程序的基础知识和应用。本学习攻略将介绍如何学习这本书并深入理解其内容。 一、先了解一下ASP.NET Core Web应用程序 在开始学习这本书之前,我们需要先简单了解…

    C# 2023年6月1日
    00
  • C#实现全局快捷键功能

    C#语言可以使用Windows API来实现全局快捷键功能。实现的过程包括以下几步: 1.使用API函数注册快捷键。可以使用RegisterHotKey函数来注册快捷键,并指定要监听的窗口句柄、快捷键的唯一标识符以及快捷键的按键组合。此过程应该在应用程序启动时完成,可以在Form的Load事件中完成注册。 2.重写窗口过程函数(WindowProc)以响应快…

    C# 2023年6月7日
    00
  • abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级(六十)

    Abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)…

    C# 2023年4月18日
    00
  • C# 用什么方法将BitConverter.ToString产生字符串再转换回去

    要将BitConverter.ToString产生的字符串再转换回为二进制数据,可以使用以下两种方法: 1. 使用BitConverter.GetBytes和Convert.FromHexString 可以使用BitConverter.GetBytes将一个十六进制字符串转换为等效的字节数组,然后使用Convert.FromHexString将该数组转换为二…

    C# 2023年6月7日
    00
  • C#枚举类型和结构体详解

    C#枚举类型和结构体详解 枚举类型 C#中的枚举类型是一种特殊的数据类型,用于定义常量。它可以帮助我们在程序中使用更加直观的符号来代表特定的整数值。枚举类型的定义语法如下: enum 枚举名称 { 常量1, 常量2, … } 其中,枚举名称是标识枚举类型的名称,常量1、常量2等是枚举类型中定义的常量,可以指定特定的值,也可以不指定,如果不指定,则默认从0…

    C# 2023年6月8日
    00
  • C#去除字符串中的反斜杠实例(推荐)

    C#去除字符串中的反斜杠实例(推荐) 问题描述 在C#中,有时候需要将一个字符串中的反斜杠去掉,以便能够正确地使用字符串,比如在Json字符串中,需要将反斜杠去掉。本教程将介绍如何在C#中去除字符串中的反斜杠。 实现方式 方法一:使用Replace方法 可以使用String类的Replace方法,将反斜杠替换为空字符串即可。示例如下: string str …

    C# 2023年6月8日
    00
  • C#异步编程的三种模式

    当我们使用 C# 开发异步程序时,常会用到异步编程模式(Asynchronous Programming Pattern, APM),任务并行库(Task Parallel Library, TPL)和异步方法(Asynchronous methods)。下面将对这三种 C# 异步编程模式进行详细讲解。 异步编程模式 (APM) 异步编程模式是 C# 中最古…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部