调用百度SDK进行长语音识别

背景

项目中需要用到语音识别技术,之前百度的语音识别SDK只支持时长小于1分钟的语音,所以对于十几分钟的电影,笔者需要自己先进行断句,然后一句句送入百度SDK,这样既麻烦,而且句与句之间的连贯性不够好,经常会造成一些啼笑皆非的识别。

长语音识别

2018年1月,百度开放了长语音识别SDK,可以进行自动断句,目测是根据短时能量法(即停顿时间)完成的,对识别后的语句还会自动修改,应该引入了语言模型进行修正。笔者今天上午又进行了一番尝试,至于识别效果嘛,是比以前好一些,但依然不敢恭维,以下:
首先采用ffmpeg模块,将视频转化为wav音频文件;接着将文件转码为采样率16K或8K的PCM无损格式

1
2
ffmpeg -i $audiopath -f wav -vn ${audiobasename}".wav" # 提取视频中的音频文件
ffmpeg -y -i $audiobasename".wav" -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k-0.pcm # wav音频文件转PCM

接着去百度Ai开放平台,下载对应平台的SDK。解压后直接cd到sample/asr目录下, 运行build.sh(实际执行的是/src/main.cpp),便可以识别样例中的一个PCM文件。
 
若要识别你自己的音频文件,需要首先接入百度AI服务,由于Access Token的有效期为30天,我们把鉴权请求机制写入build.sh中,这样每次调用SDK都会首先先执行鉴权。

1
2
3
4
#!/bin/bash
curl -i -k 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=xxxx&client_secret=xxxx'
# 'xxxx'的部分填入你在百度自己申请的id和key
make && echo && echo "build success, wait 3s to run" && sleep 3 && ./main

之后修改main.cpp中的asr_set_config_paramsasr_set_start_params两个参数,具体如下:

1
2
3
const std::string app_id = "xxxxx"; 填入你申请的ID
const std::string chunk_key = "xxxxxxx";
const std::string secret_key = "xxxxxxxx";

1
2
3
// 设置启动参数
void asr_set_start_params(bds::BDSSDKMessage& start_params) {
const std::string app = "xxxxx"; # 填入你申请的任务名称

将之前转好的音频文件,命名为16k-0.pcm,放置于/asr/pcm路径下,重新执行build.sh,便可以在Terminal生成识别后的音频文件!
PS: 建议的环境是GCC、G++ 4.8.5,笔者在GCC 5.4.0也进行了测试,无法正确运行。

Textrank

Textrank是传统抽取文章摘要的方式,算法思想借鉴了网页排序的pagerank技术,这里我们采用Github中已开源的TextRank4ZH模块,安装及调用文档都比较详细,此处不再赘述。

Ref:

https://www.baidu.com/s?ie=UTF-8&wd=textrank4zh
http://ai.baidu.com/tech/speech/lsr