您当前的位置: 首页 >  嵌入式

正点原子

暂无认证

  • 0浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子Linux连载】第二十五章 语音识别项目 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2

正点原子 发布时间:2022-07-20 14:41:57 ,浏览量:0

1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 4)对正点原子Linux感兴趣的同学可以加群讨论:935446741

第二十五章 语音识别项目

我们知道AI智能音箱已经在我们生活中不少见,也许我们都玩过,智能化非常高,功能强大,与我们平常玩的那种蓝牙音箱,Wifi音箱有很大的区别,AI智能在哪里呢?语音识别技术和云端技术,主要由主控芯片,麦克风阵列,功率放大,codec,触控电路,LED阵列组成。 AI音箱对传统音箱主要有两大块的技术区别,一块是语音信号的前处理,包括回声消除、波速成型、音源定位、降噪、去混响、自动语音电平控制这块是偏硬件的控制。还有一块是智能语音交互,包括语音关键词搜索、本地语音识别、声纹识别、语音合成。 AI智能音箱的芯片方案商:联发科,全志科技,瑞芯微等等,语音识别都有现成的方案商。他们的麦克风阵列方案,有2麦,4麦,6麦,7 + 1麦等等。 写上面这些是让读者了解一下专业AI音箱方案与我们在正点原子Linux开发板想实现语音识别的差别在哪里。我们在正点原子Linux开发板上实现语音识别项目(功能),就不能与专业的AI音箱对比了。硬件资源有限,开发板只有一个麦头(咪头座),没有那些硬件控制消除回声,降噪等等。不过编者在上面调用百度语音API识别语音,识别率还是挺高的。 下面就与大家一起在正点原子Linux IMX6U开发板上实现语音识别功能吧!注意:正点原子MINI I.MX6U开发板没有音频芯片,不支持此实验,只有正点原子I.MX6U ALPHA开发板支持。 本章简介如下: 介绍百度语音技术账号申请,及简单介绍调用流程。 用Qt编写示例程序。流程如下,录制音频后,发送调用百度语音识别API接口,识别并返回结果。支持语音控制正点原子I.MX6U开发板上的LED控制,其他设备可以自行拓展。

25.1 语音识别产品申请帐号

语音识别技术产品,有讯飞,百度等厂家,我们可以购买或者免费试用他们的产品。可以直接到他们的官网上查看,有使用技术文档。下面我们以百度语音识别技术产品为例子。可以在浏览器输入搜索“百度语音识别”,就可以找到百度AI开放平台。 在这里插入图片描述

点击进去就可以看到他的技术文档链接位置。如下图。

在这里插入图片描述

或者直接打开https://ai.baidu.com/ai-doc/SPEECH/Ek39uxgre就可以跳转到百度AI开放平台》帮助文档》语音技术页面。如下图。

在这里插入图片描述

请仔细阅读百度语音技术的文档,里面写的非常详细,还有例子下载参考。
编者阅读总结,想要使用百度语音识别接口,需要根据上面图中的新手指南注册百度帐号,领取免费额度及创建中文普通话应用(创建前先领取免费额度(180天免费额度,可调用约5万次左右,详细请看免费额度说明))。记住自己的密钥。请自行完成及创建百度帐号,按照百度帮助文档里的步骤,领取免费额度及创建中文普通话应用,获取密钥!程序里需要用到自己的密钥。编者提供的密钥是百度语音识别例程里的,如果开发次数超了可能就不能使用了。程序中只需要API Key与Secret Key。注意获取Access Token时有效期为30天,到期后需要在程序里重新获取新的token。

在这里插入图片描述

更多参考请查看百度AI接入指南。
注意,帮助文档里提及SDK包,有LinuxC++SDK包支持,但是目前仅支持 X64(x86-64) CPU架构的 Linux 操作系统。LinuxSDK 仅支持在线语音识别,固定长语音模式。简单的说就是还不支持ARM架构的SDK包。
25.2 百度语音识别流程及示例简介

在百度AI帮助文档里可以看见如下重要信息。 在这里插入图片描述

请认真阅读调用流程,了解操作过程,对下面理解编者编写Qt调用百度语音API的例子会有一定的帮助。
总结:调用流程需要仔细阅读,百度提供了示例Demo代码,可以看到里面支持很多种编程语言编写的API请求相关示例demo代码。没有直接C++相关的代码。C语言是C++语言的子集,我们可以直接参考C语言编写的例子(请自行查阅及参考百度提供的C语言编写的API请求相关示例demo代码)来编写Qt调用语音识别API。(备注:其他语言编写的例子不在我们教程范围。)识别的音频格式支持如上,我们可以知道一些重要的信息是支持采样率16000、8000的固定值,16bit深的单声道,音频长度最长60秒。格式支持wav,恰好正点原子Linux I.MX6U开发板系统支持wav格式播放及录制(详细请看【正点原子】I.MX6U用户快速体验V1.x.pdf测试音频部分)。
备注:由于百度语音识别的API例子放在github(开源网站),国外网站的原因,可能打开失败,请多次尝试,如果一直无法访问,那么我们直接往下看使用编者编写Qt的示例吧。不能访问的话,编者也没办法的。
25.3 百度短语音识别API接口

源码路径为4/02_asr_demo/asr/asr.h,内容如下。asr是语音识别功能demo,(asr译作自动语音识别技术即automatic speech recognition)

    /******************************************************************
    Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
    * @projectName   asr
    * @brief         asr.h
    * @author        Deng Zhimao
    * @email         1252699831@qq.com
    * @net            www.openedv.com
    * @date           2021-06-03
    *******************************************************************/
1   #ifndef ASR_H
2   #define ASR_H
3 
4   #include 
5 
6   #include 
7   #include 
8 
9   #include 
10  #include 
11  #include 
12  #include 
13  #include 
14
15  #include 
16
17  class Asr : public QWidget
18  {
19      Q_OBJECT
20
21  public:
22      Asr(QWidget *parent = nullptr);
23      ~Asr();
24
25      /* 请求网络 */
26      void requestNetwork(QString, QByteArray);
27
28      /* 获取识别结果 */
29      void getTheResult(QString fileName);
30
31  private:
32      /* 存储获取tokenUrl地址 */
33      QString tokenUrl;
34
35      /* 存储serverapi地址 */
36      QString serverApiUrl;
37
38      /* 最终需要访问token的地址 */
39      QString accessToken;
40
41      /* 获取token的接口*/
42      const QString token_org = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%1&client_secret=%2&";
43
44      /* 填写网页上申请的appkey 如 g_api_key="g8eBUMSokVB1BHGmgxxxxxx" */
45      const QString api_key = "kVcnfD9iW2XVZSMaLMrtLYIz";
46
47      /* 填写网页上申请的APP SECRET 如 $secretKey="94dc99566550d87f8fa8ece112xxxxx" */
48      const QString secret_key = "O9o1O213UgG5LFn0bDGNtoRN3VWl2du6";
49
50      /* 百度服务器API接口,发送语音可返回识别结果 */
51      const QString server_api = "http://vop.baidu.com/server_api?dev_pid=1537&cuid=%1&token=%2";
52
53      /* 网络管理 */
54      QNetworkAccessManager *networkAccessManager;
55
56      QString getJsonValue(QByteArray ba, QString key);
57
58      QFile file;
59
60  private slots:
61
62      /* 准备读取响应返回来的数据 */
63      void readyReadData();
64
65      /* 响应完成处理 */
66      void replyFinished();
67
68  signals:
69      void asrReadyData(QString);
70
71  };
72  #endif // ASR_H
第45行,请填写读者自己在网页上申请的API Key。以防万一示例中的API Key过期不可用!
第47行,请填写读者在网页上申请的Secret Key。以防万一示例中的Secret Key过期不可用!
其他地址由来是见百度给出的Demo示例,及百度的帮助文档。这里就不详细说了。原理与上一章原子云API接口相似。不过百度语音识别需要通过自己的帐号,指定地址获取访问的Token源地址,然后将得到的Access Token地址与语音识别服务器地址拼接,发送语音到服务器,就可以返回识别的结果了。详细请参考源码4/02_asr_demo/asr/asr.cpp。
25.4 录制wav音频

在12.5小节,已经介绍过开发板如何录制音频文件了,详细请看12.5小节,就不详细介绍了,注意需要修改的地方如下。因为百度语音识别支持采样率16000、8000的固定值,16bit深的单声道,音频长度最长60秒。格式支持wav,pcm等格式。我们需要修改录制音频格式为wav格式,通道为单声道,采样率为16000,源码如下,已用红色字体标出。录制的音频文件保存为本地16k.wav文件。 源码路径为4/02_asr_demo/audiorecorder/audiorecorder.cpp。

    /******************************************************************
    Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
    * @projectName   audiorecorder
    * @brief         audiorecorder.cpp
    * @author        Deng Zhimao
    * @email         1252699831@qq.com
    * @net            www.openedv.com
    * @date           2021-06-04
    *******************************************************************/
1   #include "audiorecorder.h"
2   #include 
3   #include 
4   #include 
5   #include 
6   #include 
7  
8   static qreal getPeakValue(const QAudioFormat &format);
9   static QVector getBufferLevels(const QAudioBuffer &buffer);
10 
11  template 
12  static QVector getBufferLevels(const T *buffer, int frames, int channels);
13 
14  AudioRecorder::AudioRecorder(QWidget *parent)
15  {
16      Q_UNUSED(parent);
17 
18      /* 录制音频的类 */
19      m_audioRecorder = new QAudioRecorder(this);
20 
21      /* 用于探测缓冲区的数据 */
22      m_probe = new QAudioProbe(this);
23 
24      /* 信号槽连接,更新录音level显示 */
25      connect(m_probe, &QAudioProbe::audioBufferProbed,
26              this, &AudioRecorder::processBuffer);
27 
28      /* 设置探测的对象 */
29      m_probe->setSource(m_audioRecorder);
30 
31      /* 扫描本地声卡设备 */
32      devicesVar.append(QVariant(QString()));
33      for (auto &device: m_audioRecorder->audioInputs()) {
34          devicesVar.append(QVariant(device));
35          //qDebug()            
关注
打赏
1665308814
查看更多评论
0.0449s