阿里云语音转文本

一、安装ffmpeg

跟随ffmpeg教程完成安装和配置环境变量

二、使用ffmpeg批处理录音

因为阿里云语音转文字模型只支持16k或8k的采样率,因此需要对录音进行重采样

  • 使用如下代码创建bat文件,处理录音
@echo off
title 正在转换
if not exist wav mkdir wav
for /f %%i in ('dir /b *.m4a') do ffmpeg -i %%i -acodec pcm_s16le -ac 1 -ar 16000 wav\%%~ni.wav -y
pause

此文件放在自己的音频文件夹中,会自动识别后缀为m4a的文件,将其转换为采样率为16k的wav文件保存在同级目录中

三、安装所需的python库

使用如下代码安装阿里云配套库

pip install aliyun-python-sdk-core==2.13.3

同时还需要的库有jsontime,不过都是自带库无需安装

四、将音频文件上传至OSS

下载阿里云推荐的oss界面化软件,使用自己的阿里云AccessKey登录

  • 下图为获取自己的AccessKey

阿里 开源 mysql 阿里 开源 语音转文本_阿里 开源 mysql

  • 下图为OSS界面化软件创建Bucket

阿里 开源 mysql 阿里 开源 语音转文本_采样率_02

  • 再在Bucket里上传转采样率之后的音频即可

五、开通阿里云语音转文字服务

阿里 开源 mysql 阿里 开源 语音转文本_python_03


获得appkey

六、python 语音转文字

  • 通过如下代码转文字
# -*- coding: utf8 -*-
import json
import time
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest


def fileTrans(akId, akSecret, appKey, fileLink):
    # 地域ID,固定值。
    REGION_ID = "cn-shanghai"
    PRODUCT = "nls-filetrans"
    DOMAIN = "filetrans.cn-shanghai.aliyuncs.com"
    API_VERSION = "2018-08-17"
    POST_REQUEST_ACTION = "SubmitTask"
    GET_REQUEST_ACTION = "GetTaskResult"
    # 请求参数
    KEY_APP_KEY = "appkey"
    KEY_FILE_LINK = "file_link"
    KEY_VERSION = "version"
    KEY_ENABLE_WORDS = "enable_words"
    # 是否开启智能分轨
    KEY_AUTO_SPLIT = "auto_split"
    # 响应参数
    KEY_TASK = "Task"
    KEY_TASK_ID = "TaskId"
    KEY_STATUS_TEXT = "StatusText"
    KEY_RESULT = "Result"
    # 状态值
    STATUS_SUCCESS = "SUCCESS"
    STATUS_RUNNING = "RUNNING"
    STATUS_QUEUEING = "QUEUEING"
    # 创建AcsClient实例
    client = AcsClient(akId, akSecret, REGION_ID)
    # 提交录音文件识别请求
    postRequest = CommonRequest()
    postRequest.set_domain(DOMAIN)
    postRequest.set_version(API_VERSION)
    postRequest.set_product(PRODUCT)
    postRequest.set_action_name(POST_REQUEST_ACTION)
    postRequest.set_method('POST')
    # 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置。
    # 设置是否输出词信息,默认为false,开启时需要设置version为4.0。
    task = {KEY_APP_KEY: appKey, KEY_FILE_LINK: fileLink, KEY_VERSION: "4.0", KEY_ENABLE_WORDS: False}
    # 开启智能分轨,如果开启智能分轨,task中设置KEY_AUTO_SPLIT为True。
    # task = {KEY_APP_KEY : appKey, KEY_FILE_LINK : fileLink, KEY_VERSION : "4.0", KEY_ENABLE_WORDS : False, KEY_AUTO_SPLIT : True}
    task = json.dumps(task)
    print(task)
    postRequest.add_body_params(KEY_TASK, task)
    taskId = ""
    try:
        postResponse = client.do_action_with_exception(postRequest)
        postResponse = json.loads(postResponse)
        print(postResponse)
        statusText = postResponse[KEY_STATUS_TEXT]
        if statusText == STATUS_SUCCESS:
            print("录音文件识别请求成功响应!")
            taskId = postResponse[KEY_TASK_ID]
        else:
            print("录音文件识别请求失败!")
            return
    except ServerException as e:
        print(e)
    except ClientException as e:
        print(e)
    # 创建CommonRequest,设置任务ID。
    getRequest = CommonRequest()
    getRequest.set_domain(DOMAIN)
    getRequest.set_version(API_VERSION)
    getRequest.set_product(PRODUCT)
    getRequest.set_action_name(GET_REQUEST_ACTION)
    getRequest.set_method('GET')
    getRequest.add_query_param(KEY_TASK_ID, taskId)
    # 提交录音文件识别结果查询请求
    # 以轮询的方式进行识别结果的查询,直到服务端返回的状态描述符为"SUCCESS"、"SUCCESS_WITH_NO_VALID_FRAGMENT",
    # 或者为错误描述,则结束轮询。
    statusText = ""
    while True:
        try:
            getResponse = client.do_action_with_exception(getRequest)
            getResponse = json.loads(getResponse)
            print(getResponse)
            statusText = getResponse[KEY_STATUS_TEXT]
            if statusText == STATUS_RUNNING or statusText == STATUS_QUEUEING:
                # 继续轮询
                time.sleep(10)
            else:
                # 退出轮询
                break
        except ServerException as e:
            print(e)
        except ClientException as e:
            print(e)
    if statusText == STATUS_SUCCESS:
        print("录音文件识别成功!")
    else:
        print("录音文件识别失败!")
    return getResponse['Result']['Sentences']


accessKeyId = "你的accessKey"
accessKeySecret = "你的accessKeySecret"
appKey = "你的appKey"
fileLink = "你的文件地址"
# 执行录音文件识别
r=fileTrans(accessKeyId, accessKeySecret, appKey, fileLink)
print(r)
temp=[]
for sentence in r:
    temp.append(sentence["Text"])
e=''.join(temp)
filename="要保存的文件名"
with open(filename,'w', encoding='utf-8') as f:
    f.write(e)

对这四个部分进行修改即可

accessKeyId = "你的accessKey"
accessKeySecret = "你的accessKeySecret"
appKey = "你的appKey"
filename="要保存的文件名"