2012-12-21 16:26:08 yylsheng 阅读数 41280
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波
Google提供了一个在线语音识别的API接口,通过该API可以进行中文、英文等语言的识别。
 API地址:http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN&maxresults=1
参数解释

 xjerr:错误标准

 client: 客户端类型

 lang:待识别语言类型,en-US是英文,中文为zh-CN

 maxresults最大返回识别结果数量

识别基本流程:
从音频输入设备获取原始音频并编码或直接调用音频文件。
将音频POST至接口地址。
分析处理返回的JSON并得出结果。
请求接口
地址:如前
请求方式:http post
请求数据:编码后的音频数据
音频编码格式:wavspeexflac
音频采样频率:8000Hz11025Hz16000Hz22050Hz24000Hz32000Hz44100Hz48000Hz
主要优点
语音识别引擎庞大,识别精度很高,适用于文本语音识别。提供多国语言的语音识别。
任何平台都可以进行访问,容易使用。
主要缺点
API未开放,未能获知具体开发细节。
识别引擎位于服务器端,识别的速度和网络质量有关,识别速度较慢。
待识别音频的格式、大小、时长的限制。
 
 

MicrosoftSpeech SDK

Microsoft Speech SDK是微软公司提供在Windows平台上开发语音识别和语音合成应用程序的开发包,简称为SAPI,内含SRSpeech Recognition)和SSSpeechsynthesis)引擎,因此可以很方便地在自己的应用程序中添加这些功能。
该语音引擎支持多种语音的识别和朗读,包括英文、日文、中文等。微软推出的应用编程接口API,虽然现在不是业界标准,但是应用比较广泛。
识别基本流程:
从音频输入设备获取原始音频并编码或直接调用音频文件。
设定语音引擎和识别上下文等内容,配置本地访问属性。
分析处理得到的文本结果
请求接口
请求方式:本地访问
请求数据:编码后的音频数据
音频编码格式:wav
音频采样频率:8000Hz11025Hz16000Hz22050Hz24000Hz32000Hz44100Hz48000Hz
主要优点
基于COM组件,便于与DirectShow中的组件整合。
语音识别引擎位于本地,便于访问,识别速度较快。
待识别音频的大小、时长无限制。
主要缺点
缺少其他平台的支持,仅支持windows平台。
语音识别引擎不够庞大,识别精准度较低。
仅提供中日英三种语言的语音识别功能。
 
 

 iFLY Mobile Speech Platform 2.0

科大讯飞为开发者提供了语音应用开发平台,提供语音合成、语音听写、语音识别、声纹识别等服务,为语音应用开发爱好者提供方便易用的开发接口,使得用户能够基于该开发接口进行多种语音应用开发。
其主要功能有:
实现基于HTTP协议的语音应用服务器,支持语音合成、语音听写、语音识别、声纹识别等服务
提供基于移动平台和PC上的语音客户端子系统,内部集成音频处理和音频编解码模块,提供关于语音合成、语音听写、语音识别和声纹识别完善的API
只需要在http://open.voicecloud.cn上申请成为开发者,便可以下载相关的SDK和开发文档。
主要优点
支持平台丰富,各个平台上都有相应的详细SDK文档
语音识别引擎较庞大,对中文的识别精度很高。
具端点检测功能,便于划分识别文本的句子。
主要缺点
识别引擎位于服务器端,须远程访问,识别速度较慢。
对语言支持不如Google,目前仅支持中文听写。
需要使用1028端口,在某些地方会有使用限制。
当软件用户达到百万次后,需要开始收费。
 
 
测试流程:
从麦克风输入语音并编码或直接调用音频文件,调用的音频文件主要是从电影或是新闻节目中提取其音频,前者主要体现识别语音口音的多样性,后者是体现识别语音口音的正规性,从麦克风输入体现对针对某个人特定的口音。主要测试音频文件格式为wavflacflac需要由相同采样率的wav转换而来)测试采样率有8KHz16KHz24KHz32KHz44.1KHz
分析各个引擎的识别准确度和花费时间时,选取了5段时长为25S、平均长度为150个中文字符的音频作为其测试音频,记录识别正确的文字和花费时间,准确度以识别正确的文字/文本总字数,同时包含识别出的单独的字、词,花费时间对于非本地引擎需要考虑音频传送和结果返回的时间。
分析各个引擎中语速对识别准确度的影响,针对同一文本,测试不同语速(分为慢速、中速、快速)的音频,且时间均控制在25S,仅选取了24KHz44.1KHz音频进行测试,因为由测试准确度的测试中,已经得出在24KHz44.1KHz情况下,识别精确度较高。
分别用googleMicrosoft和科大讯飞语音识别引擎对测试音频文件进行测试。其中使用google和科大讯飞引擎需通过访问其相关服务器,而Microsoft的语音识别引擎则是从本地进行访问。
对所得结果进行数据分析,列出数据表格,分析各自引擎的优缺点。
 
测试结果:
语速对识别时间的影响
                        慢速                 中速                   快速
Google              8s                   8.94s               10.125s
SAPI                6.06s               6.63s                 5.375s
科大讯飞          34.6s               35s                     23.6s
 
语速对识别精度的影响
                        慢速                 中速                   快速
Google           78.93%           77.52%               11.58%
SAPI               28.7%             42.79%               6.81%
科大讯飞         78.2%             80.48%              15.53%
 
结果评价:
1.Google
Google语音识别引擎可以识别wav格式音频,但是测试所用wav均为非原始wav故识别精度很低,若将其转换为flac后则识别精度增加。对于flac格式中文音频,快速语音准确率达到11.58%,中速语音准确率达到72.52%,平均花费时间8.94S。慢速语音准确率达到78.93%,平均花费时间为8S。对于英文音频,快速语音准确率达到40.22%,中速语音准确率达到89.2%,慢速语音准确率达到80.58%,平均花费时间各为9.2s8.5s9.9s
不同的音频采样率对识别效果和花费时间有影响,识别效果主要体现在音频中间部分名词和音频末端1s的识别结果,于中文而言新闻类平均准确率为72.37%,电影类平均准确率为44.36%。于英文而言,电影类平均准确率为35.3%。平均花费时间采样率越大,识别时间越短,如24KHz44.1KHz的同样内容音频,后者时间少1S左右。
对于google语音识别引擎,由于语速过快会导致识别不准确,会出现多个音识别为一个字的现象,故所用时间较短,但是准确度较差。而语速过慢时,虽然语音的特征更加明晰会使得准确率上升,但是字与字之间的联系不密切,会出现本该是一个词却识别为同音的两个字,导致准确率下降,故其平均准确率和中速识别率相当,另一方面是所需识别的字较少,故识别时间相对中速短。
对于视频流提取的音频和麦克风输入人声的识别,麦克风输入人声的平均准确度高于视频流中的的平均准确度,原因是视频流中的人声会带有各种口音一般带有背景噪音,而麦克风输入人声是单一的稳定的,背景噪音较小。准确度顺序大致为:新闻类>特定人>电影类,但不能忽略电影中也存在普通话标准发音。对于时间长度为20s以上的快速语音,测试期间无法识别,一直未能返回正确结果。不知原因。对于特定人输入的音频,音频头尾都可正确识别。若是输入视频流中音频,头尾1S的内容都不能很好的识别,容易出错。
Google语音识别引擎数据库丰富,可以识别大部分日常用语,还包括当下流行词汇,人名,地名等。对于新闻类词汇判别比较准,而特定专业类名词通常以同音字代替。
对于google识别的时间包括网络发送音频数据包时间,识别花费时间,返回结果时间。由于引擎位于服务器,需要通过网络访问,故网络质量在识别时间上占据极重要的位置,识别过程中经常会发生访问延迟、访问超时和请求无效等错误,故应该在网络良好的条件下使用google引擎,这也是非本地语音引擎库的缺点。同时音频文件超过1M时,也无法正确返回结果,估计是服务器的文件限制。
若考虑语音的精准度,则倾向于选择google语音识别引擎。
 
 
2.SAPI
微软的SAPI语音识别引擎可以识别任意采样率的wav格式音频,当采样率比较低时如仅为8KHz,音频内容采样过程中会缺失,故识别不准确,理论上来说,采样率越高,识别精度越好。但是采样率超过一定值后,改进并不明显。经过测试得出以44.1KHz采样率识别精度较好,且花费时间较短。快速语音准确率为6.81%,中速语音准确率达到42.79%,平均花费时间6.63S。慢速语音准确率达到28.7%,平均花费时间为6.06S。识别效果主要体现在音频中间部分名词和音频末端1s的识别结果,新闻类平均准确率51.48%,电影类平均准确率为41.43%,特定人平均准确率为53.06%
对于特定人输入的音频,音频头尾都可正确识别。若是输入视频流中音频,头尾1S的内容容易漏识别,且漏识别内容并非不显示,而是以其他文字代替诸如“他、淡”等字,影响了识别结果的理解。
微软语音识别引擎数据库位于本地,访问方便、快捷,无需考虑网络延迟、音频文件过大无法传送等问题。其缺点便是本地数据库的大小限制了其识别精度,需要通过长时间的训练才有可能达到比较高的精准度,而相比之下google引擎数据库可以收集网络上的所有资料,训练文本并不缺乏,容易达到很高的精准度。SAPI可以识别大部分日常用语和常用的新闻词汇,但是对当下流行词汇,人名,地名识别精度很低,对特定专业类名词通常也以同音字代替。
 
 
3.科大讯飞
科大讯飞语音识别引擎仅可识别wav格式音频,为了达到理想的效果,有诸如条件限制,如音频须为采样率16KHz、每采样一点16bit、单声道,且音频长度小于90s。由于具有端点检测功能,每句话的长度不宜过长。快速语音准确率达到17.63%,平均花费时间29.2S。中速语音准确率达到80.48%,平均花费时间35S。慢速语音准确率达到78.2%,平均花费时间为34.6S。平均花费时间比另外两个引擎多了许多,主要原因是其端点检测功能,故一次能识别的语句长度有限制,需要分段识别,因此加长了识别的时间。
端点检测的好处是方便音频中句子的分段,易于对对识别结果的理解。
其引擎库也是位于服务器,需要通过网络访问,识别的时间包括网络发送音频数据包时间,识别花费时间,返回结果时间。网络质量在识别时间上也占据极重要的位置,且其需要开启80/1028端口后才能有效使用该引擎。待识别的音频需要质量清晰,一般对于网上流媒体而言,声音质量不高,识别较困难。
 
以上的SAPI和科大讯飞的测试DEMO都是用他们SDK里自带的。GOOGLE的C#代码可参照http://www.cnblogs.com/eboard/archive/2012/02/29/speech-api.html
另外介绍关于google语音识别的内容还可以参照http://blog.csdn.net/dlangu0393/article/details/7214728本文中有转载其小部分内容。
 
 
由于测试样本数量并不算多,因此以上测试仅供参考。
                                                                    
 
 
 
 
 
 
 

 

2019-08-05 14:56:39 MysteryLi 阅读数 223
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波

最近因项目需求,接了微软认知服务的语音识别接口(以下简称语音识别),期间也踩了很多坑最后成功接通。众所周知,国内有很多语音识别的SDK,但是这些SDK都是偏向于中文语音识别,对于英文的识别率很低,所以经过多家SDK的对比,我选择了微软的语音识别,微软的语音识别对英文的识别率很高。下面就来说下如何来接语音识别。

首先从微软认知服务官方的GitHub上下载SDK包,然后将下载的Speech SDK .unitypackage文件导入Unity工程,然后在场景中新建Text,Button,如下图所示

然后在项目中添加代码,命名为MicroSoftASRDemo,编辑脚本,用一下代码替换,其中的YourSubscriptionKey使用Speech Services订阅密钥找到并替换该字符串。YourServiceRegion为与您订阅密钥相关联的区域,免费试用版的为westus。(订阅密钥获取方式点击这里)然后将脚本保存,然后挂载到场景中的一个gameobject上。

using UnityEngine;
using UnityEngine.UI;
using Microsoft.CognitiveServices.Speech;
using System;
using UnityEngine.SceneManagement;
#if PLATFORM_ANDROID
using UnityEngine.Android;
#endif

public class MicroSoftASRDemo : MonoBehaviour
{
    // Hook up the two properties below with a Text and Button object in your UI.
    public Text outputText;
    public Button startRecoButton;
    public Button returnMainBtn;

    private object threadLocker = new object();
    private bool waitingForReco;
    private string message;

    private bool micPermissionGranted = false;

    public int Rec = 0;//0:未开始录音 1:录音中 2:结束录音


#if PLATFORM_ANDROID
    // Required to manifest microphone permission, cf.
    // https://docs.unity3d.com/Manual/android-manifest.html
    private Microphone mic;
#endif

    public async void ButtonClick()
    {
        // Creates an instance of a speech config with specified subscription key and service region.
        // Replace with your own subscription key and service region (e.g., "westus").
        var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");

        // Make sure to dispose the recognizer after use!
        using (var recognizer = new SpeechRecognizer(config))
        {
            lock (threadLocker)
            {
                waitingForReco = true;
                Rec = 1;
            }

            // Starts speech recognition, and returns after a single utterance is recognized. The end of a
            // single utterance is determined by listening for silence at the end or until a maximum of 15
            // seconds of audio is processed.  The task returns the recognition text as result.
            // Note: Since RecognizeOnceAsync() returns only a single utterance, it is suitable only for single
            // shot recognition like command or query.
            // For long-running multi-utterance recognition, use StartContinuousRecognitionAsync() instead.
            var result = await recognizer.RecognizeOnceAsync().ConfigureAwait(false);
            //print(result + "        . . . . . . . . . . . ");

            // Checks result.
            string newMessage = string.Empty;
            if (result.Reason == ResultReason.RecognizedSpeech)
            {
                newMessage = result.Text;
                
            }
            else if (result.Reason == ResultReason.NoMatch)
            {
                newMessage = "NOMATCH: Speech could not be recognized.";
            }
            else if (result.Reason == ResultReason.Canceled)
            {
                var cancellation = CancellationDetails.FromResult(result);

                newMessage = $"CANCELED: Reason={cancellation.Reason} ErrorDetails={cancellation.ErrorDetails}";
            }

            lock (threadLocker)
            {
                message = newMessage;
                SpeechInfo.SpeachText = message;
                waitingForReco = false;
                Rec = 2;
            }
        }
    }

    void Start()
    {
        if (outputText == null)
        {
            Debug.LogError("outputText property is null! Assign a UI Text element to it.");
        }
        else if (startRecoButton == null)
        {
            message = "startRecoButton property is null! Assign a UI Button to it.";
            Debug.LogError(message);
        }
        else
        {
            // Continue with normal initialization, Text and Button objects are present.

#if PLATFORM_ANDROID
            // Request to use the microphone, cf.
            // https://docs.unity3d.com/Manual/android-RequestingPermissions.html
            message = "Waiting for mic permission";
            if (!Permission.HasUserAuthorizedPermission(Permission.Microphone))
            {
                Permission.RequestUserPermission(Permission.Microphone);
            }
#else
            micPermissionGranted = true;
            //message = "Click button to recognize speech";
#endif
            startRecoButton.onClick.AddListener(ButtonClick);
            returnMainBtn.onClick.AddListener(MainScene);
        }
    }

    private void MainScene()
    {
        SceneManager.LoadScene("Menu");
    }

    void Update()
    {
#if PLATFORM_ANDROID
        if (!micPermissionGranted && Permission.HasUserAuthorizedPermission(Permission.Microphone))
        {
            micPermissionGranted = true;
            message = "Click button to recognize speech";
        }
#endif

        lock (threadLocker)
        {
            if (startRecoButton != null)
            {
                startRecoButton.interactable = !waitingForReco && micPermissionGranted;
            }
            if (outputText != null)
            {
                outputText.text = message;                
                Rec = 0;
            }
        }
    }

}

在编辑器中运行,点击button,然后说出英文短语或者句子,识别完成后,你所说的话将会被转录为文本,并将该文本显示到窗口中,至此语音识别已成功接入。

下一篇我将会介绍微软认知服务语音合成的接入方式

2019-05-16 14:37:08 qq_43019717 阅读数 1131
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波

大家好,上期小君给大家分享了语速对语音引擎识别的影响,相信大家对语速对识别的影响有了初步的认识。经过一个多月的调研,小君本期给各位带来了一次新的评测,即科大讯飞,百度,思必驰,云知声四家语音引擎在降噪性能上的差异。
本次评测主要是对比每家语音识别引擎降噪性能,采取将语音文件直接送接口的方式进行测试,接口同样是基于各家公司给广大语音开发爱好者提供的开源开发接口。
测试语音信息详情如下:
• 音频编码格式:wav
• 音频采样率:16000Hz
• 文本字数:每条平均8字左右,共计1586字。
• 音频分类:安静环境下音频、SNR=15环境下音频、SNR=5环境下音频(SNR为信噪比)
• 音频领域:手机基本操作,领域涉及有常用应用,导航,音乐,天气,设置,日期6个领域,共计200条
• 音频信息:北方自然语速,男女比例1:1,共计20人
• 噪音合成:采取噪音合成的方式对纯净音频进行加噪
• 噪音:中文歌曲

展示一下文本样例:

  1. 导航领域:请帮我绕开从王府井到西单的拥堵地段
  2. 设置领域:设置每周一早上7点的闹钟
  3. 手机基本操作领域:发短信给小明

由于本次测试采取的是直接将数据送入识别接口的方式进行,没有类似于终端产品对整个环境的收音模块,所以噪音不能直接以播放的方式进行增加,但咱们还得测试不同信噪比下的数据呢,难不倒小君的,小君有噪音合成工具!可以将选定的噪音数据与语音数据进行,且SNR可设定,问题解决,而且还能更好的保证噪音数据一致性!
语音识别引擎在噪音消除方面的性能好坏会基于产品的定位,对不同的噪音也会有不同的处理方式,本次小君选取噪音集为常用噪音集,中文歌曲;由于本次测试专注于降噪算法的对比,为了减少变量、保证数据一致性,选取的语音数据为消音室录制的语料。

测试数据的信息大家了解的差不多了,那让我们来看一下对比结果,来分析各引擎的优缺点吧。
首先我们通过识别引擎在不同噪音环境下进行识别率的对比,通过下图数据可以看出科大讯飞和思必驰在三种环境下识别率差异不大,识别率从安静环境到SNR=5环境下降了1%左右,表现较好。百度在安静条件的语音识别率达到了97.51%,SNR=15时识别率为96.35%,SNR=5时降到了81.26%,可以看出随着噪音声压级的增大,百度识别引擎的降噪算法性能出现了大幅度的下降;云之声则时安静条件到SNR=15时下降幅度较大,从94.41%下降到了89.78%。SNR=15到SNR=5时的识别率下降幅度较小。

然后再对四款语音识别引擎间进行识别率的对比,可以看出安静条件下,云之声较其他三款产品的识别率最低,识别率为94.41%;SNR=15时,科大讯飞和思必驰表现较好,云之声相对较差,识别率为89.78%;随着背景噪音声压级的增大,在SNR=5时,百度识别率下降幅度较大,下降到81.26%,云之声同样较差,识别率为87.33%。测试详细数据如下:
在这里插入图片描述
在这里插入图片描述
(备注:以上测评结果仅基于本次验证集)

综合以上两方面的对比,基于本次测试数据的测试结果可以看出,科大讯飞和思必驰在降噪处理方面综合表现较好,百度和云之声在该方面则表现较差。
另外小君在本次测试过程中发现一个有趣的现象,思必驰识别引擎在安静条件下要比SNR=15时的识别率要低0.19%。为了搞清楚这0.19%的差距在哪,小君将两组测试结果分别对比,发现差异并不大,仅有6条语音的识别结果存在差异,主要体现在安静条件下的替换错误增加,而SNR=15条件下插入错误增加,下面列举一下部分识别结果供大家参考。
在这里插入图片描述

本次小君仅从中文音乐噪音的消除性能方面对四款公开的识别引擎进行了对比,不作为评价四款识别引擎降噪性能好坏的评价标准。因为仅仅是音乐噪音又区分了不同的语言、高中低频等,如果您想了解识别引擎的整体降噪性能,需要多个维度进行测评,对语音识别引擎降噪算法的测试感兴趣的话,可以随时联系小君,小君表示热烈欢迎。

2017-03-07 02:54:55 ItJavawfc 阅读数 4304
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波

最近帮别人的车载系统整了一个小项目,分享一下最原始的Demo!

**说明:**XF的语音服务很多,类似提供语音服务的国内巨头还有百度!

客户需求:实现简单的语音控制指令【听音乐、暂停、下一首、上一曲、声音大一点、声音小一点】,程序入口:打开某某应用,嵌入到项目中实现TTS服务,人机交互。

如下简单的实现了命令控制,使用XF的离线命令词识别+TTS服务。

第一步:编写离线命令词文件,遵守它的语法规则
BNF文件如下:

#BNF+IAT 1.0 UTF-8;
!grammar call;
!slot <usOprate>;
!slot <usAccess>;
!slot <FuncTemp>;
!slot <FuncModel>;
!slot <ModelType>;
!slot <acModel>;
!start <acStart>;
<acStart>:<Model>;
<Model>: <ModelType>;
<ModelType>:暂停!id(101)|上一曲!id(102)|下一曲!id(103)|关机!id(104)|大点声!id(105)|大声!id(106)|小点声!id(107)|小声!id(108)
|后退!id(109)|天气!id(110)|天气!id(111)|唱首歌!id(112)|唱歌!id(113)|讲故事!id(114)|打开地图!id(115)
|打电话!id(116)|打开相册!id(117)|音乐!id(118)|拍照!id(119)|QQ!id(120)|扣扣!id(121)|口口!id(122)|叩叩!id(123)|微信!id(124);

配上语法详解:
这里写图片描述

第二步:接口调用
封装XF的离线命令词识别和和TTS服务,基于接口的实现而已。当用户说的话是命令词的时候,就直接触发命令执行相关业务逻辑。系统始终监听声音。
采用多态思想,让抽象方法实现接口,使得具体运用时候可以不实现接口中所有的方法,而且在抽象类中实现想实现的方法,需要时候,直接用抽象类的实例直接调用就OK。
部分代码如下:

public interface IVoiceCommandListener {
    // 打电话
    void onCallSomebody();
    // 打开的相册
    void onViewPhoto();
    // 我想听歌
    void onPlayMusic();
    // 查询天气命令
    void onViewQQ();
    // 拍照、照相
    public void onTakePhoto();
    // 微信
    public void onViewWX();
}
public abstract class VoiceCmdListener implements IVoiceCommandListener {

    private Context mContext;

    public VoiceCmdListener(Context context) {
        mContext = context;

    }
    @Override
    public void onCallSomebody() {
        String pkg = "com.example.news.movenews";
        String cls = "com.wxzh.news.MainActivity";
        ComponentName componet = new ComponentName(pkg, cls);
        Intent intent = new Intent();
        intent.setComponent(componet);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);

    }

实例化:

voiceCommandListener = new VoiceCmdListener(UnderstanderService.this) {
 };

直接调用抽象类中实现的方法:
voiceCommandListener.onPlayMusic();

这里写图片描述

此项目主要为最原始的测试的离线命令词+TTS服务的Demo,有非常大的借鉴的意义,项目已经运用到市场中去了。读者拿了之后直接更换资源即可测试,更改拓展项目。

项目下载地址
可参考前几天的demo,机器人语音系统的文章:
机器人语音系统项目

2019-04-03 18:53:42 qq_43019717 阅读数 2156
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波

大家好,时间过得真快,转眼进入到四月份了,语音测评君又给大家带来了新一期语音相关的测评报告。结合现在语音算法公司越来越多的情况,本次小君针对当前市场份额较大的几家算法公司,分别测试了语速对语音引擎识别结果的影响。这几家公司分别是科大讯飞,百度,思必驰信息科技和云知声信息科技有限公司。每个公司都有自己的开发平台,给广大语音开发爱好者提供的开源的开发接口,给大家提供了相关的SDK和开发文档。
本次测评主要是对比每家语音识别引擎对快中慢语速的处理,测试语音信息详情如下:
 音频编码格式:wav
 音频采样率:16000Hz
 文本字数:每条平均60字左右,共计615字。
 音频分类:分为快语速、普通语速、慢语速,共计30条音频,每类10条
 音频领域:歌曲、闲聊
正常情况下,不同人说话的语速是不一样的,有人说话快,有人说话慢。所以小君这次测试的出发点是站在人正常说话的角度考虑的,并没有仅仅是为了测试算法而去设置极限值。

展示一下文本样例:

  1. 这是一首唱给母亲听的歌曲,他曾经在综艺节目笑着谈起母亲逝世前的点滴,十分感人。毛不易的另外一首歌曲《消愁》的词沉浸着对生活的深切感悟,可以扎人心。
  2. 现在中国的男人比女人多那么多,可以说一定是有几千万是娶不到媳妇的。这绝对不是危言耸听,这就是事实,而且很可能有些男同胞已经感觉出来了。

语音文本的信息相信大家了解的差不多了,那让我们来看一下对比结果,来分析各引擎的优缺点吧。
(备注:以上测评结果仅基于本次验证集)

结果分析:基于本次验证集的数据对比分析,百度和科大讯飞的语音识别引擎在慢语速识别率较其他两个厂家存在一定的差距,百度慢语速语音识别率为46.50%,科大讯飞为75.11%,而另外两家的慢语速识别率分别达到了98.70%和95.45%。四家算法厂商在普通语速和快语速方面的识别率还是相当高的。
由于小君仅仅测试了音乐和闲聊两个领域,可能这两个领域并不是百度和讯飞的专长,如果想看更多领域的测评结果,您可以联系语音测评君,小君欢迎您随时关注和联系!

没有更多推荐了,返回首页