背景
项目中需要用到语音识别技术,之前百度的语音识别SDK只支持时长小于1分钟的语音,所以对于十几分钟的电影,笔者需要自己先进行断句,然后一句句送入百度SDK,这样既麻烦,而且句与句之间的连贯性不够好,经常会造成一些啼笑皆非的识别。
长语音识别
2018年1月,百度开放了长语音识别SDK,可以进行自动断句,目测是根据短时能量法(即停顿时间)完成的,对识别后的语句还会自动修改,应该引入了语言模型进行修正。笔者今天上午又进行了一番尝试,至于识别效果嘛,是比以前好一些,但依然不敢恭维,以下:
首先采用ffmpeg
模块,将视频转化为wav音频文件;接着将文件转码为采样率16K或8K的PCM
无损格式1
2ffmpeg -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_params
、asr_set_start_params
两个参数,具体如下:1
2
3const std::string app_id = "xxxxx"; 填入你申请的ID
const std::string chunk_key = "xxxxxxx";
const std::string secret_key = "xxxxxxxx";
1 | // 设置启动参数 |
将之前转好的音频文件,命名为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