2019-07-13 18:13:45 weixin_45381780 阅读数 182
  • C++语音识别开篇

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

    6113 人正在学习 去看看 杨波

如何利用python实现在线语音识别

本篇文章主要介绍使用 python 借助 百度人工智能 实现在线的 语音识别 功能。

学习经历

在正式介绍如何进行在线语音识别功能之前我想先分享一下我自己的学习顺序:

首先对核心内容语音识别模块进行编写,在编写的过程中发现音频文件需要使用 pcm格式 ,于是下载了百度AI的范例pcm文件,并且完成了语音识别,接下来学习转码,用手机录音,然后用 ffmpeg 将录音从mp3文件转换为pcm文件,开始使用cmd手动输入实现转码,顺利转码后改为学习用python调用cmd自动执行。最后是学习python录音,录音得到的文件是wav格式,于是又把mp3->pcm的代码改为wav->pcm,最后按顺序将录音,转码,识别三个模块串在一起,形成了一个在线语音识别的程序。程序可以实现固定时长的录音(说话前预设时间,中途无法中断或延长时间)保存录音文件并将录音文件转码成pcm格式,然后将pcm音频上传到百度AI平台(这就意味着必须保证网络的畅通),进行识别后传输回识别内容。

作为一个初学者在决定学习这项功能时觉得任务非常繁重,网上能搜集到的资料驳杂而零碎,但通过不断的拼凑与尝试,最终完成了程序的编写。现在将我的实现方法分享给大家,希望可以与大家互相交流学习!

逻辑顺序

用python实现在线语音识别,我们首先需要一段语音,这段语音的格式是 .pcm ,这段语音的来源用python录制,录制后的格式是 .wav ,然后利用python调用cmd,使用 ffmpeg 将格式转码成 .pcm ,最后将文件上传到百度人工智能,并接受返回的文字结果:

  1. 录音;
  2. 转码;
  3. 在线语音识别;

环境

  • Windows 8.1
  • Python 3.7
  • Pycharm 5.0.3

需要安装的模块:

  • PyAudio (实现录音)
  • aip (实现语音识别)

一.录音

1.1 安装pyaudio

录音需要安装新的模块,名为PyAudio。安装方法: 直接打开cmd命令行,输入 pip install pyaudio
有些人可能会出现如下错误 :
error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools。

解决这个错误的方法是进入该地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 下载对应python版本的 .whl 文件。

我下载的是 PyAudio-0.2.11-cp37-cp37m-win_amd64.whl 。安装完这个文件后就可以再次输入 pip install pyaudio 成功安装pyaudio模块了。

1.2 用python完成录音

安装完成后按照如下代码编写,实现录音功能,得到**.wav**文件。代码如下:

import pyaudio
import wave
import time as t

name = ""
t.localtime()
for i in range(0,6):
    name += str(t.localtime()[i])
    if i in [3 , 4]:
        name += ':'
    elif i == 5:
        pass
    else:
        name += '-'
# ↑用开始录音的时间作为生成的文件名

CHUNK = 1024 # 底层缓存块的大小
FORMAT = pyaudio.paInt16 # 16K
CHANNELS = 1 # 单通道
RATE = 44100 # 采样率
RECORD_SECONDS = 1 # 录音时长(s)
WAVE_OUTPUT_FILENAME = name + '.wav'
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)
# ↑设置录制的格式、参数

print("* 开始录音,您有%d秒时间输入语音内容!"%RECORD_SECONDS)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print("* 录音结束")
stream.stop_stream()
stream.close()
p.terminate()# 释放PortAudio资源

# ↓生成wave文件
wf = wave.open("E:/pycharmcode/语音库/" + WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

二.转码

2.1 用cmd转码

首先要下载 ffmpeg,根据百度经验:(https://jingyan.baidu.com/album/f7ff0bfcd64cea2e26bb1334.html?picindex=7)ffmpeg 官网上下载 ffmpeg,下载完后将ffmpeg.exe、ffplay.exe、ffprobe.exe三个程序放到C:\Windows\System32该目录中,这样就可以直接在cmd中调用ffmpeg了,然后根据百度智能云文档提供的音频转码方式在cmd命令行中转码,其中:

wav 文件转 16k 16bits 位深的单声道pcm文件:

ffmpeg -y  -i 16k.wav  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm

其中16k.wav和16k.pcm是输入路径和输出路径,自己使用的时候注意输入正确的路径名,如E:\pycharmcode\语音库\16k.pcm 。

注意:在cmd中的输入路径和输出路径不能有空格,如E:\pycharm code\语音库\16k.pcm,由于pycharm与code 之间存在空格,导致cmd报错:Permission denied

mp3 文件转 16K 16bits 位深的单声道 pcm文件:

ffmpeg -y  -i aidemo.mp3  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm

2.2 使用subprocess模块在python中调用cmd转码

我们的目的是实现一串代码实现所有语音转换的功能,所以需要通过python来调用cmd指令来完成转码。

Subprocess模块不需要安装,直接import调用就可以了。
PS:当时的参考文献找不到了,最后的实现是使用subprocess.Popen()功能,具体实现代码如下所示:

# ↓转码
p_name_wav = "E:\\pycharmcode\\语音库\\" + name + '.wav'
p_name_pcm = "E:\\pycharmcode\\语音库\\" + name + '.pcm'
cmd ="ffmpeg -y  -i " + p_name_wav + " -acodec pcm_s16le -f s16le -ac 1 -ar 16000 " +  p_name_pcm
p = subprocess.Popen(cmd , shell = True)
p.wait()

(该段代码中的 name 变量见前文录音)

注意:对cmd的赋值是通过三个字符串拼接得到的,在字符串的内容和引号之间切记要空格,不然得到的将是连在一起的一串字符导致报错。

三. 语音识别模块

3.1 安装百度aip模块

首先在cmd命令行安装百度aip:在cmd命令行输入 pip baidu-aip,我目前用的版本是2.2.13.0。

3.2 获取百度人工智能平台ID

登陆百度的AI平台 ai.baidu.com,在控制台创建应用,获取ID。获取ID的过程可以参考下面的视频链接(该视频中教你如何调用百度人工智能进行语音合成): https://v.qq.com/x/page/f0807ugi16t.html

在控制台创建应用并获取ID后根据百度语音文档中心的 Python SDK教程编写代码:
https://ai.baidu.com/docs#/ASR-Online-Python-SDK/top)

3.3 语音识别代码

#_*_coding:utf-8_*_
# 开发人员: 批发萝莉:2019/6/17 9:51
# 文件名称:语音识别2.py
# 开发工具:PyCharm

from aip import AipSpeech

app_id     = "16536506"
api_key    = "xZ2Gof2ORP98FHGDxtNUqYZO"
secret_key = "**************************" # 大家将内容改为自己的秘钥

client = AipSpeech(app_id , api_key , secret_key)

# 读取文件
def get_file_content(filepath):
    with open(filepath , "rb") as fp:
        return fp.read()

# 识别本地文件
result = client.asr(get_file_content("E:/pycharmcode/语音库/16k.pcm") , "pcm" , 16000 , {
    "dev_pid" : 1536 ,
})
# client.asr(speech语音文件的路径 , format格式 , rate采样率 , cuid用户标识 , dev_pid语言模式)
# 1536 普通话(支持简单的英文识别) 搜索模型    无标点
# 1537 普通话(纯中文识别)         输入法模型  有标点
# 1737 英语                                   有标点
# 1637 粤语                                   有标点
# 1837 四川话                                 有标点
# 1936 普通话远场                  远场模型    有标点

result_list = list(result.values())
if result_list[1] != 'success.':
    print(result)
else:
    print(result_list[3])

最后附上完整的代码

#_*_coding:utf-8_*_
# 开发人员: 批发萝莉:2019/6/25 11:31
# 文件名称:录音+转码+识别.py
# 开发工具:PyCharm

import pyaudio
import wave
import time as t
import subprocess
from aip import AipSpeech

# ↓录音
name = ""
t.localtime()
for i in range(0,6):
    name += str(t.localtime()[i])
    if i in [3 , 4]:
        name += ':'
    elif i == 5:
        pass
    else:
        name += '-'
# ↑用开始录音的时间作为生成的文件名

CHUNK = 1024 # 底层缓存块的大小
FORMAT = pyaudio.paInt16 # 16K
CHANNELS = 1 # 单通道
RATE = 44100 # 采样率
RECORD_SECONDS = 5 # 录音时长(s)
WAVE_OUTPUT_FILENAME = name + '.wav'
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)
# ↑设置录制的格式、参数

print("* 开始录音,您有%d秒时间输入语音内容!"%RECORD_SECONDS)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print("* 录音结束")
stream.stop_stream()
stream.close()
p.terminate() # 释放PortAudio资源

# ↓生成wave文件
wf = wave.open("E:/pycharmcode/语音库/" + WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

# ↓转码
p_name_wav = "E:\\pycharmcode\\语音库\\" + name + '.wav'
p_name_pcm = "E:\\pycharmcode\\语音库\\" + name + '.pcm'
cmd ="ffmpeg -y  -i " + p_name_wav + " -acodec pcm_s16le -f s16le -ac 1 -ar 16000 " +  p_name_pcm

p = subprocess.Popen(cmd , shell = True)
p.wait()

# ↓语音识别
app_id     = "16536506"
api_key    = "xZ2Gof2ORP98FHGDxtNUqYZO"
secret_key = "*************************" # 大家将内容改为自己的秘钥

client = AipSpeech(app_id , api_key , secret_key)

# 读取文件
def get_file_content(filepath):
    with open(filepath , "rb") as fp:
        return fp.read()

# 识别本地文件
result = client.asr(get_file_content(p_name_pcm) ,
                    "pcm" ,
                    16000 ,
                    {"dev_pid" : 1536 ,})

result_list = list(result.values())
if result_list[1] != 'success.':
    print(result)
else:
    print(result_list[3])

运行结果如下所示:
语音识别结果图

2016-07-14 16:22:09 xiaokui_wingfly 阅读数 3397
  • C++语音识别开篇

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

    6113 人正在学习 去看看 杨波

voicewo 是一个专门用于在网页中实现语音识别转换的jQuery插件。开发人员可以用voicewo将用户的语音转换成文字,插入到指定的HTML表单里,无缝地与Java、.NET、PHP、ASP等多种编程语言集成。适合在聊天室、评论框、论坛、博客、电子邮件等互联网应用中使用。

这里写图片描述

主要特点:

  • 快速:体积小,加载速度快
  • 架构:采用Flash语音采集,云端API接口识别,页面Javascript文本处理
  • 风格:修改风格容易,只需修改CSS文件
  • 扩展:提供多组Javascript事件接口,扩展定制方便
  • 兼容:支持大部分主流浏览器,比如IE、Firefox、Safari、Chrome、Opera

快速示例

<!DOCTYPE html>
<html>
<head>
<title>Voicewo jQuery Plugin Demo</title>
<link rel="stylesheet" type="text/css" href="voicewo.css">
<script src="jquery-1.11.0.min.js" type="text/javascript"></script>
<script src="jquery.voicewo.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
   $('#btn').voicewo({
      'width'        : 92,
      'height'       : 25,
      'outputId'     : 'txt',
      'buttonImage'  : 'btn.png',
      'swf'          : 'voicewo.swf'
   });
})
</script>
</head>
<body>
   <textarea id="txt" cols="60" name="txt" rows="6"></textarea>
   <div id="btn"></div>
</body>
</html>

使用说明:

本插件架构是用Flash进行语音采集,提交到云端接口(目前接口采用科大讯飞)进行语音至文本转换,jQuery插件页面控制操作。

1、首先在科大讯飞-语音云开放平台(http://open.voicecloud.cn/)注册,获得appid;

2、下载本插件包并解压缩,用Adobe Flash Professional CS5.5 打开voicewo.fla与voicewo.as文件,编辑voicewo.as,将其中的private const domain:String = “www.youdomain.com”; 改为自己的网站域名,多个域名可以用分号隔开,该代码是防止别人恶意调用,调试时也可以用*代表所有域名访问。另外将其中的private const configs:String = “appid=53000000,timeout=2000″; appid换成自己申请到的数字。重新编译发布voicewo.swf文件;注:编辑flash时先要加载库,方法是打开CS5.5开发工具,单击【文件】->【ActionScript…】,点击库路径选项卡,添加库路径”./lib”,确定即可。

3、按照前面的代码示例调用,注意要先引入jquery脚本与插件脚本文件以及样式文件,即可在自己的web项目中使用;

4、应用部署完成后,在科大讯飞语音云平台中请求审核接口。

运行环境:

  1. 客户端需要有麦克风;
  2. 客户端浏览器需要支持flash插件;
  3. 客户端控制面板的flash设置需要授权浏览器用户使用麦克风。

查看原文

查看在线演示Demo和更多原文内容:
http://www.ibloger.net/article/1177.html

2018-08-08 15:26:48 qq_42749116 阅读数 3478
  • C++语音识别开篇

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

    6113 人正在学习 去看看 杨波

  我们的语音文件在很多的时候都会进行识别,因为语音在某些场合不适合听,我们就会转换成语音尽心,但是你在使用的语音识别软件可以识别完全的语音吗?识别出来的文字会和语音的内容相同吗?其实很多的语音识别软件都会都这种错误,识别不出来语音的面的某些字,今天给大家推荐一款在线进行语音识别的软件——迅捷PDF在线转换器,我们一起来操作一下吧。

  步骤一:打开浏览器,搜索迅捷PDF在线转换器,点击进入网站首页。

  

  步骤二:进入网站首页,在导航栏的位置找到语音识别,把鼠标移动到语音识别,会看到语音转文字。

  

  步骤三:进入转换页面,点击选择文件,选择需要进行识别的语音文件。

  

  步骤四:添加完文件以后,点击开始转换,需要识别的语音文件就会在识别的过程中,请耐心等待。

  步骤五:转换完成的文件可以直接进行下载,也会在导航栏上方的我的文件里进行保存。

  

  以上就是进行语音识别的软件,以及语音识别的步骤。

2018-06-29 12:05:24 YoungLittleT 阅读数 864
  • C++语音识别开篇

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

    6113 人正在学习 去看看 杨波
使用kaldi的在线识别,在timit语料库上进行英语在线语音识别
在/kaldi/egs/timit/online_demo目录下,运行命令
./run.sh --test-mode live
报错portaudio failed to open the defalut stream
1、检查linux系统录音功能是否可用:arecord -d 10 test.wav
检查后发现可以录音
2、检查portaudio是否安装成功
进入kaldi/tools目录 cd kaldi/tools
重新安装 ./install_portaduio.sh 
如果之前安装过一遍,一定要先进入tools/portaudio,然后make clean,否则没有用。有些时候一些依赖没有也会安装,但是程序不可用,可以进入kaldi/tools/portaudio,然后./configure,通常情况alsa显示no,通过sudo apt-get install libasound-dev可以解决
3、检查online-wav-gmm-decode-faster是否使用第二步编译出来的库,通过情况会因为之前编译过一遍,所以即使portaudio重新编译了,online-wav-gmm-decode-faster还是没有链接到新的库,可以使用ldd online-wav-gmm-decode-faster查看。
进入kaldi/src/online和kaldi/src/onlinebin,分别make clean ,make就完美解决
最终,可以将麦克风输入的语音识别为音素序列
2015-07-20 15:46:20 pkzgp987 阅读数 2713
  • C++语音识别开篇

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

    6113 人正在学习 去看看 杨波

由于最近项目需要语音识别,所以去接了一下语音识别的SDK。

分别接了讯飞的语音识别,和百度的。至于优缺点嘛,感觉讯飞的实时识别速度比较快,然后百度的是一次性上传,如果你一次识别的语音太多,就会识别比较慢,特别是在线识别。当然了百度的优点就是可以自己控制语音断点,讯飞的暂时还没有找到这个方法(有找到的麻烦告诉我)。

当然了,最后选择百度的原因在于,讯飞的审核,要求app小于50M。好吧!我的包没法变小了!

进入正题,接入的方法就不说了,按照官方的文档,肯定是可以接上的!

现在说说我遇到的几个坑,主要是IOS下面的

1.语音识别后应用的声音变小了

解决方法:在语音识别之后将Audiosession设置回来,百度语音识别的时候讲Audiosession设置为了录音状态,代码如下:

 //将声音模式调回正常状态
            AVAudioSession *audioSession = [AVAudioSession sharedInstance];
            NSError *err = nil;
            [audioSession setCategory :AVAudioSessionCategoryAmbient error:&err];
            if(err)
            {
                //        NSOSStatusErrorDomain
                NSLog(@"audioSession: %@  code = %d %@", [err domain], [err code], [[err userInfo] description]);
                return;
            }

2.在IOS8之后,使用语音识别之后,整个应用静音。

解决方法:在百度语音中有这样一个接口:

//- - - - - - - - - - - - - - - -功能设置- - - - - - - - - - - - - - - - - - - -
// 定制功能
// 定制语义解析功能请传入key=BDVR_CONFIG_KEY_NEED_NLU,如果开启此功能,将返回带语义的json串,含义详见开发文档说明
#define BDVR_CONFIG_KEY_NEED_NLU @"nlu"
// 定制通讯录识别功能请传入key=BDVR_CONFIG_KEY_ENABLE_CONTACTS,如果开启此功能,将优先返回通讯录识别结果
#define BDVR_CONFIG_KEY_ENABLE_CONTACTS @"enable_contacts"
// 定制SDK是否对AudioSession进行操作,如果外部需要操作AudioSession,应当通过此接口禁止SDK对AudioSession进行操作
#define BDVR_CONFIG_KEY_DISABLE_AUDIO_SESSION_CONTROL @"disable_audio_session_control"
- (void)setConfig:(NSString *)key withFlag:(BOOL)flag;
我们使用最后一个,然后自己控制Audiosession,这样就可以解决这个问题。代码如下:

// 定制SDK是否对AudioSession进行操作,如果外部需要操作AudioSession,应当通过此接口禁止SDK对AudioSession进行操作
    [[BDVoiceRecognitionClient sharedInstance] setConfig:BDVR_CONFIG_KEY_DISABLE_AUDIO_SESSION_CONTROL withFlag:true];

然后,其中还碰到了一些其他的问题,不过都是小事,相信大家都能搞定,这里就不再详细的说了。


Android 百度在线语音识别

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