python调用讯飞语音听写(流式版)
目录
- 一、引入所需要的包
- 二、定义相关常量
- 三、生成请求url
- 四、音频相关
- 1. 首先使用pyaudio获取音频流
- 2. 从音频流中获取音频并上传到接口
- 五、语音识别接口调用
- 六、返回结果处理
- 七、语音识别类
- 八、调用
- 附录
一、引入所需要的包
import hashlib
import base64
import hmac
import json
from urllib.parse import urlencode
import loggingfrom wsgiref.handlers import format_date_time
import datetime
from datetime import datetime
import time
from time import mktime
import _thread as thread
import pyaudiofrom ws4py.client.threadedclient import WebSocketClientlogging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
二、定义相关常量
STATUS_FIRST_FRAME = 0 # 第一帧的标识
STATUS_CONTINUE_FRAME = 1 # 中间帧标识
STATUS_LAST_FRAME = 2 # 最后一帧的标识CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
三、生成请求url
class WsParam(object):# 初始化def __init__(self, APPId, APIKey, APISecret, AudioFile):self.APPId = APPIdself.APIKey = APIKeyself.APISecret = APISecretself.AudioFile = AudioFile# 公共参数(common)self.CommonArgs = {'app_id': self.APPId}# 业务参数(business),更多个性化参数可在官网查看self.BusinessArgs = {'domain': 'iat','language': 'zh_cn','accent': 'mandarin','vinfo': 1,'vad_eos': 10000,'dwa': 'wpgs','ptt': 0}# 生成urldef create_url(self):url = 'wss://ws-api.xfyun.cn/v2/iat'# 生成RFC1123格式的时间戳now = datetime.now()date = format_date_time(mktime(now.timetuple()))# 拼接字符串signature_origin = 'host: ' + 'ws-api.xfyun.cn' + '\n'signature_origin += 'date: ' + date + '\n'signature_origin += 'GET ' + '/v2/iat ' + 'HTTP/1.1'# 进行hmac-sha256进行加密signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),digestmod=hashlib.sha256).digest()signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')authorization_origin = 'api_key="%s", algorithm="%s", headers="%s", signature="%s"' % (self.APIKey, 'hmac-sha256', 'host date request-line', signature_sha)authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')# 将请求的鉴权参数组合为字典v = {'authorization': authorization,'date': date,'host': 'ws-api.xfyun.cn'}# 拼接鉴权参数,生成urlurl = url + '?' + urlencode(v)# print('date: ',date)# print('v: ',v)# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致# print('websocket url :', url)return url
四、音频相关
1. 首先使用pyaudio获取音频流
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True)
2. 从音频流中获取音频并上传到接口
while True:buf = stream.read()d = {'common': self.ws_param.CommonArgs,'business': self.ws_param.BusinessArgs,'data': {'status': 0, 'format': 'audio/L16;rate=16000','audio': str(base64.b64encode(buf), 'utf-8'),'encoding': 'raw'}}d = json.dumps(d)self.send(d)
五、语音识别接口调用
# 收到websocket连接建立的处理
def opened(self):def run(*args):interval = 0.04 # 发送音频间隔(单位:s)status = STATUS_FIRST_FRAME # 音频的状态信息,标识音频是第一帧,还是中间帧、最后一帧audio = pyaudio.PyAudio()stream = audio.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True)while True:buf = stream.read(CHUNK)# 第一帧处理# 发送第一帧音频,带business 参数# appid 必须带上,只需第一帧发送if status == STATUS_FIRST_FRAME:d = {'common': self.ws_param.CommonArgs,'business': self.ws_param.BusinessArgs,'data': {'status': 0, 'format': 'audio/L16;rate=16000','audio': str(base64.b64encode(buf), 'utf-8'),'encoding': 'raw'}}d = json.dumps(d)self.send(d)status = STATUS_CONTINUE_FRAME# 中间帧处理elif status == STATUS_CONTINUE_FRAME:d = {'data': {'status': 1, 'format': 'audio/L16;rate=16000','audio': str(base64.b64encode(buf), 'utf-8'),'encoding': 'raw'}}self.send(json.dumps(d))# 最后一帧处理elif status == STATUS_LAST_FRAME:d = {'data': {'status': 2, 'format': 'audio/L16;rate=16000','audio': str(base64.b64encode(buf), 'utf-8'),'encoding': 'raw'}}self.send(json.dumps(d))logging.info('录音结束')time.sleep(1)stream.stop_stream()stream.close()audio.terminate()break# 模拟音频采样间隔time.sleep(interval)self.closed(1000, '')thread.start_new_thread(run, ())
六、返回结果处理
# 收到websocket消息的处理
def received_message(self, message):message = message.__str__()try:code = json.loads(message)['code']sid = json.loads(message)['sid']status = json.loads(message)['data']['status']if code != 0:err_msg = json.loads(message)['message']logging.error('sid:%s call error:%s code is:%s' % (sid, err_msg, code))else:data = json.loads(message)['data']['result']ws = data['ws']pgs = data['pgs']sn = data['sn']result = ''for i in ws:for w in i['cw']:result += w['w']if pgs == 'rpl':rg = data['rg']self.rec_text.update({rg[0]: result})for i in range(rg[0] + 1, rg[1]):self.rec_text.pop(i, '404')else:self.rec_text[sn] = resultlogging.info('识别结果为: {}'.format(self.rec_text))except Exception as e:logging.info(message)logging.error('receive msg,but parse exception: {}'.format(e))
七、语音识别类
class RecognitionWebsocket(WebSocketClient):def __init__(self, url, ws_param):super().__init__(url)self.ws_param = ws_paramself.rec_text = {}# 收到websocket消息的处理def received_message(self, message):...# 收到websocket错误的处理def on_error(self, error):logging.error(error)# 收到websocket关闭的处理def closed(self, code, reason=None):logging.info('语音识别通道关闭' + str(code) + str(reason))# 收到websocket连接建立的处理def opened(self):...
八、调用
# AudioFile参数为空时表示不在本地生成音频文件,是否设置为空可以根据开发需求确定
ws_param = WsParam(APPId='', APIKey='', APISecret='', AudioFile=r'')ws_url = ws_param.create_url()
ws = RecognitionWebsocket(ws_url, ws_param)
ws.connect()
ws.run_forever()
附录
自动停止录音的实现可以参考python录音实现自动结束录音
python调用讯飞语音听写(流式版)相关推荐
- html5语音听写流式,iOS 讯飞语音听写(流式版)
最近项目中用到了讯飞的语音识别,然后稍微看了一下,里面有几个值得注意的点,记录一下,先说语音听写(流式版),实时语音转写后期会附上 ,文末有 demo //语音听写(流式版) 语音听写流式版其实没设么 ...
- 测试迅飞语音听写流式版 (by quqi99)
作者:张华 发表于:2019-10-09 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (https://zhhuabj.blog.csdn.net) 刚花了 ...
- android 讯飞语音 提示组件未安装,讯飞语音听写API 未安装组件 错误码21001
在使用讯飞语音听写时,使用云端听写而不是使用本地出现这个未安装组件错误那可能就是so文件没有成功导入.文档中都是ADT环境的配置,在AndroidStudio中jar包等都和ADT差别不大,但是SO文 ...
- uni-app 调用讯飞语音。
uni-app 调用讯飞语音. // //讯飞语音输入接口voice() {var me = this;var options = {};options.engine = 'iFly';options ...
- 关于讯飞语音听写RecognizerDialog 去除这个弹框view中的任何控件 更改其中内容
| | | 上面这是讯飞语音听写sdk的听写弹框下面两张是自己项目中改的 我发现他sdk的assets下的iflytek 中的recognize.xml 里面虽然是乱码 但是可以看到的一些东西是此倾听 ...
- 讯飞语音听写常见问题
最近,项目中要用讯飞语音听写的功能,于是在官网学习了一下,并尝试做个小Demo,期间遇到了一些问题,列举一下: (1)常报错误码11201,是未经授权的语音应用,意思是官方每天允许你使用的次数你已经用 ...
- 前端之实现讯飞语音听写(流式版)
第一次接到语音需求,用了几年的微信,你有关注过微信语音实时转文字功能吗?反正我是经常用,在这人山人海的大城市,为了解放双手又能及时回复好友,我经常用语音转文字. 没想到,一时用一时爽,自己开发火葬场. ...
- H5调用讯飞语音接口实现在线语音听写测评
韩顺平老师是我的人生导师,所以,老规矩,先看效果,后讲解:下面是效果图(页面较大,分屏效果) 这是在线语音听写: 这是在线语音测评: 下面我们来看看具体的代码实现: 1.在讯飞语音平台注册,创建一个应 ...
- AndroidStudio快速开发讯飞语音听写
好久没更新了,差点就忘记这个东东了,不过好在一闲下来就赶紧更新一波 哈哈^_^ **此博客主要针对将要进行语音开发的小白,如有不对的地方,请指正 到科大讯飞官网注册账号并登陆,选择单个服务SDK下载 ...
最新文章
- HBase眼高手低从Shell到IDEA编程、心路笔记、踩坑过程
- Eclipse使用技巧收集
- linux shell let命令,shell编程中的let与(())
- yolov5 代码版,去掉配置文件
- 谷歌用算力爆了一篇论文,解答有关无限宽度网络的一切
- php aws ses,python-在AWS SES上接收和解析电子邮件
- eclipse svn插件安装_PHP 安装
- 【iOS】Ambiguous reference to member 'tableView(_:numberOfRowsInSection:)'
- zabbix 通过 SNMP 监控 Windows主机
- Logrotate操作手册
- python中如何调用图像处理库_python怎么调用图像处理
- asscalar()函数
- 基于EEGLAB的脑电数据预处理
- Css选择器权重排序详解+权重计算
- 站在两个世界的边缘 程浩,一个认真生活过的人
- 设计链表python(leetcode707)
- 显示器/电脑屏幕字体出现重影
- 阿里和腾讯在泰国热战正酣,马云和马化腾要打世界大战?
- MySQL攻略(2)
- 分布式期货行情交易系统-行情及交易模块分析