讯飞语音转写json结果格式化,提取文字(基于python)
测试讯飞语音转写,参考官方demo调通后,返回数据是"字典+json"的混合格式:
success:{'data': '[{"bg":"0","ed":"10","onebest":"大家好,","speaker":"0"},{"bg":"10","ed":"20","onebest":"我是个穷人,","speaker":"0"},{"bg":"20","ed":"30","onebest":"我今天还没吃饭呢。","speaker":"0"}]', 'err_no': 0, 'failed': None, 'ok': 0}
大结构是个字典,字典键data对应的值才是json格式的转写结果,是不是看的眼花缭乱?是不是要用个正则表达式把结果过滤出来?
大多数同学想要直接输出文字结果,形如:
大家好,我是个穷人,我今天还没吃饭呢。
如何提取呢?
标准答案:在demo程序的197行附近,找到注释 “# 5 . 获取结果” ,修改为如下代码:
# 5 . 获取结果
result_dict = self.get_result_request(taskid=taskid)#结果保存到变量
json_data = result_dict['data'] #从结果中取data
t2 = json.loads(json_data) #json转换为字典
for i in range(len(t2)):print(t2[i]['onebest'],end='') #遍历二元字典输出语音识别结果,i为0时,对应第一句,以此类推
大功告成
附上完整版代码:用的时候注意修改APPID和文件路径
# -*- coding: utf-8 -*-
#
# author: yanmeng2
#
# 非实时转写调用demoimport base64
import hashlib
import hmac
import json
import os
import timeimport requestslfasr_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 = 'false'
# 多候选词个数
max_alternatives = 0
# 子用户标识
suid = ''class SliceIdGenerator:"""slice id生成器"""def __init__(self):self.__ch = 'aaaaaaaaa`'def getNextSliceId(self):ch = self.__chj = len(ch) - 1while j >= 0:cj = ch[j]if cj != 'z':ch = ch[:j] + chr(ord(cj) + 1) + ch[j + 1:]breakelse:ch = ch[:j] + 'a' + ch[j + 1:]j = j - 1self.__ch = chreturn self.__chclass RequestApi(object):def __init__(self, appid, secret_key, upload_file_path):self.appid = appidself.secret_key = secret_keyself.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.appidsecret_key = self.secret_keyupload_file_path = self.upload_file_pathts = 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加密结果为signasigna = 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'] = appidparam_dict['signa'] = signaparam_dict['ts'] = tsparam_dict['file_len'] = str(file_len)param_dict['file_name'] = file_nameparam_dict['slice_num'] = str(slice_num)elif apiname == api_upload:param_dict['app_id'] = appidparam_dict['signa'] = signaparam_dict['ts'] = tsparam_dict['task_id'] = taskidparam_dict['slice_id'] = slice_idelif apiname == api_merge:param_dict['app_id'] = appidparam_dict['signa'] = signaparam_dict['ts'] = tsparam_dict['task_id'] = taskidparam_dict['file_name'] = file_nameelif apiname == api_get_progress or apiname == api_get_result:param_dict['app_id'] = appidparam_dict['signa'] = signaparam_dict['ts'] = tsparam_dict['task_id'] = taskidreturn param_dict# 请求和结果解析,结果中各个字段的含义可参考:https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.htmldef 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 resultelse: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 = 1sig = SliceIdGenerator()while True:content = file_object.read(file_piece_sice)if not content or len(content) == 0:breakfiles = {"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 Falseprint('upload slice ' + str(index) + ' success')index += 1finally:'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 = progressif progress_dic['err_no'] != 0 and progress_dic['err_no'] != 26605:print('task error: ' + progress_dic['failed'])returnelse:data = progress_dic['data']task_status = json.loads(data)if task_status['status'] == 9:print('task ' + taskid + ' finished')breakprint('The task ' + taskid + ' is in processing, task status: ' + str(data))# 每次获取进度间隔20Stime.sleep(10)# 5 . 获取结果result_dict = self.get_result_request(taskid=taskid)json_data = result_dict['data']t2 = json.loads(json_data)print("JSON转字典后数据类型为:"+str(type(t2)))for i in range(len(t2)):print(t2[i]['onebest'],end='')# 注意:如果出现requests模块报错:"NoneType" object has no attribute 'read', 请尝试将requests模块更新到2.20.0或以上版本(本demo测试版本为2.20.0)
# 输入讯飞开放平台的appid,secret_key和待转写的文件路径
if __name__ == '__main__':api = RequestApi(appid="f0d2c785", secret_key="29c4693b5495a156db83a368fa67eca7", upload_file_path=r"test.m4a")api.all_api_request()
文章如果帮到你的话,是不是应该评论点赞感谢一下?
讯飞语音转写json结果格式化,提取文字(基于python)相关推荐
- AI赋能日常生活:讯飞语音转写在会议、采编、上课等场景中的应用
人工智能在日常生活中的应用已经非常广泛了.除了ChatGPT这种对话生成式AI,语音转文字技术也可以在很多场景中派上用场.比如,奔波于各种会议之间的打工人.经常采访的媒体从业者以及要上网课的学生们,每 ...
- 讯飞语音转写.NET版本
吐槽一下,讯飞官方webapi,没有提供.NET版本案例,只有python,java,只好自己摸索,代码不太简洁,这里复习总结一下,权当作做笔记摘抄一样总结一番,也给第一天尝试其他小伙伴一点参考. 检 ...
- 讯飞语音转写php版demo
是转写,不是听写!!! 是转写,不是听写!!! 是转写,不是听写!!! 讯飞开放平台提供的api里面,demo只提供了py3和java的版本!!! github包括码云我也没有找到现成的代码(不一定没 ...
- Python讯飞语音转文字保存到文件
因为有朋友需要将录音转成文字, 给我的是m4a格式, 我给转成txt发给他的. 我找了找, 发现网上很多都是收费软件,而且转换结果不尽人意., 最后决定使用讯飞服务来完成转换, 讯飞语音转写api支持 ...
- 讯飞语音万能五笔超强手写3合1输入法:
原创 作者:发威时刻 新版本的讯飞语音真的不错,因为它依托于以下几个文件就能动嘴说话了,你只要有一个话筒,另外再能连网就可以了,不仅能说英语还能说各地方言. 再说那个新版本的万能五笔输入法(五笔拼 ...
- 讯飞语音——带你简单实现语音听写
语音听写 de 简单实现 一.前言 如果你没有在讯飞语音平台上创建应用,请先参考讯飞语音的详细配置使用 二.功能描述 语音听写和语音合成都是较为基础也是最常使用的两个基本功能. 语音合成是将文本转化为 ...
- 讯飞语音转文字 PHP demo
讯飞语音转文字PHP tp6 demo 讯飞官网没有PHP demo我是很诧异的 改成了我需要的tp6 demo 讯飞官网没有PHP demo我是很诧异的 我php天下第一就这么没牌面吗 网上找了很久 ...
- Android中集成讯飞语音,语音转文字以及文字转语音操作
讯飞语音 * 在讯飞语音开发者平台上http://www.xfyun.cn/doccenter/newer具体准备工作按照开发文档操作.注意的是创建一个项目,appid和adk是一一对应的* 在这里, ...
- Android——讯飞语音唤醒简介及实现
前段时间写了一个关于百度语音唤醒文章,最近有做了一个讯飞语音的应用,在这里把学习的资料整理一下. 唤醒的整个过程如下: (图源自讯飞官网) 讯飞的语音唤醒功能实现起来挺方便的(相比百度,百度语音And ...
- 讯飞语音 使用步骤(针对androidStudio):语音转文字:
前言:最近做项目用到了讯飞语音,遂搞了一个简单的教程,供大家使用. 讯飞语音 使用步骤:语音转文字: 1,首先去讯飞开放平台( http://www.xfyun.cn/)注册,账号: 2,注 ...
最新文章
- Udacity机器人软件工程师课程笔记(二)-样本搜索和找回-基于漫游者号模拟器
- 数据结构:二分查找 java
- unsigned int vs. size_t
- C语言 | 编程实现5
- 51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释
- 在一起计时器_古典计时器简介之一 qqtimer
- Linux和Windows下计算文件的Hash值
- 以实时风控场景为例,阿里云实时计算如何来做异常检测?
- 使用git时提示Could not create directory #39;%USERPROFILE%/.ssh#39;.percent_expand:unkown key %U...
- DTcms二次开发心得
- python2在线编译器_Skulpt搭建Python在线编译器(二):界面优化
- 上班,老实人和精明人的区别是什么?
- Git - 强制覆盖本地代码[与远程仓库保持一致]
- linux内核函数 ffs,linux内核中的宏ffs(x)
- vue大屏展示 代码 从0 到1
- php镂空窗,镂空文字效果 视频画面变成镂空文字效果制作
- crossorigin
- 患者到医院看病事件模拟
- 网络编程 -java高级技术
- 报错ImportError: cannot import name ‘webdriver‘ from partially initialized module ‘selenium‘ (most lik
热门文章
- 计算机ppt听课记录,怎样做好听课记录.ppt
- Cortex-M3 (NXP LPC1788)之PWM(脉宽调制器)
- java IO流的概念理解
- 手把手教你开发 MyBatis 插件
- vue 动态背景图轮播
- 1. 虚拟化Docker
- EmmyLua 断点调试、xlua断点调试
- 逆序输出字符串的两种方法
- 将输入的字符串逆序输出
- matlab bp结果,BP-networkmatlab BP神经网络实现手写数字识别,使用 。内有测试数据及实验结果,非常适合入门 276万源代码下载- www.pudn.com...