kit7828 发表于 2022-12-3 00:11

【行空板 Python编程学习主控板】 五、离线语音识别和云语音识别比较

<div class='showpostmsg'> 本帖最后由 kit7828 于 2022-12-3 11:24 编辑

<p>一直想在行空板上进行语音识别的尝试和应用,尤其是看到官方网站中给出的离线语音识别maix-speech,结果还是非常失望,通过百度云进行的语音识别功能非常强大,识别率和识别速度都非常满意。</p>

<p>一、几乎没有效果的maix-speech离线语音识别</p>

<p>Maix-Speech 是专为嵌入式环境设计的离线语音库,设计目标包括:ASR/TTS/CHAT &nbsp;&nbsp;<br />
作者的设计初衷是完成一个低至Cortex-A7 1.0GHz 单核下可以实时运行的ASR库。 &nbsp;&nbsp;<br />
目前市面上的离线语音库非常稀缺,即使有也对主控要求很高,Maix-Speech 针对语音识别算法进行了深度优化,在内存占用上达到了数量级上的领先,并且保持了优良的WER。 &nbsp;</p>

<p>行空板上运行maix-speech离线语音识别效果很差,原因应该还是行空板的运算速度不够,或许直接用C语音编程能够实现,但是Python的效果几乎没有。过程如下:</p>

<p>1、官方网站中下载整个案例代码</p>

<p> 我用的是网盘2,百度网盘https://pan.baidu.com/s/1H8yVFjFTEvZIrgwzDYpVEA?pwd=aixk</p>

<p>2、上传压缩包至行空板</p>

<p>下载后,通过浏览器打开10.1.2.3,使用文件上传功能,其实在Mind+中也是可以上传的。</p>

<p>&nbsp;在行空板中运行命令解压maix-speech.zip</p>

<p> &nbsp;可以在行空板中看到文件目录</p>

<p> &nbsp;</p>

<p>3、安装依赖库</p>

<p>依照提示,先运行1-Install_dependency.py安装依赖库。</p>

<p>&nbsp; 5、运行2-speech.py进行离线语音识别</p>

<p> &nbsp;&nbsp;识别的语音只有3个,分别是天猫精灵、开灯和关灯</p>

<p>&nbsp; 6、识别效果</p>

<p>&nbsp;从截图可以看到有一定的识别效果,但是速度太慢了,以致于不知道有没有正确识别,前后之间的时间差,感觉也是无序的,综合来说,几乎没有识别。</p>

<p>二、强大的百度云语音识别</p>

<p>百度AI云语音识别精度很高,能够快递精准的识别语音,并转换为文字,需要调用API,将语音录音文件上传到云,然后就能得到经过AI云识别后的文字。</p>

<p>1、Python代码</p>

<p>通过行空板官方网站,看到了百度语音识别的案例,就直接拿来使用了。感觉Python的代码非常简单,应该是aip中进行了封装。</p>

<p>代码如下:</p>

<pre>
<code>from unihiker import GUI,Audio#导入包
from aip import AipSpeech

gui=GUI()#实例化GUI类
audio = Audio() # 实例化Audio类

#gui 添加文本标题
gui.draw_text(x=60, y=20,color="#4169E1", font_size=18,text="语音识别助手")

# gui 添加按钮信息
gui.add_button(x=120, y=150, w=100, h=30, text="录音", origin='center', onclick=lambda:Record() )

gui.add_button(x=120, y=210, w=100, h=30, text="识别", origin='center', onclick=lambda: Recognition() )
# 识别显示信息
info_text2 = gui.draw_text(x=0, y=60,color="black",text="")

""" 你的 APPID AK SK """
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 读取文件(固定代码)
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
      return fp.read()

# 识别本地文件
def voiceToText():
    res = client.asr(get_file_content('3s.wav'), 'wav', 16000, {
            'dev_pid': 1537,
      })
    return res.get('result')

def Record():
    print("开始进行录音")
    audio.record('3s.wav', 5) #录音5S
    print("录音结束")
    info_text2.config(x=0, y=60, text="")# 清空识别信息显示栏

def Recognition():
    print("开始进行语音识别")
    msg = voiceToText()
    print(msg)
    info_text2.config(x=0, y=60, text=msg) #更新识别显示的信息
    time.sleep(1)

import time
while True:

    #增加等待,防止程序退出和卡住
    time.sleep(1)</code></pre>

<p>只改了按钮的位置,以及录音长度改成了5秒。</p>

<p>2、百度云中的语音识别应用</p>

<p>需要在百度云中创建应用,并进行简单的设置</p>

<p>&nbsp;记录APPID、&nbsp; &nbsp;API Key 、&nbsp;&nbsp; &nbsp;Secret Key,然后更新前面的py代码</p>

<p>3、行空板中设置WiFi联网</p>

<p>通过http://10.1.2.3进行WiFi的设置,这里就不啰嗦了。</p>

<p>4、运行百度语音识别程序</p>

<p>&nbsp;可以看到识别效果非常好,由于我这边的wifi延迟比较严重,因此,识别的时候时间的差距比较大。</p>

<p>5、百度云语音识别视频</p>

<p>fab791da60aa231a5558b65c0ed85de5</p>

<p>三、总结</p>

<p>网上评价maix-speech是一款非常不错的离线语音识别,也看过语音识别的视频,效果还是不错的,行空板上没有效果,应该有两个方面的因素,一个是没有训练,没有用到特定的识别模型,二是运算速度的限制,尤其是Python代码,速度上更是拖了后腿。</p>

<p>百度云语音识别的效果确实非常棒,只是对网络的依赖比较重,网速更不上的时候,效果就差些。</p>
</div><script>                                var loginstr = '<div class="locked">查看精华帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                               
                                if(parseInt(discuz_uid)==0){
                                                                                        (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                }
</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

lugl4313820 发表于 2022-12-5 09:17

百度云语音识别,这个收费的吗?

kit7828 发表于 2022-12-5 11:20

lugl4313820 发表于 2022-12-5 09:17
百度云语音识别,这个收费的吗?

<p>新人免费,老人收费<img height="51" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/sweat.gif" width="50" /></p>

lugl4313820 发表于 2022-12-5 17:13

kit7828 发表于 2022-12-5 11:20
新人免费,老人收费

<p>那不是杀熟嘛。。。</p>

kit7828 发表于 2022-12-6 20:22

lugl4313820 发表于 2022-12-5 17:13
那不是杀熟嘛。。。

<p>就是。我借了别人的账号,用的百度云AI功能。</p>

lugl4313820 发表于 2022-12-7 07:37

kit7828 发表于 2022-12-6 20:22
就是。我借了别人的账号,用的百度云AI功能。

<p>你的朋友真多。</p>

ces2023 发表于 2024-2-21 16:49

本帖最后由 ces2023 于 2024-2-21 16:59 编辑

<p>其实maix-speech离线语音识别效果差,和板子的算力有关系。一个解决方法是,替换maix-speech中的声学模型 和 语言模型。</p>

<p style="text-align:justify">查看Maix-Speech的github,可以看到Maix-Speech提供不同规格的声学训练模型和语言训练模型。</p>

<p style="text-align:justify"><a href="https://github.com/sipeed/Maix-Speech/releases" target="_blank">https://github.com/sipeed/Maix-Speech/releases</a></p>

<p style="text-align:justify">使用低规格的声学训练模型和语言训练模型可以降低运算量,在低性能的处理器上可以获得更好的效果,但准确度会降低。</p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify">行空板教程里面给出的链接只包含3324的声学训练模型和lmM的语言训练模型,但github的release连接里面可以下载其他模型。为了提高流畅度,下载并上传3316的声学训练模型和lmS的语言训练模型到行空板。</p>

<p style="text-align:justify">修改maix-speech文件夹下的配置文件asr_wav.cfg, 将对应的声学模型从3324换为3316, 语言模型从<span style="color:#1f2328">lm_m</span><span style="color:#1f2328">换为</span><span style="color:#1f2328">lm_s</span><span style="color:#1f2328">,为了进一步加快运行速度,将搜索深度由</span><span style="color:#1f2328">5.0</span><span style="color:#1f2328">修改为</span><span style="color:#1f2328">3.0</span><span style="color:#1f2328">。</span></p>

<p style="text-align:justify"><span style="color:#1f2328">再次运行</span></p>

<p style="text-align:justify"><span style="color:black">python 2-speech.py</span></p>

<p style="text-align:justify">可以看到替换训练模型和修改配置文件后,识别速度明显提高,基本可以做到实时识别。</p>

<p style="text-align:justify">查看2-speech.py可以看到,最终识别是由maix_asr的可执行程序实现的,运行maix_asr需要指定配置文件以及需要识别的拼音。</p>

<p style="text-align:justify">下一步就是用python获取识别结果,方法是在python中用subprocess运行maix_asr,并且重新映射stdout获得识别结果,但会出现log不实时的问题。实接运行maix_asr可以实时看到log,但是python中使用subprocess运行maix_asr,无法通过stdout实时拿到结果,只有log每满4096字节,才能一次性拿到log。其原因和Linux对stdout处理机制有关系,如果stdout指向屏幕,或者其他接口,每遇到换行符或满1024字节就会输出log,但是如果将stdout重映射到文件或者其他地方,Linux为了提高运行效率,默认会累计log,每满4096字节才会输出一次。</p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify">为了可以实时获取识别结果,使用</p>

<p style="text-align:justify"><span style="color:black">stdbuf -oL ./maix_asr asr_wav.cfg</span></p>

<p style="text-align:justify">强制系统不缓冲stdout,这样在python中就可以实时获取log了。</p>
页: [1]
查看完整版本: 【行空板 Python编程学习主控板】 五、离线语音识别和云语音识别比较