语音识别是一项比较复杂的技术,在单机上很难实现高效的识别的功能,但是借助云平台,实现起来就简单得多了。
下面采用腾讯的语音识别平台,用法如下:
按照官方文档上说:
- 语音 URL 的音频时长不能长于5小时,文件大小不超过512MB
- 本地语音文件不能大于5MB
- 录音文件识别免费额度为每月10小时
不知道URL的方式限制到底是不是512MB,但是本地文件确实有5MB的限制。
语音识别分为两部分,首先是发送请求,把文件提交到服务器,如果没有错误,就会返回一个taskId。然后过几分钟(因为识别语音需要一定的时间),再通过这个taskId获取识别内容。
值得注意的是,腾讯提供了在线调试的功能,如下:
如果识别成功,就会返回一个TaskId,通过这个TaskId,获取返回的结果,但是结果是一个json格式的数据,样式大概如下:
也可以把里面的时间去掉,代码如下:
# -*- coding: utf-8 -*-
import json
import re
with open('asr.json', 'r', encoding='utf-8') as f:
asr_json = json.load(f)
result = asr_json["Data"]["Result"]
print(result)
txt = re.sub('\[.*\]', "", result)#去掉时间前缀
print(txt)
txt = re.sub('\s+', "", txt)#去掉换行、空格字符
print(txt)
上面的asr.json文件就是从控制台复制出来保存的文件名。
最近(2021.2.6)发现,还有一个有点意思的参数,那就是:
即说话人分离,这个其实很重要的,一般来说,语音识别都要把说话人分离出来。完整代码如下:
# -*- coding: utf-8 -*-
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.asr.v20190614 import asr_client, models
try:
cred = credential.Credential("SecretId", "SecretKey")
httpProfile = HttpProfile()
httpProfile.endpoint = "asr.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = asr_client.AsrClient(cred, "", clientProfile)
req = models.CreateRecTaskRequest()
params = {
"ChannelNum": 1,
"ResTextFormat": 0,
"SourceType": 0,
"SpeakerNumber": 0,#设置为0相对好点,设成其他数据会比较乱
"Url": "https://qiu-1304848882.cos.ap-chengdu.myqcloud.com/%E6%B0%B4%201.3.mp3",
"EngineModelType": "16k_zh",
"SpeakerDiarization": 1
}
req.from_json_string(json.dumps(params))
resp = client.CreateRecTask(req)
print(resp.to_json_string())
except TencentCloudSDKException as err:
print(err)
获取的内容大概有如下不同:
可以看出,除了有前面的时间戳以外,后面还多了0或1这个标志。也就是说0是一个人说的,1是另外一个人说的。但是这个功能目前处理beta版,很不成熟,实际作用很有限。
如果上面的json数据,去掉前面的时间戳,只保留说话人的信息,并且相同说话人,就把内容给合并起来,大概可以这样:
# -*- coding: utf-8 -*-
import json
import re
with open('asr.json', 'r', encoding='utf-8') as f:
asr_json = json.load(f)
result = asr_json["Data"]["Result"]
with open('水0.txt', 'w', encoding='utf-8') as fi:
fi.write(result)
file = open('水0.txt', 'r', encoding='utf-8')
speaker_content =""
speaker_old = 0
for line in file.readlines():
list = line.split()
time_speaker = re.sub("[\[\]]","",list[0])#去掉中括号[]
speaker = re.split(",",time_speaker)[2]
content = list[1]
if speaker == speaker_old:
speaker_content += content
else:
speaker_content += "\n"+speaker+":"+content
speaker_old = speaker
with open('水.txt', 'w', encoding='utf-8') as f:
f.write(speaker_content)
上面代码的作用就是忽略时间,把相同说话人的内容合并起来。
上面的代码从技术上是可行的,但是实际操作却很有难度。主要问题出在本地5M的限制上,使用URL虽然是限制512M,但把文件传到哪里,访问速度太慢怎么办?
本人思考了很久,没找到答案。于是用在线客服提问,居然还有云技术顾问这个东西,瞬间感觉自己太落伍了,大概解决方法如下:
1、登录cos控制台创建存储桶;
2、上传您的本地语音文件
3、点击您上传的本地文件详情,即可显示对象地址;
4、登录语音识别控制台,将得到的对象地址填入URL地址栏中;
5、开始识别完成后,点击下载结果即可。
需要注意的是cos是收费的,但是很便宜。
(2021.2.3更新)
腾讯还提供了热词和自学模型功能:https://cloud.tencent.com/document/product/1093/40996
这其实是个非常好的东西。
热词主要是针对一些特有的人名、产品名、公司名或者某个领域的专有词汇。
自学习模型是通过以往的真实数据,让机器来学习语言风格,最后再来识别语音内容。
很明显要想提高识别率,必定会涉及到一些专有名词及语言风格等,那么热词和自学习模型功能将会起到很大的作用。