python与腾讯语音识别

语音识别是一项比较复杂的技术,在单机上很难实现高效的识别的功能,但是借助云平台,实现起来就简单得多了。

下面采用腾讯的语音识别平台,用法如下:

Python SDK 语音识别

按照官方文档上说:

  • 语音 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控制台创建存储桶; 
image.png
image.png
2、上传您的本地语音文件 
image.png
3、点击您上传的本地文件详情,即可显示对象地址; 
image.png
4、登录语音识别控制台,将得到的对象地址填入URL地址栏中; 
image.png
5、开始识别完成后,点击下载结果即可。 

需要注意的是cos是收费的,但是很便宜。

 

(2021.2.3更新)

腾讯还提供了热词和自学模型功能:https://cloud.tencent.com/document/product/1093/40996

这其实是个非常好的东西。

热词主要是针对一些特有的人名、产品名、公司名或者某个领域的专有词汇。

自学习模型是通过以往的真实数据,让机器来学习语言风格,最后再来识别语音内容。

很明显要想提高识别率,必定会涉及到一些专有名词及语言风格等,那么热词和自学习模型功能将会起到很大的作用。

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值