阿里云语音转文本
一、安装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
同时还需要的库有json
和time
,不过都是自带库无需安装
四、将音频文件上传至OSS
下载阿里云推荐的oss界面化软件,使用自己的阿里云AccessKey登录
- 下图为获取自己的AccessKey
- 下图为OSS界面化软件创建Bucket
- 再在Bucket里上传转采样率之后的音频即可
五、开通阿里云语音转文字服务
获得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="要保存的文件名"