1. 简介
阿里云智能语音服务(ASR)提供了高音质语音转文本服务,支持多种场景的音频转写,比如会议记录、语音留言、客服对话等。该服务支持多种音频格式,包括wav、mp3、pcm等。本篇文章将介绍如何使用python连接阿里云接口实现实时音频转写功能。
2. 准备工作
2.1 阿里云账号及AccessKey
如需使用阿里云的语音转写服务,必须要有阿里云的账号及AccessKey。如果没有阿里云账号,可以前往阿里云官网注册。如果已经有阿里云账号,可以在控制台获取AccessKey。
注意: AccessKey极其重要,一定要妥善保管,并且不要泄露给他人。
2.2 Python SDK
阿里云提供了Python的SDK,可以方便地使用阿里云的各种服务。使用Python SDK前需要安装SDK并配置一些参数。
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-asr
3. 连接阿里云接口
使用Python SDK连接阿里云API,需要进行一些参数配置。首先是需要将AccessKey加密储存,便于安全使用。
from aliyunsdkcore.client import AcsClient
import aliyunsdkcore.profile
import base64
import hmac
import hashlib
import json
import datetime
import requests
class Asr:
def __init__(self, region_id, access_key_id, access_key_secret):
self.ACCESS_KEY_ID = access_key_id
self.ACCESS_KEY_SECRET = access_key_secret
self.region_id = region_id
self.client = AcsClient(access_key_id=self.ACCESS_KEY_ID, access_key_secret=self.ACCESS_KEY_SECRET,
region_id=self.region_id)
asr_region = 'cn-shanghai'
self.endpoint = 'https://'+asr_region+'.aliyuncs.com'
解析:
region_id: 服务所在区域。具体信息可参考阿里云API文档。
access_key_id: 加密的AccessKey ID
access_key_secret: 加密的AccessKey Secret
client = AcsClient: 创建AcsClient对象,使用加密后的AccessKey来身份验证。之后,可以使用该对象访问阿里云服务提供商的API接口。
asr_region: 语音识别服务所在的区域
endpoint: 语音识别API的访问地址。AccessKey和密钥必须储存在该地址上。
4. 接口调用
4.1 调用API
接下来,我们来实现调用阿里云语音识别API接口。
class Asr:
def __init__(self,region_id,access_key_id,access_key_secret):
...
def asr_raw(self,data,sample_rate):
if data=='':
return ''
result = ''
url = self.endpoint
appkey = self.ACCESS_KEY_ID
if url == '' or appkey == '':
return 'No api url or appkey'
now = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
body = {
"Data": base64.b64encode(data).decode('utf-8'),
"EncodeType": "raw",
"SampleRate": sample_rate,
"Version": "2019-02-28",
"EnablePunctuationPrediction": True,
"EnableInverseTextNormalization": True
}
body_json = json.dumps(body)
headers = {
'accept': 'application/json',
'content-type': 'application/json',
'date': now,
'authorization': ''
}
sign_content = 'POST' + '\n' + headers.get('accept') + '\n' + headers.get(
'content-md5') + '\n' + headers.get('content-type') + '\n' + headers.get(
'date') + '\n' + '/cloud-connect/voice/asr/decode_audio'
signature = hmac.new(str.encode(self.ACCESS_KEY_SECRET), str.encode(sign_content), hashlib.sha1).digest()
sign = base64.b64encode(signature).decode()
auth_header = 'Dataplus ' + appkey + ':' + sign
headers['authorization'] = auth_header
try:
response = requests.post(url, data=body_json, headers=headers)
except Exception as e:
return '{0}'.format(e)
if response.status_code == 200:
result = response.json().get('Result')
return result
解析:
headers: API调用的头部信息,其中包括API访问的日期及签名等信息。
now: API访问的请求时间。
body: API访问的请求体,其中包括数据Data、样本率SampleRate等参数。
sign_content: 计算签名时使用的内容。签名内容主要包含了访问日期、请求体、API地址等信息。
signature: 通过ACCESS_KEY_SECRET加密计算出的签名。
auth_header: 通过ACCESS_KEY_ID和signature计算出的认证头部。
4.2 实现音频转写
现在,我们已经完成了阿里云API的连接和调用。接下来,我们要实现音频转写功能。我们使用麦克风进行录音,在录音过程中实时将录音数据发送给云API,以实现实时音频转写功能。
class Microphone:
def __init__(self, chunk=2048):
self.chunk = chunk
self.format = pyaudio.paInt16
self.channels = 1
self.rate = 16000
self.frames = []
def read(self):
with self.stream:
while self.isrecording:
data = self.stream.read(self.chunk)
self.frames.append(data)
def startrecording(self):
self.p = pyaudio.PyAudio()
self.stream = self.p.open(format=self.format,
channels=self.channels,
rate=self.rate,
input=True,
frames_per_buffer=self.chunk)
self.isrecording = True
self.thread = threading.Thread(target=self.read)
self.thread.start()
def stoprecording(self):
self.isrecording = False
self.thread.join()
self.stream.stop_stream()
self.stream.close()
self.p.terminate()
解析:
Microphone: 麦克风录音类。
chunk: 录音默认采样的大小。
format: 音频流的格式。
channels: 声道数。
rate: 音频流的采样率。
frames: 存储音频流数据的数组。
read: 麦克风录音方法,录音时将数据打包存入数组中。
startrecording/stoprecording: 开/关麦克风录音。
使用前述工具和类,我们可以获得实时音频流数据,将其直接发送到阿里云API中,获取实时音频转写结果。
def main():
region_id = 'cn-shanghai'
access_key_id = 'xxxxxxxxxxxxxxxxxxxx'
access_key_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
audio = Microphone()
asr = Asr(region_id, access_key_id, access_key_secret)
audio.startrecording()
while True:
time.sleep(1)
if not audio.isrecording:
break
data = b''.join(audio.frames[-3:])
if len(data) == 0:
continue
result = asr.asr_raw(data,drate)
if result and len(result) > 0:
print(result)
audio.stoprecording()
if __name__ == '__main__':
main()
解析:
main: 主函数。
audio: 定义死循环,一直读取麦克风数据流。
asr: 连接阿里云API,使用前文的asr_raw方法实现音频转写。
结论
至此,我们已经完成了使用Python连接阿里云接口,实现实时音频转写功能的全过程。对于开发者而言,这个功能在实际的项目开发中有着广泛的应用。实时音频转写功能能够让用户使用录音设备实时将识别结果反馈回客户端,从而实现对音频数据的在线处理。