# -*- coding: utf-8 -*-

#

# 非实时转写调用demo

import base64

import hashlib

import hmac

import json

import os

import time

import requests

lfasr_host = 'http://raasr.xfyun.cn/api'

# 请求的接口名

api_prepare = '/prepare'

api_upload = '/upload'

api_merge = '/merge'

api_get_progress = '/getProgress'

api_get_result = '/getResult'

# 文件分片大小10M

file_piece_sice = 10485760

# ——————————————————转写可配置参数————————————————

# 参数可在官网界面(https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.html)查看,根据需求可自行在gene_params方法里添加修改

# 转写类型

lfasr_type = 0

# 是否开启分词

has_participle = 'false'

has_seperate = 'true'

# 多候选词个数

max_alternatives = 0

# 子用户标识

suid = ''

class SliceIdGenerator:

"""slice id生成器"""

def __init__(self):

self.__ch = 'aaaaaaaaa`'

def getNextSliceId(self):

ch = self.__ch

j = len(ch) - 1

while j >= 0:

cj = ch[j]

if cj != 'z':

ch = ch[:j] + chr(ord(cj) + 1) + ch[j + 1:]

break

else:

ch = ch[:j] + 'a' + ch[j + 1:]

j = j - 1

self.__ch = ch

return self.__ch

class RequestApi(object):

def __init__(self, appid, secret_key, upload_file_path):

self.appid = appid

self.secret_key = secret_key

self.upload_file_path = upload_file_path

# 根据不同的apiname生成不同的参数,本示例中未使用全部参数您可在官网(https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.html)查看后选择适合业务场景的进行更换

def gene_params(self, apiname, taskid=None, slice_id=None):

appid = self.appid

secret_key = self.secret_key

upload_file_path = self.upload_file_path

ts = str(int(time.time()))

m2 = hashlib.md5()

m2.update((appid + ts).encode('utf-8'))

md5 = m2.hexdigest()

md5 = bytes(md5, encoding='utf-8')

# 以secret_key为key, 上面的md5为msg, 使用hashlib.sha1加密结果为signa

signa = hmac.new(secret_key.encode('utf-8'), md5, hashlib.sha1).digest()

signa = base64.b64encode(signa)

signa = str(signa, 'utf-8')

file_len = os.path.getsize(upload_file_path)

file_name = os.path.basename(upload_file_path)

param_dict = {}

if apiname == api_prepare:

# slice_num是指分片数量,如果您使用的音频都是较短音频也可以不分片,直接将slice_num指定为1即可

slice_num = int(file_len / file_piece_sice) + (0 if (file_len % file_piece_sice == 0) else 1)

param_dict['app_id'] = appid

param_dict['signa'] = signa

param_dict['ts'] = ts

param_dict['file_len'] = str(file_len)

param_dict['file_name'] = file_name

param_dict['slice_num'] = str(slice_num)

elif apiname == api_upload:

param_dict['app_id'] = appid

param_dict['signa'] = signa

param_dict['ts'] = ts

param_dict['task_id'] = taskid

param_dict['slice_id'] = slice_id

elif apiname == api_merge:

param_dict['app_id'] = appid

param_dict['signa'] = signa

param_dict['ts'] = ts

param_dict['task_id'] = taskid

param_dict['file_name'] = file_name

elif apiname == api_get_progress or apiname == api_get_result:

param_dict['app_id'] = appid

param_dict['signa'] = signa

param_dict['ts'] = ts

param_dict['task_id'] = taskid

return param_dict

# 请求和结果解析,结果中各个字段的含义可参考:https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.html

def gene_request(self, apiname, data, files=None, headers=None):

response = requests.post(lfasr_host + apiname, data=data, files=files, headers=headers)

result = json.loads(response.text)

if result["ok"] == 0:

print("{} success:".format(apiname) + str(result))

return result

else:

print("{} error:".format(apiname) + str(result))

exit(0)

return result

# 预处理

def prepare_request(self):

return self.gene_request(apiname=api_prepare,

data=self.gene_params(api_prepare))

# 上传

def upload_request(self, taskid, upload_file_path):

file_object = open(upload_file_path, 'rb')

try:

index = 1

sig = SliceIdGenerator()

while True:

content = file_object.read(file_piece_sice)

if not content or len(content) == 0:

break

files = {

"filename": self.gene_params(api_upload).get("slice_id"),

"content": content

}

response = self.gene_request(api_upload,

data=self.gene_params(api_upload, taskid=taskid,

slice_id=sig.getNextSliceId()),

files=files)

if response.get('ok') != 0:

# 上传分片失败

print('upload slice fail, response: ' + str(response))

return False

print('upload slice ' + str(index) + ' success')

index += 1

finally:

'file index:' + str(file_object.tell())

file_object.close()

return True

# 合并

def merge_request(self, taskid):

return self.gene_request(api_merge, data=self.gene_params(api_merge, taskid=taskid))

# 获取进度

def get_progress_request(self, taskid):

return self.gene_request(api_get_progress, data=self.gene_params(api_get_progress, taskid=taskid))

# 获取结果

def get_result_request(self, taskid):

return self.gene_request(api_get_result, data=self.gene_params(api_get_result, taskid=taskid))

def all_api_request(self):

# 1. 预处理

pre_result = self.prepare_request()

taskid = pre_result["data"]

# 2 . 分片上传

self.upload_request(taskid=taskid, upload_file_path=self.upload_file_path)

# 3 . 文件合并

self.merge_request(taskid=taskid)

# 4 . 获取任务进度

while True:

# 每隔20秒获取一次任务进度

progress = self.get_progress_request(taskid)

progress_dic = progress

if progress_dic['err_no'] != 0 and progress_dic['err_no'] != 26605:

print('task error: ' + progress_dic['failed'])

return

else:

data = progress_dic['data']

task_status = json.loads(data)

if task_status['status'] == 9:

print('task ' + taskid + ' finished')

break

print('The task ' + taskid + ' is in processing, task status: ' + str(data))

# 每次获取进度间隔20S

time.sleep(20)

# 5 . 获取结果

self.get_result_request(taskid=taskid)

# 注意:如果出现requests模块报错:"NoneType" object has no attribute 'read', 请尝试将requests模块更新到2.20.0或以上版本(本demo测试版本为2.20.0)

# 输入讯飞开放平台的appid,secret_key和待转写的文件路径

if __name__ == '__main__':

#api = RequestApi(appid="", secret_key="", upload_file_path=r"")

APP_ID = "*****"

SECRET_KEY = "****************"

file_path = r"*******"#语音文件名,如.wav

api = RequestApi(appid=APP_ID, secret_key=SECRET_KEY, upload_file_path=file_path)

api.all_api_request()

科大讯飞 唤醒python_用科大讯飞API实现本地语音文件识别相关推荐

  1. 科大讯飞 唤醒python_用Python来使用科大讯飞语音识别,so easy

    在人工智能高速发展的今天,语音识别技术被带入到人们的工作和生活中,开始被越来越多的人关注和使用,今天,当各种在线客服被机器人客服代替,当速记翻译馆被语音识别代替,甚至当收银员.驾驶员.工厂工人.普通文 ...

  2. 对科大讯飞的过度宽容就是对科大讯飞的伤害,从科大讯飞裁员说起

    https://www.toutiao.com/a6650023631885697543/ 2019-01-24 19:28:02 经常看星空君文章的都知道,2018年这一年,星空君怼了好几次科大讯飞 ...

  3. 乐鑫Esp32学习之旅16 学习本地语音唤醒离线识别框架 esp-skainet ,如何修改唤醒词? 如何自定义命令词?如何做意图动作?

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  4. 本地语音控制模块 | 带语音识别的智能家居方案

    智能家居已经进入"声控时代",越来越多的声控智能家居产品进入人们的家庭,声控智能家居将会成为人们购买智能家居的首选.今天就为大家分享逐日科技最新研发的带语音识别的智能家居控制方案, ...

  5. API 层实现语音录制

    API 层实现语音录制   发表日期:2003-03-31 作者:temp77[] 出处:     我从前出于需要,上网寻找了关于录音部分的源代码,收获不大,现在把自己摸索的部分源代码公开出来吧,希望 ...

  6. 基于 QT5 百度语音API 图灵机器人API 的智能语音聊天机器人

    基于 QT5 百度语音API 图灵机器人API 的智能语音聊天机器人 程序简介 代码一共分为以下几个模块 伪代码形式为 部分代码 源代码下载地址 程序简介 程序界面包含录音和发送两个按钮 点录音将开始 ...

  7. Android科大讯飞语音识别源码及API下载

    Android系统本身其实提供有语音识别模块.在它的APIDemo里也有关于语音识别的sample.但大部分的ROM都阉割掉了语音识别和语音合成TTS(Text To Speech)部分.所以运行sa ...

  8. 科大讯飞语音识别芯片_科大讯飞造家电专用语音芯片 市场机会在哪里?

    撰文/蓝科技 家电行业算不上朝阳产业,也绝不是夕阳产业,但围绕家电行业上下游打造的产业链,却带来了很多机会. 尤其是AI驱动.5G到来之际,AIoT正成为新的风口向市场快速渗透.以家电行业为例,理论上 ...

  9. 科大讯飞ai研究院_科大讯飞1024开发者大会:让AI赋能行业数字化升级

    促A.I.行业发展.邀全球开发者共襄盛举,10月23日,以"A.I.焕新·更美好"为主题的2020年科大讯飞全球1024开发者节暨第三届世界声博会正式启幕. 本届大会采取" ...

最新文章

  1. 新手谈谈网站交互设计
  2. mysql 引擎是表级别_Mysql表引擎优化
  3. 关于Video Renderer和Overlay Mixer
  4. IDEA设置虚拟路径 - 解决前端展示本地磁盘图片问题
  5. CCF202009-2 风险人群筛查
  6. SQLyog创建表示的bug
  7. [转一下]未来卫星通信发展趋势
  8. nginx源码分析——configure脚本
  9. cacti安装后修改说明
  10. 为什么vi用HJKL和ESC
  11. 利用iisnode模块,让你的Node.js应用跑在Windows系统IIS中
  12. 为了项目上线而加班,真有必要吗?
  13. 微信商户转账到银行卡
  14. chromedriver与chrome各版本及下载地址
  15. 腾讯火力全开“吃鸡”:下一个游戏行业风口怎能错过?
  16. java wed汽车4s店销售管理系统
  17. xp计算机定时关机怎么批销,(XP电脑定时自动关机命令.doc
  18. 微信小程序顶部tab切换
  19. P4234-最小差值生成树【LCT】
  20. 我心中有猛虎在细嗅蔷薇

热门文章

  1. HTML中保留滚动效果,不显示滚动条
  2. OBS录频实现指定特定的软件和调整录频的分辨率
  3. POJ-3348 Cows
  4. php 追查框架生命周期,thinkPHP5.0框架应用请求生命周期分析
  5. typedef和define的区别
  6. c语言四项特效“疗法”
  7. 央视网上线独立搜索页面索引站内信息:Search.cctv.com
  8. 四级英语图表作文真题计算机,英语四级图表作文写作技巧
  9. 第四章 决策树和ID3 python3.5.1代码理解
  10. MobileRuler项目(手机尺子)