Azure AI 服务之语音识别
笔者在前文《Azure AI 服务之文本翻译》中简单介绍了 Azure 认知服务中的文本翻译 API,通过这些简单的 REST API 调用就可以轻松地进行机器翻译。如果能在程序中简单的集成语音转文本的功能会不会非常赞!本文我们就介绍如何使用必应的语音识别 API(Bing Speech API) 把语音转换成文本:
使用 Bing Speech API 可以轻松地开发出下面的应用:
你点击 "开始录音" 按钮,然后对着麦克风说话,就能够识别输出你说的内容并输出成文本。上面的截图是 Azure 官方提供的 demo,为了演示语音识别 API 的用法,我们写一个丑点的,但是可以输出详细信息的程序:
该程序会以不同的模式识别我们 hardcode 的两段音频数据,然后输出识别的结果。其中上面的文本框会输出大量的中间识别结果,而下面的文本框则输出最终的识别结果。
创建 Azure 服务
要使用 Azure 的翻译服务需要先在 Azure 上创建对应的实例,比如我们需要先创建一个 "Bing Speech API" 服务实例:
说明:对于学习和练习来说,你可以创建免费的 Azure 账号并创建免费版的上述实例,详细信息请参考 Azure 官网。
创建 WPF 程序
Bing Speech API 服务同时提供了 REST API 和客户端类库,因为 REST API 提供的服务会有一些限制,所以我们在演示程序中使用客户端类库。客户端类库分为 x86 和 x64 两个版本,笔者引用的是 x64 的版本 Microsoft.ProjectOxford.SpeechRecognition-x64:
因而需要把工程的 platform target 也设置为 x64。
需要注意的是,Azure 提供的认知服务 API 都是需要认证信息的。具体的方式就是把我们创建的服务的 key 随 API 发送的服务器端进行认证。你可以在创建的服务实例的详情界面获得对应的 key,我们在程序中通过定义的常量来保存它们:
const string SUBSCRIPTIONKEY = "your bing speech API key";
由于 demo 的代码比较长,为了能集中精力介绍 Azure AI 相关的内容,本文中只贴出相关的代码。完整的 demo 代码在这里。
识别模式
语音识别区分不同的识别模式来应对不同的使用场景,如对话模式、听写模式和交互式模式。
- 对话模式(conversation) 在对话模式中,使用者参与的是人与人之间的对话。
- 听写模式(dictation) 在听写模式中,使用者说出一段较长的语音然后等待语音识别的结果。
- 交互式模式(interactive) 在交互模式中, 使用者发出简短的请求, 并期望应用程序执行响应操作。
遗憾的是在我们使用的客户端类库中,相关的模式类型并不是与上面的三种模式一一对应,类库中提供一个叫 SpeechRecognitionMode 的枚举:
public enum SpeechRecognitionMode
{
ShortPhrase = ,
LongDictation =
}
它定义了 ShortPhrase 和 LongDictation 两种识别模式。ShortPhrase 模式最长支持 15 秒的语音。语音数据被分块发送到服务端,服务端会及时的返回部分的识别结果,所以客户端会收到多个部分结果和一个包含多个 n-best 选项的最终结果。LongDictation 模式支持最长两分钟的语音。语音数据被分块发送到服务器,根据服务端分辨出的语句间的停顿,客户端会受到多个部分结果和多个最终结果。
代码中我们要通过它们来告诉语音识别 API 执行识别的类型。比如要识别比 15s 短的语音,可以使用 ShortPhrase 模式构建 CreateDataClient 类型的实例:
// 使用工厂类型的 CreateDataClient 方法创建 DataRecognitionClient 类型的实例。
this.dataClient = SpeechRecognitionServiceFactory.CreateDataClient(
SpeechRecognitionMode.ShortPhrase , // 指定语音识别的模式。
"en-US", // 我们把语音中语言的类型 hardcode 为英语,因为我们的两个 demo 文件都是英语语音。
SUBSCRIPTIONKEY); // Bing Speech API 服务实例的 key。
如果要识别长于 15s 的语音,就需要使用 SpeechRecognitionMode.LongDictation 模式。
分块传输音频
为了能得到近乎实时的识别效果,我们必须把音频数据以适当大小的块连续发送给服务端,下面代码中使用的块大小为 1024:
/// <summary>
/// 向服务端发送语音数据。
/// </summary>
/// <param name="wavFileName">wav 格式文件的名称。</param>
private void SendAudioHelper(string wavFileName)
{
using (FileStream fileStream = new FileStream(wavFileName, FileMode.Open, FileAccess.Read))
{
// Note for wave files, we can just send data from the file right to the server.
// In the case you are not an audio file in wave format, and instead you have just
// raw data (for example audio coming over bluetooth), then before sending up any
// audio data, you must first send up an SpeechAudioFormat descriptor to describe
// the layout and format of your raw audio data via DataRecognitionClient's sendAudioFormat() method.
int bytesRead = ;
// 创建大小为 1024 的 buffer。
byte[] buffer = new byte[]; try
{
do
{
// 把文件数据读取到 buffer 中。
bytesRead = fileStream.Read(buffer, , buffer.Length); // 通过 DataRecognitionClient 类型的实例把语音数据发送到服务端。
this.dataClient.SendAudio(buffer, bytesRead);
}
while (bytesRead > );
}
finally
{
// 告诉服务端语音数据已经传送完了。
this.dataClient.EndAudio();
}
}
}
注意,在数据传送结束后需要通过 EndAudio() 方法显式的告诉服务端数据传送结束。
部分结果与最终结果
部分结果
把数据分块发送给语音识别服务端,我们就能得到近乎实时的识别效果。服务器端通过 OnPartialResponseReceived 事件不断把识别的结果发送到客户端。比如 demo 中演示的 ShortPhrase 模式实例,我们会得到下面的中间结果(在上面的输出框中):
--- Partial result received by OnPartialResponseReceivedHandler() ---
why --- Partial result received by OnPartialResponseReceivedHandler() ---
what's --- Partial result received by OnPartialResponseReceivedHandler() ---
what's the weather --- Partial result received by OnPartialResponseReceivedHandler() ---
what's the weather like
在识别的过程中 OnPartialResponseReceived 事件被触发了 4 次,识别的结果也越来越完整。如果应用程序能够根据这些中间结果不断地向使用者做出反馈,则应用程序就具备了实时性。
最终结果
当使用者结束语音的输入后,demo 中就是调用了 EndAudio() 函数。语音识别服务在完成识别后会触发 OnResponseReceived 事件,我们通过下面的函数把结果输出到 UI 中:
/// <summary>
/// 把服务端返回的语音识别结果输出到 UI。
/// </summary>
/// <param name="e"><see cref="SpeechResponseEventArgs"/>该类型的实例包含语音识别的结果。</param>
private void WriteResponseResult(SpeechResponseEventArgs e)
{
if (e.PhraseResponse.Results.Length == )
{
this.WriteLine("No phrase response is available.");
}
else
{
this.WriteLine("********* Final n-BEST Results *********");
for (int i = ; i < e.PhraseResponse.Results.Length; i++)
{
this.WriteLine(
"[{0}] Confidence={1}, Text=\"{2}\"",
i,
e.PhraseResponse.Results[i].Confidence,
e.PhraseResponse.Results[i].DisplayText);
}
this.WriteLine();
}
}
数据的结果大体如下:
--- OnDataShortPhraseResponseReceivedHandler ---
********* Final n-BEST Results *********
[0] Confidence=High, Text="What's the weather like?"
上面是 ShortPhrase 模式的一个识别结果,它的特点是只有一个最终的返回结果,其中会包含多个识别结果并被称为 n-best。n-best 中的每个结果都包含 Confidence,DisplayText,InverseTextNormalizationResult,LexicalForm,MaskedInverseTextNormalizationResult 等属性,比如我们可以根据 Confidence 属性判断识别的结果是否可靠:
上图是实际的返回结果,因为太简单了,所以 n-best 列表中只有一条(Azure 上的语言材料,发音还是很标准的)。
对于 LongDictation 模式的识别,客户端事件 OnResponseReceived 会被触发多次,并返回分阶段的识别结果,结果中的内容和 ShortPhrase 模式类似。更详细的内容请大家直接看代码吧,很简单的。
支持语言
笔者图省事直接使用了 Azure 文档中提供的英语语音作为 demo 数据,其实 Bing Speech API 对中文支持还是比较全面的,现在支持的所有模式都支持中文。如果你还有其它需求,可以从这里查看详细的语言支持列表。
总结
笔者最早接触语音识别是在 2000 年左右,当时感觉太神奇了。只是识别的效果不太好,并且要求反复的读一个基准文档…
这么多年过去了,其实语言相关的技术发展并不算很快。 AI 的兴起让我们看到了一线希望,在介绍了 Azure AI 的语音识别服务后,让我们接着探索如何通过 AI 让程序理解文本的内容。
参考:
Bing Speech Recognition API in C# for .NET
Azure AI 服务之语音识别的更多相关文章
- Azure AI 服务之文本翻译
当下人工智能可谓是风头正劲,几乎所有的大厂都有相关的技术栈.微软在 AI 领域自然也是投入了重注,并且以 Azure 认知服务的方式投入了市场: 也就是说作为开发者我们不需要学习太多 AI 的理论知识 ...
- Azure 认知服务概述
背景知识 近些年随着机器学习.深度学习等技术的不断发展,人工智能在越来越多的场景得到了应用,如人脸识别.图像识别.语音识别.语音生成.自然语言处理.决策分析等等,让机器拥有了听.说.看和思考的能力,很 ...
- Azure认知服务之表格识别器
认知服务 Azure 认知服务的目标是帮助开发人员创建可以看.听.说.理解甚至开始推理的应用程序. Azure 认知服务中的服务目录可分为五大主要支柱类别:视觉.语音.语言.Web 搜索和决策.开发人 ...
- 技术博客:Azure 认知服务
Azure 认知服务 1.概述 微软认知服务(Microsoft Cognitive Services)集合了多种智能API以及知识API,使每个开发人员无需具备机器学习的专业知识就能接触到 AI ...
- Azure Backup (3) 使用Azure备份服务,备份Azure虚拟机
<Windows Azure Platform 系列文章目录> 本将介绍,如何使用Azure备份服务,备份Azure虚拟机. 我们先预先创建2台Windows VM (命名为LeiVM00 ...
- Windows Azure Storage (18) 使用HTML5 Portal的Azure CDN服务
<Windows Azure Platform 系列文章目录> Update:2015-04-15 如果读者使用的是国内由世纪互联运维的Azure China服务,请参考笔者的文档:Azu ...
- Azure Backup (2) Azure备份服务
<Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 本文介绍的Azure管理界面是Classic Model,网址:h ...
- Azure 媒体服务可将优质内容传输至 Apple TV
作为内容提供商,如果想要将优质内容传输到Apple TV,需要使用Apple FairPlay Streaming (FPS)技术. 但是这个技术的构建比较繁琐,基于此,Azure提供了FairPla ...
- 玩转Windows Azure存储服务——网盘
存储服务是除了计算服务之外最重要的云服务之一.说到云存储,大家可以想到很多产品,例如:AWS S3,Google Drive,百度云盘...而在Windows Azure中,存储服务却是在默默无闻的工 ...
随机推荐
- 前端 jQuery
一.jQuery是什么? <1>jQuery由美国人John Resig创建,至今已吸引了来自世界各地众多JavaScript高手加入其team. <2>jQuery是继pro ...
- Windows10下的docker安装与入门 (三) 创建自己的docker镜像并且在容器中运行它
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
一.前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦 ...
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
- 设计APP时我们该怎么做
不得不承认,手机APP已经渗透到我们的生活中,根据数据统计,人们每天平均有3.9个小时是花费在手机APP的使用上的,可以预见,手机APP正在改变我们的生活.手机APP受到人们的欢迎,很多商家也看到了其 ...
- kmp——cogs 1570 乌力波
1570. [POJ3461]乌力波 ★☆ 输入文件:oulipo.in 输出文件:oulipo.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] 法国作家乔治 ...
- [AHOI 2016初中组]迷宫
Description 小雪和小可可被困在了一个无限大的迷宫中. 已经知道这个迷宫有 N 堵环状的墙,如果把整个迷宫看作是一个二维平面,那么每一堵墙都是平面上一个圆.任意两个圆不相交,不重合,也不会相 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- hdu 1133 Buy the Ticket(Catalan)
Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Linux input子系统 io控制字段【转】
转自:http://www.cnblogs.com/leaven/archive/2011/02/12/1952793.html http://blog.csdn.net/guoshaobei/arc ...