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

背景

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

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

方案设计

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

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

云函数代码:

# -*- 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 。

云函数代码:

# -*- 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 中上传音频文件,进行测试和使用。

你可能感兴趣的:(serverless案例)