前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用云函数实现语音识别案例

使用云函数实现语音识别案例

原创
作者头像
haimingli
修改2021-01-04 20:38:43
1.1K0
修改2021-01-04 20:38:43
举报

背景

语音识别,也被称为自动语音识别 Automatic Speech Recognition,(ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。与说话人识别及说话人确认不同,后者尝试识别或确认发出语音的说话人而非其中所包含的词汇内容。该技术已经广泛应用于我们平时的生活中,例如:

  • 语音输入法:智能语音输入,由实时语音识别实现,为用户节省输入时间、提升输入体验。
  • 语音消息转写:将用户的语音信息转成文字信息,由一句话识别服务实现,提升用户阅读效率。
  • 字幕生成:将直播和录播视频中的语音转换为文字,由录音文件识别服务实现,轻松便捷地生成字幕文件。
  • 会议纪要:将会议、庭审、采访等场景的音频信息转换为文字,由实时语音识别服务实现,降低人工记录成本、提升效率。
  • 电话质检:将坐席通话转成文字,由实语音识别服务或录音文件识别服务实现,全面覆盖质检内容、提升质检效率。

方案设计

可以使用腾讯云函数实现语音识别。主要分为三步:

1.创建生成请求任务的函数,使用 COS 触发器,设置第二步中生成的回调 URL,生成录音文件识别任务。

云函数代码:

代码语言:txt
复制
# -*- coding: utf8 -*-
from qcloud_cos_v5 import CosS3Client
from qcloud_cos_v5 import CosServiceError
from qcloud_cos_v5 import CosClientError
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 
import base64
import os
import sys
import logging
import requests
import time
import hmac
import base64
import urllib
import json
import sys
import binascii
import hashlib
import random
import threading
from urllib.parse import urlencode

logging.basicConfig(level=logging.INFO, stream=sys.stdout)


region = u'ap-shanghai'  # 请替换为您 Bucket 所在的地域,需要与云函数地区一致
callback_url = 'xxxxx' # 请替换为您在创建接受回调的 API 网关触发器的回调 URL
logger = logging.getLogger()


def create_task(audio_url):
    secretId = os.environ.get('TENCENTCLOUD_SECRETID') #无需填写,云函数会自动帮您申请和管理临时密钥
    secretKey = os.environ.get('TENCENTCLOUD_SECRETKEY') #无需填写,云函数会自动帮您申请和管理临时密钥
    token = os.environ.get('TENCENTCLOUD_SESSIONTOKEN') #无需填写,云函数会自动帮您申请和管理临时密钥

    cred = credential.Credential(secretId, secretKey, token)
    httpProfile = HttpProfile()
    httpProfile.endpoint = "asr.tencentcloudapi.com"
    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile
    clientProfile.signMethod = "TC3-HMAC-SHA256"  
    client = asr_client.AsrClient(cred, region, clientProfile) 
    req = models.CreateRecTaskRequest()
    params = {"EngineModelType":"16k_zh","ChannelNum":1,"ResTextFormat":0,"SourceType":0,"Url":audio_url,"CallbackUrl":callback_url}
    req._deserialize(params)
    resp = client.CreateRecTask(req) 
    taskid = resp. Data.TaskId
    return taskid

def main_handler(event, context):
    logger.info("start main handler")
    for record in event['Records']:
        try:
            bucket = record['cos']['cosBucket']['name'] + '-' + record['cos']['cosBucket']['appid']
            key = record['cos']['cosObject']['key']
            key = key.replace('/' + record['cos']['cosBucket']['appid'] + '/' + record['cos']['cosBucket']['name'] + '/', '', 1)
            logger.info("Key is " + key)

            audio_url = record['cos']['cosObject']['url']
            logger.info("audio_url is [%s]" % audio_url)
            taskId = create_task(audio_url)
            logger.info("taskId [%s] Success" % taskId)

        except Exception as e:
            print(e)
            print('Error getting object {} from bucket {}. '.format(key, bucket))
            raise e
            return "Fail"

    return "Success"

2.创建接收回调结果的函数,使用 API 网关触发器,生成回调 URL,用于将录音文件识别结果写回 COS 。

云函数代码:

代码语言:txt
复制
# -*- coding: utf-8 -*-
import sys
import logging
import os
import datetime
import json
import urllib
from qcloud_cos_v5 import CosConfig
from qcloud_cos_v5 import CosS3Client
from qcloud_cos_v5 import CosServiceError
from qcloud_cos_v5 import CosClientError


logging.basicConfig(level=logging.INFO, stream=sys.stdout)
logger = logging.getLogger()


def dataTranslate(body):
    body = body.split('&')
    data = {}
    for dataStr in body:
        keyValue = dataStr.split('=')
        data[keyValue[0]] = urllib.parse.unquote(keyValue[1])
    logger.info(data)
    return data



def main_handler(event, context):
    secretId = os.environ.get('TENCENTCLOUD_SECRETID')
    secretKey = os.environ.get('TENCENTCLOUD_SECRETKEY')
    token = os.environ.get('TENCENTCLOUD_SESSIONTOKEN')
    region = 'ap-shanghai'  # 请替换为您创建的 cos 的 Bucket 所在的地域
    result_bucket = 'asr-scf-result-xxxxx' # 请替换为您用于存放识别结果的 Bucket 名称

    config = CosConfig(Region=region, SecretId=secretId, SecretKey=secretKey, Token=token) # 获取配置对象
    client = CosS3Client(config)

    logger.info("start main handler")
    res = event['body']
    r = res.replace('+', '%20')
    data = dataTranslate(r)
    nowTime = str(datetime.datetime.now())
    upload_path = '/tmp/result-{}.json'.format(data['requestId'])
    file = open(upload_path,'w',encoding='utf-8')
    file.write(json.dumps(data, ensure_ascii=False))
    file.close()
    key = '{}.json'.format(data['requestId'])
    if data['code']!= "0": 
        key = '{}_failed.json'.format(data['requestId'])
    res = client.put_object_from_local_file(
    Bucket= result_bucket,
    LocalFilePath= upload_path,
    Key= key
    )
    response = {"code":0, "message":"success"}

    return response

3.所有配置完成后,您可以在 COS 中上传音频文件,进行测试和使用,并通过云函数里的运行日志查看任务状态。

至此,主要代码逻辑已经完成,可以在 COS 中上传音频文件,进行测试和使用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 方案设计
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档