2017-09-09 13:14:54 update_sh 阅读数 5445
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波

百度语音识别通过REST API的方式给开发者提供一个通用的HTTP接口,基于该接口,开发者可以轻松的获取语音识别能力,本文档演示了如何在VS2017下使用语音识别服务REST API。

  1. https://ai.baidu.com/sdk#asr下载《识别、合成 REST API 开发文档、示例代码》,解压后里面有目录 example\linux c\
  2. 创建一个空的工程,example\linux c\复制过来,可以改一下目录名,我改成了baidu_voice,把此目录下的base64.cpp、base64.h、sample.cpp添加到工程里面来。还要把那个语音测试文件test.pcm也复制过来,如果你自己有pcm文件也可以。
  3. 此目录下的 curl和json-cpp都是linux版本的,我们需要换成windows版的,
    3.1. 网上下载的libcurl一般不支持https,所以需要我们自己编译,
    3.2. jsoncpp的源码我们直接从 https://github.com/open-source-parsers/jsoncpp ,执行 python.exe amalgamate.py(前提是要安装python)可以在dist目录生成所需要的文件,把dist下的json目录和jsoncpp.cpp复制到json-cpp目录下,并把jsoncpp.cpp添加进工程即可,不要添加lib
  4. 因为最新的jsoncpp的接口有所改变,所以对sample.cpp做如下改变:
    4.1. #include “json-cpp/include/json.h”改成#include “json-cpp/json/json.h”
    4.2. 若遇到错误:error C4996: ‘Json::Reader::Char’: Use CharReader and CharReaderBuilder instead,可以采取这两种办法:
    4.2.1. 把#include “json-cpp/json/json.h”改成下面:

    #pragma warning (push)
    #pragma warning (disable: 4996)
    #include "json-cpp/json/json.h"
    #pragma warning (pop)

    4.2.2. 在”json-cpp/json/json.h”里把 define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))注释掉。
    4.3. 把popen改成_popen,pclose改成_pclose
    4.4. fp = fopen(argv[1], “r”)改成fopen_s(&fp, argv[1], “r”)
    4.5. strcpy改成strcpy_s,strcat改成strcat_s
    4.6. Json处理部分改成如下:

    if (result != NULL)
    {
    Json::CharReaderBuilder b;
    Json::CharReader* reader(b.newCharReader());
    JSONCPP_STRING errs;
    Json::Value root;
    bool ok = reader->parse(result, result + std::strlen(result), &root, &errs);
    if (ok&&errs.size() == 0)
    {
    token = root.get("access_token","").asString();
    }
    delete reader;
    free(result);
    }
  5. 加入两个宏

    #define _METHOD_1_
    //#define _METHOD_2_

    表示采用哪一种方式上传语音数据。
  6. 把curl\lib添加到库目录,\curl\bin添加到可执行文件目录,在 配置属性->链接器->输入->附加依赖项添加libcurl.lib
  7. 在程序退出前添加代码:

    if (resultBuf != NULL) {
    free(resultBuf);
    }
  8. 在 配置属性->调试->命令参数 里面填写 test.pcm,就是上传的那个音频文件。
  9. 在调试之前,还要把cuid、apiKey、secretKey信息加上,这个去百度http://ai.baidu.com/注册账号,然后创建一个应用就可以看到了。
  10. 在调试的时候,发现调用 _popen打开curl.exe命令行的方式,总是得不到返回结果,所以用了libcurl的函数改写了一下。

    CURLcode getUrl(char* url, char** result)
    {
        CURL *curl;
        CURLcode res = CURL_LAST;
        curl = curl_easy_init();    // 初始化
        if (curl)
        {
            curl_easy_setopt(curl, CURLOPT_URL, url);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, result);
    
            if (strncmp(url, "https://", 8) == 0)
            {
    
    #if 1     
    
                // 方法1, 设定为不验证证书和HOST  
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    
    #else  
    
                // 方法2, 设定一个SSL判别证书, 未测试  
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L)
                    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
                curl_easy_setopt(curl, CURLOPT_CAINFO, "ca-cert.pem");    // TODO: 设置一个证书文件  
    
    #endif
    
            }
            res = curl_easy_perform(curl);   // 执行
            if (res != CURLE_OK) {
                const char* strerr = curl_easy_strerror(res);
                *result = (char *)realloc(*result, strlen(strerr));
                strcpy_s(*result, strlen(strerr), strerr);
            }
            curl_easy_cleanup(curl);
        }
        return res;
    }
  11. 因为返回的是UTF8字符,所以最后又转了一次码。

需要源码的可以去这里下载 http://download.csdn.net/download/update_sh/9971150

2018-03-10 17:32:04 thecentry 阅读数 3382
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波

visual c++ 创建Win32工程调用windows API 做语音识别。查找了很多资料,但是很少用Win32的,国外倒是有很多人用C#调用Windows API 做语音识别。很多结合语音识别与word结合,把识别的语音写在word文档上,由于我不是C#喜好者,所以没有查找实现那些的source code。

代码如下:

// SpeechToTextTest2.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "SpeechToTextTest2.h"
#include<Windows.h>
#include<WinUser.h>
#include <sphelper.h>
#include <string>
//#include "Resource.h"
#define WM_RECOEVENT    WM_USER+1
#define ID_START_RECOG 13

BOOL CALLBACK DlgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
void LaunchRecognition(HWND hWnd);
void HandleEvent(HWND hWnd);
WCHAR *ExtractInput(CSpEvent event);
void CleanupSAPI();

CComPtr<ISpRecognizer> g_cpEngine;
CComPtr<ISpRecoContext> g_cpRecoCtx;
CComPtr<ISpRecoGrammar> g_cpRecoGrammar;
WCHAR *lpszBuffer;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	// allocating memory for buffer this buffer is used to store
	// the text during the speech recognition process
	lpszBuffer = new WCHAR[MAX_PATH];
	lpszBuffer[0] = 0;

	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG12), NULL, DlgProc);
	// freeing the memory that was allocated for the buffer
	delete[] lpszBuffer;
	return 0;
}

BOOL CALLBACK DlgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
	switch (Message)
	{
	case WM_RECOEVENT:
		HandleEvent(hWnd);
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDC_BUTTON1:
			LaunchRecognition(hWnd);
			break;
		}
		break;
	case WM_CLOSE:
		CleanupSAPI();
		EndDialog(hWnd, 0);
		break;
	default:
		return FALSE;
	}
	return TRUE;
}

void LaunchRecognition(HWND hWnd)
{
	if (FAILED(::CoInitialize(NULL)))
	{
		throw std::string("Unable to initialise COM objects");
	}

	ULONGLONG ullGramId = 1;
	HRESULT hr = g_cpEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
	if (FAILED(hr))
	{
		throw std::string("Unable to create recognition engine");
	}

	hr = g_cpEngine->CreateRecoContext(&g_cpRecoCtx);
	if (FAILED(hr))
	{
		throw std::string("Failed command recognition");
	}

	hr = g_cpRecoCtx->SetNotifyWindowMessage(hWnd, WM_RECOEVENT, 0, 0);
	if (FAILED(hr))
	{
		throw std::string("Unable to select notification window");
	}

	const ULONGLONG ullInterest = SPFEI(SPEI_SOUND_START) | SPFEI(SPEI_SOUND_END) |
		SPFEI(SPEI_PHRASE_START) | SPFEI(SPEI_RECOGNITION) |
		SPFEI(SPEI_FALSE_RECOGNITION) | SPFEI(SPEI_HYPOTHESIS) |
		SPFEI(SPEI_INTERFERENCE) | SPFEI(SPEI_RECO_OTHER_CONTEXT) |
		SPFEI(SPEI_REQUEST_UI) | SPFEI(SPEI_RECO_STATE_CHANGE) |
		SPFEI(SPEI_PROPERTY_NUM_CHANGE) | SPFEI(SPEI_PROPERTY_STRING_CHANGE);
	hr = g_cpRecoCtx->SetInterest(ullInterest, ullInterest);
	if (FAILED(hr))
	{
		throw std::string("Failed to create interest");
	}

	hr = g_cpRecoCtx->CreateGrammar(ullGramId, &g_cpRecoGrammar);
	if (FAILED(hr))
	{
		throw std::string("Unable to create grammar");
	}

	hr = g_cpRecoGrammar->LoadDictation(0, SPLO_STATIC);
	if (FAILED(hr))
	{
		throw std::string("Failed to load dictation");
	}

	hr = g_cpRecoGrammar->SetDictationState(SPRS_ACTIVE);
	if (FAILED(hr))
	{
		throw std::string("Failed setting dictation state");
	}
}

void HandleEvent(HWND hWnd)
{
	CSpEvent event;
	WCHAR  *pwszText;

	// Loop processing events while there are any in the queue
	while (event.GetFrom(g_cpRecoCtx) == S_OK)
	{
		switch (event.eEventId)
		{
		case SPEI_HYPOTHESIS:
		{
			pwszText = ExtractInput(event);
			MessageBoxW(NULL, pwszText, L"text", MB_ICONERROR);
			wcscat(lpszBuffer, pwszText);
			wcsncat(lpszBuffer, L"\r\n", 2);
			SetDlgItemTextW(hWnd, IDC_EDIT1, lpszBuffer);
		}
		break;
		}
	}
}

WCHAR *ExtractInput(CSpEvent event)
{
	HRESULT                   hr = S_OK;
	CComPtr<ISpRecoResult>    cpRecoResult;
	SPPHRASE                  *pPhrase;
	WCHAR                     *pwszText;

	cpRecoResult = event.RecoResult();

	hr = cpRecoResult->GetPhrase(&pPhrase);

	if (SUCCEEDED(hr))
	{
		if (event.eEventId == SPEI_FALSE_RECOGNITION)
		{
			pwszText = L"False recognition";
			//MessageBoxW(NULL, pwszText, L"text", MB_ICONERROR);
		}
		else
		{
			// Get the phrase's entire text string, including replacements.
			hr = cpRecoResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pwszText, NULL);
		}
	}
	CoTaskMemFree(pPhrase);
	return pwszText;
}

void CleanupSAPI()
{
	if (g_cpRecoGrammar)
	{
		g_cpRecoGrammar.Release();
	}
	if (g_cpRecoCtx)
	{
		g_cpRecoCtx->SetNotifySink(NULL);
		g_cpRecoCtx.Release();
	}
	if (g_cpEngine)
	{
		g_cpEngine.Release();
	}
	CoUninitialize();
}

运行结果如下:

代码参考

C++ Speech Recognition:https://www.codeproject.com/Tips/784140/Cplusplus-Speech-Recognition

点进去看这个文章后,你会发现有一堆问都文件问题的人,无法编译通过,因为源工程已经不存在了,.cpp而没有头文件部分。经过一番摸索,我实现了如上。

博客里面也只有.cpp部分,由于csdn下载文件要积分。所以就不上传了源工程了。

如果觉得有参考价值、需要源文件的同志,可以email我,邮箱:761577651@qq.com

也可以在下方留言:留言比较快!向那些迟发的邮件致歉!

不缺积分的可以点击链接下载:https://download.csdn.net/download/thecentry/10859369

还要提醒的是,我只是实现了,源博客APP的实现问题。

2016-05-04 19:38:56 MichaelLiang12 阅读数 18723
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波

C++语音识别接口快速入门(Microsoft Speech SDK)

最近毕业设计用到了微软的C++语音识别接口,查找了很多资料,也碰到了很多问题,走了很多弯路。现在把我自己的经验写下来,一是提升自己,二是回报社会。希望大家看了这篇blog之后,5min就学会C++语音识别接口的实现。(采用的平台为win8+VS2013)

目录

一、安装SDK

安装MicrosoftSpeechPlatformSDK.msi,默认路径安装即可。
下载路径:
http://download.csdn.net/detail/michaelliang12/9510691

二、新建工程,配置环境

设置:
1,属性–配置属性–C/C++–常规–附加包含目录:C:\Program Files\Microsoft SDKs\Speech\v11.0\Include(具体路径与安装路径有关)
2,属性–配置属性–链接器–输入–附加依赖项:sapi.lib;

三、语音识别代码

语音识别接口可分为文字转语音和语音转文字

1、文字转语音

需要添加的头文件:

#include <sapi.h> //导入语音头文件
#pragma comment(lib,"sapi.lib") //导入语音头文件库

函数:

void  CBodyBasics::MSSSpeak(LPCTSTR speakContent)// speakContent为LPCTSTR型的字符串,调用此函数即可将文字转为语音
{
    ISpVoice *pVoice = NULL;

    //初始化COM接口

    if (FAILED(::CoInitialize(NULL)))
        MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);

    //获取SpVoice接口

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);


    if (SUCCEEDED(hr))
    {
        pVoice->SetVolume((USHORT)100); //设置音量,范围是 0 -100
        pVoice->SetRate(2); //设置速度,范围是 -10 - 10
        hr = pVoice->Speak(speakContent, 0, NULL);

        pVoice->Release();

        pVoice = NULL;
    }

    //释放com资源
    ::CoUninitialize();
}

2、语音转文字

这个稍微麻烦一点,因为需要实时监控麦克风,涉及到windows的消息机制。
(1)首先设置工程属性:
属性–配置属性–C/C++–预处理器–预处理器定义:_WIN32_DCOM;

(2)需要添加的头文件:

#include <sapi.h> //导入语音头文件
#pragma comment(lib,"sapi.lib") //导入语音头文件库
#include <sphelper.h>//语音识别头文件
#include <atlstr.h>//要用到CString

#pragma once
const int WM_RECORD = WM_USER + 100;//定义消息

(3)在程序的.h头文件中定义变量

//定义变量
CComPtr<ISpRecognizer>m_cpRecoEngine;// 语音识别引擎(recognition)的接口。
CComPtr<ISpRecoContext>m_cpRecoCtxt;// 识别引擎上下文(context)的接口。
CComPtr<ISpRecoGrammar>m_cpCmdGrammar;// 识别文法(grammar)的接口。
CComPtr<ISpStream>m_cpInputStream;// 流()的接口。
CComPtr<ISpObjectToken>m_cpToken;// 语音特征的(token)接口。
CComPtr<ISpAudio>m_cpAudio;// 音频(Audio)的接口。(用来保存原来默认的输入流)
ULONGLONG  ullGrammerID;

(4)创建语音识别初始化函数(程序刚开始执行的时候调用,例如文末示例代码中,将此初始化函数放在对话框初始化消息WM_INITDIALOG的响应代码里)

//语音识别初始化函数
void  CBodyBasics::MSSListen()
{

    //初始化COM接口

    if (FAILED(::CoInitialize(NULL)))
        MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);


    HRESULT hr = m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);//创建Share型识别引擎
    if (SUCCEEDED(hr))
    {


        hr = m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);//创建识别上下文接口

        hr = m_cpRecoCtxt->SetNotifyWindowMessage(m_hWnd, WM_RECORD, 0, 0);//设置识别消息

        const ULONGLONG ullInterest = SPFEI(SPEI_SOUND_START) | SPFEI(SPEI_SOUND_END) | SPFEI(SPEI_RECOGNITION);//设置我们感兴趣的事件
        hr = m_cpRecoCtxt->SetInterest(ullInterest, ullInterest);

        hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &m_cpAudio);
        m_cpRecoEngine->SetInput(m_cpAudio, true);



        //创建语法规则
        //dictation听说式
        //hr = m_cpRecoCtxt->CreateGrammar(GIDDICTATION, &m_cpDictationGrammar);
        //if (SUCCEEDED(hr))
        //{
        //  hr = m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);//加载词典
        //}

        //C&C命令式,此时语法文件使用xml格式
        ullGrammerID = 1000;
        hr = m_cpRecoCtxt->CreateGrammar(ullGrammerID, &m_cpCmdGrammar);

        WCHAR wszXMLFile[20] = L"";//加载语法
        MultiByteToWideChar(CP_ACP, 0, (LPCSTR)"CmdCtrl.xml", -1, wszXMLFile, 256);//ANSI转UNINCODE
        hr = m_cpCmdGrammar->LoadCmdFromFile(wszXMLFile, SPLO_DYNAMIC);


        //MessageBox(NULL, (LPCWSTR)L"语音识别已启动!", (LPCWSTR)L"提示", MB_CANCELTRYCONTINUE );
        //激活语法进行识别
        //hr = m_cpDictationGrammar->SetDictationState(SPRS_ACTIVE);//dictation
        hr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_ACTIVE);//C&C
        hr = m_cpRecoEngine->SetRecoState(SPRST_ACTIVE);

    }

    else
    {
        MessageBox(NULL, (LPCWSTR)L"语音识别引擎启动出错!", (LPCWSTR)L"警告", MB_OK);
        exit(0);
    }


    //释放com资源
    ::CoUninitialize();
    //hr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_INACTIVE);//C&C


}

(5)定义消息处理函数
需要和其他的消息处理代码放在一起,如本文代码中,放在文末示例代码的DlgProc()函数尾部。本文整个其他的代码块都可以直接照搬,只需要更改如下的消息反应模块即可

//消息处理函数
USES_CONVERSION;
    CSpEvent event;

    if (m_cpRecoCtxt)
    {
        while (event.GetFrom(m_cpRecoCtxt) == S_OK){

            switch (event.eEventId)
            {
            case SPEI_RECOGNITION:
            {
                                     //识别出了语音
                                     m_bGotReco = TRUE; 

                                     static const WCHAR wszUnrecognized[] = L"<Unrecognized>";

                                     CSpDynamicString dstrText;

                                     ////取得识别结果 
                                     if (FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL)))
                                     {
                                         dstrText = wszUnrecognized;
                                     }

                                     BSTR SRout;
                                     dstrText.CopyToBSTR(&SRout);
                                     CString Recstring;
                                     Recstring.Empty();
                                     Recstring = SRout;

                                    //做出反应(*****消息反应模块*****)
                                    if (Recstring == "发短信")
                                     {
                                         //MessageBox(NULL, (LPCWSTR)L"好的", (LPCWSTR)L"提示", MB_OK);
                                         MSSSpeak(LPCTSTR(_T("好,马上发短信!")));

                                     }

                                     else if (Recstring == "李雷")
                                     {
                                         MSSSpeak(LPCTSTR(_T("好久没看见他了,真是 long time no see")));
                                     }   

            }
                break;
            }
        }
    }

(6)修改语法文件
修改CmdCtrl.xml文件,可以提高某些词汇的识别度,对里面的词识别效果会很好多,如人名等。(此外,单独运行exe时也需要将此文件和exe放在同一文件夹内,不放也不会报错,只是语法文件里的词汇识别效果变差)

<?xml version="1.0" encoding="utf-8"?>
<GRAMMAR LANGID="804">
  <DEFINE>
    <ID NAME="VID_SubName1" VAL="4001"/>
    <ID NAME="VID_SubName2" VAL="4002"/>
    <ID NAME="VID_SubName3" VAL="4003"/>
    <ID NAME="VID_SubName4" VAL="4004"/>
    <ID NAME="VID_SubName5" VAL="4005"/>
    <ID NAME="VID_SubName6" VAL="4006"/>
    <ID NAME="VID_SubName7" VAL="4007"/>
    <ID NAME="VID_SubName8" VAL="4008"/>
    <ID NAME="VID_SubName9" VAL="4009"/>
    <ID NAME="VID_SubNameRule" VAL="3001"/>
    <ID NAME="VID_TopLevelRule" VAL="3000"/>
  </DEFINE>
  <RULE ID="VID_TopLevelRule" TOPLEVEL="ACTIVE">
    <O>
      <L>
        <P>我要</P>
        <P>运行</P>
        <P>执行</P>
      </L>
    </O>
    <RULEREF REFID="VID_SubNameRule" />
  </RULE>
  <RULE ID="VID_SubNameRule" >
    <L PROPID="VID_SubNameRule">
      <P VAL="VID_SubName1">发短信</P>
      <P VAL="VID_SubName2">是的</P>
      <P VAL="VID_SubName3">好的</P>
      <P VAL="VID_SubName4">不用</P>
      <P VAL="VID_SubName5">李雷</P>
      <P VAL="VID_SubName6">韩梅梅</P>
      <P VAL="VID_SubName7">中文界面</P>
      <P VAL="VID_SubName8">英文界面</P>
      <P VAL="VID_SubName9">English</P>

    </L>
  </RULE>
</GRAMMAR>

源代码下载

注意,本代码是在原来的项目中截取出来的,但可以独立运行。
Microsoft Speech SDK 安装包下载:
http://download.csdn.net/detail/michaelliang12/9510691
文中示例程序下载(之前下载分数太高,我已经重新上传了新版本,也解决了kincect20.lib报错的问题。由于自己经常在csdn上下东西,也需要积分,需要还是需要各位捧场,2积分。。):
http://download.csdn.net/detail/michaelliang12/9766783

存在的bug:每次运行完程序,Windows的语音识别助手不会自动关闭,需要自己手动关闭。若不关闭,则下次启动程序可能会出错。大家如果有好的解决办法,请联系我,谢了!

参考网站

1,http://www.cnblogs.com/eping/archive/2010/05/23/1742201.html
2,http://blog.csdn.net/pamchen/article/details/7856207
3,http://blog.csdn.net/jmxiaocai/article/details/7036033
4,http://blog.csdn.net/buaalei/article/details/5372544(主要参考)
5,http://blog.csdn.net/itcastcpp/article/details/5313204
6,http://blog.csdn.net/artemisrj/article/details/8723095(MFC的消息处理响应版本)

2019-12-21 15:42:36 qq1779062842 阅读数 249
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波

基于阿里语音识别SDK2.0编写的unimrcp插件

一句话识别 测试如图:
freeswitch:
在这里插入图片描述
unimrcpserver:
在这里插入图片描述
实时识别 测试如图:
freeswitch:
在这里插入图片描述
unimrcpserver:
在这里插入图片描述
更新了实时语音识别,由于标准的mrcp协议无法支持实时语音识别,所以本次更新修改了mrcp源码协议栈,使它支持实时语音识别,关于这部分,请查看我的另一篇博客的发布

源码及使用:
github
在这里插入图片描述
邮箱:c_wujinbiao@163.com

2016-12-09 11:19:05 DoeduMark 阅读数 79
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波
C++语音识别开篇—5192人已学习
课程介绍    
201612091056179155.jpg
    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。
课程收益
    了解原理及熟练运用语音识别
讲师介绍
    杨波更多讲师课程
    从事编程数年,曾留学日本深造,擅长C++、后端、尤其是逆向 执教多年,顺应互联网的发展,从线下转为线上 用激情点燃代码,帮助大家实现编程梦想
课程大纲
    1.语音识别开篇及Demo  2:24
    2.语音识别与编程  2:24
    3.语音识别之语音合成  9:24
    4.语音识别原理  5:39
    5.语音识别原理二  5:39
    6.第三方库的调用  7:41
    7.包含头文件  6:28
    8.login  7:24
    9.qtts.h文件参数讲解  4:35
    10.代码编写  16:16
    11.代码解析  11:46
大家可以点击【查看详情】查看我的课程

c++ 用微软SAPI进行实时语音识别

博文 来自: bwlrktjv44240
没有更多推荐了,返回首页