文档中心 语音识别 云函数接入文档 使用云函数方式的录音文件识别

使用云函数方式的录音文件识别

最近更新时间:2020-02-24 09:17:18

概述

对于将音频文件存储在腾讯云 COS 上的用户,使用云函数方式的录音文件识别是一种比 API 和 SDK 更加便捷的接入方式,可以明显减少前期的接入开发工作。该方式可以通过云函数的方式,将录音文件识别请求通过触发器函数自动执行,将识别结果通过触发器函数自动保存回COS或者其他存储器上,用户只需关注最终的识别结果。云函数的详细介绍,请阅读 云函数文档

接入效果

说明:

文档中使用的音频文件test.wav存放目录为filetrans-raw-1253327908 ,识别结果存放目录为filetrans-result-1253327908 ,识别结果保存在json文件中,以requestId.json表示识别成功的结果,requestId_failed.json表示识别失败的结果。用户在实际使用中,请根据实际情况,修改为自己的 COS 存储桶 Bucket 和文件存放目录。

  • 通过 COS 控制台上传待识别的音频文件到指定的 Bucket 路径 filetrans-raw-1253327908
    img
  • 对应的云函数(将在后面详细介绍创建过程,所选地区应与 COS 存储桶所属地域一致):
    img
  • 识别结果存放路径filetrans-result-1253327908
    img
  • 上传的test.wav音频文件识别结果为:
{
    "audioTime": "2.350000", 
    "code": "0", 
    "projectid": "0", 
    "appid": "1253327908", 
    "requestId": "585035910", 
    "text": "[0:0.000,0:2.260,0]  腾讯云语音识别欢迎您", 
    "audioUrl": "http://test-1253327908.cos.ap-guangzhou.myqcloud.com/test.wav", 
    "message": "成功"
}

准备工作

需要准备的内容有:

实现方式

  1. 创建生成请求任务的函数,使用 COS 触发器,设置第二步中生成的回调 URL,生成录音文件识别任务。
  2. 创建接收回调结果的函数,使用 API 网关触发器,生成回调 URL,用于将录音文件识别结果写回 COS 。
  3. 所有配置完成后,您可以在 COS 中上传音频文件,进行测试和使用,并通过云函数里的运行日志查看任务状态。

生成请求任务

当 COS 上传音频文件时, COS 触发器将会被触发,调用触发器函数,提交录音文件识别请求。主要包括:新建请求任务函数配置 COS 触发器

新建请求任务函数

注意:

在创建云函数时选择的地区需要与 COS 存储桶的所属地域一致。

云函数控制台 创建一个云函数,用于生成请求任务:

  • 函数名称:file_trans
  • 运行环境:Python3.6
  • 创建方式:空白函数
  • 运行角色:自定义角色(需要授予 ASR 权限)
  • 执行方法:index.main_handler
  • 提交方法:本地上传 zip 包

自定义 ASR 角色

1.新建函数并进行基础信息配置。

2.在进行函数配置前,请先点击 “新建角色” 创建自定义角色

2.1 首先选择“云函数”角色载体信息。

2.2 然后找到 QcloudASRFullAccess 策略,并勾选。

2.3 进行角色名称定义和角色描述,完成运行角色创建。

3.返回函数配置,刷新运行角色,并选择刚才新建自定义角色,提交方法选择 “本地上传 zip 包”。

4.打包代码

首先在本地安装并打包 Python 环境,请参考:Python SDK 安装及相关环境说明
然后在本地新建 index.py ,内容如下(需修改存储桶 Bucket 的地区和回调 URL,回调 URL 需要在 配置 API 网关触发器 后获取):

# -*- 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)
secretId = os.environ.get('TENCENTCLOUD_SECRETID') #无需填写,云函数会自动帮您申请和管理临时密钥
secretKey = os.environ.get('TENCENTCLOUD_SECRETKEY') #无需填写,云函数会自动帮您申请和管理临时密钥
token = os.environ.get('TENCENTCLOUD_SESSIONTOKEN') #无需填写,云函数会自动帮您申请和管理临时密钥
region = u'ap-guangzhou'  # 请替换为您 Bucket 所在的地域,需要与云函数地区一致
callback_url = 'xxxxx' # 请替换为您在创建接受回调的 API 网关触发器的回调 URL
logger = logging.getLogger()

def create_task(audio_url):
    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_0","ChannelNum":1,"ResTextFormat":0,"SourceType":0,"Url":audio_url,"CallbackUrl":callback_url}
    req._deserialize(params)
    resp = client.CreateRecTask(req) 
    taskid = resp["Response"]["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"

上述代码依赖腾讯云 SDK,安装方法如下:

pip install tencentcloud-sdk-python -t .
说明:

由于我们需要把腾讯云 SDK 跟随函数代码打包上传,所以需要把 SDK 安装到当前路径。
注意打包时需要保证 index.py 在根路径下。

zip code.zip * -r 

完成后上传至云函数即可。

配置 COS 触发器

说明:

触发事件类型选择全部触发即可。

  • 触发方式:COS 触发;
  • 事件类型:全部创建;
  • 前缀过滤:filetrans-raw-1253327908/ (根据用户实际情况填写);
  • 后缀过滤:.wav (根据用户实际情况填写);

创建结果:

img

创建成功后,可以在云函数控制台对应函数的触发方式处看到此触发器。

接收回调结果

录音文件识别服务识别完成后,将识别结果通过 API 网关触发器,写回 COS 的 Bucket 中。在创建 API 网关触发器的时候可以获得回调 URL,请在生成请求任务函数中设置回调 URL。主要包括:新建接收回调函数配置 API 网关触发器

新建接收回调函数

在创建的服务下,创建一个函数,用于将识别结果写回 COS:

  • 函数名称:put_result_to_cos
  • 运行环境:Python3.6
  • 创建方式:空白函数
  • 运行角色:QCS_SCFExcuteRole
  • 执行方法:index.main_handler
  • 提交方法:在线编辑

把接收回调函数复制到对应的函数在线编辑框,接收回调函数内容如下:

# -*- 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)
secretId = os.environ.get('TENCENTCLOUD_SECRETID')
secretKey = os.environ.get('TENCENTCLOUD_SECRETKEY')
token = os.environ.get('TENCENTCLOUD_SESSIONTOKEN')
region = u'ap-guangzhou'  # 请替换为您 Bucket 所在的地域
result_bucket = 'xxxxx'         # 请替换为您用于存放识别结果的 Bucket 名称

config = CosConfig(secretId, secretKey, region, token)
client = CosS3Client(config)
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):
    logger.info("start main handler")
    res = event['body']
    data = dataTranslate(res)
    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

配置 API 网关触发器

注意:

API 网关触发器不支持选择的地区:成都、孟买、硅谷。

新建 API 网关触发器:

  • 触发方式:API 网关触发器
  • API服务类型:新建 API 服务
  • 请求方法:ANY
  • 发布环境:发布
  • 鉴权方法:免鉴权

创建成功后,会自动生成路径,作为回调 URL,请将其设置到生成请求任务函数的回调 URL 中,即下图中的访问路径。

img

至此,所有配置已经全部完成,您可以在 COS 中上传音频文件,进行测试和使用。