测试讯飞语音转写,参考官方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)相关推荐

  1. AI赋能日常生活:讯飞语音转写在会议、采编、上课等场景中的应用

    人工智能在日常生活中的应用已经非常广泛了.除了ChatGPT这种对话生成式AI,语音转文字技术也可以在很多场景中派上用场.比如,奔波于各种会议之间的打工人.经常采访的媒体从业者以及要上网课的学生们,每 ...

  2. 讯飞语音转写.NET版本

    吐槽一下,讯飞官方webapi,没有提供.NET版本案例,只有python,java,只好自己摸索,代码不太简洁,这里复习总结一下,权当作做笔记摘抄一样总结一番,也给第一天尝试其他小伙伴一点参考. 检 ...

  3. 讯飞语音转写php版demo

    是转写,不是听写!!! 是转写,不是听写!!! 是转写,不是听写!!! 讯飞开放平台提供的api里面,demo只提供了py3和java的版本!!! github包括码云我也没有找到现成的代码(不一定没 ...

  4. Python讯飞语音转文字保存到文件

    因为有朋友需要将录音转成文字, 给我的是m4a格式, 我给转成txt发给他的. 我找了找, 发现网上很多都是收费软件,而且转换结果不尽人意., 最后决定使用讯飞服务来完成转换, 讯飞语音转写api支持 ...

  5. 讯飞语音万能五笔超强手写3合1输入法:

    原创   作者:发威时刻 新版本的讯飞语音真的不错,因为它依托于以下几个文件就能动嘴说话了,你只要有一个话筒,另外再能连网就可以了,不仅能说英语还能说各地方言. 再说那个新版本的万能五笔输入法(五笔拼 ...

  6. 讯飞语音——带你简单实现语音听写

    语音听写 de 简单实现 一.前言 如果你没有在讯飞语音平台上创建应用,请先参考讯飞语音的详细配置使用 二.功能描述 语音听写和语音合成都是较为基础也是最常使用的两个基本功能. 语音合成是将文本转化为 ...

  7. 讯飞语音转文字 PHP demo

    讯飞语音转文字PHP tp6 demo 讯飞官网没有PHP demo我是很诧异的 改成了我需要的tp6 demo 讯飞官网没有PHP demo我是很诧异的 我php天下第一就这么没牌面吗 网上找了很久 ...

  8. Android中集成讯飞语音,语音转文字以及文字转语音操作

    讯飞语音 * 在讯飞语音开发者平台上http://www.xfyun.cn/doccenter/newer具体准备工作按照开发文档操作.注意的是创建一个项目,appid和adk是一一对应的* 在这里, ...

  9. Android——讯飞语音唤醒简介及实现

    前段时间写了一个关于百度语音唤醒文章,最近有做了一个讯飞语音的应用,在这里把学习的资料整理一下. 唤醒的整个过程如下: (图源自讯飞官网) 讯飞的语音唤醒功能实现起来挺方便的(相比百度,百度语音And ...

  10. 讯飞语音 使用步骤(针对androidStudio):语音转文字:

    前言:最近做项目用到了讯飞语音,遂搞了一个简单的教程,供大家使用. 讯飞语音  使用步骤:语音转文字:   1,首先去讯飞开放平台( http://www.xfyun.cn/)注册,账号:   2,注 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(二)-样本搜索和找回-基于漫游者号模拟器
  2. 数据结构:二分查找 java
  3. unsigned int vs. size_t
  4. C语言 | 编程实现5
  5. 51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释
  6. 在一起计时器_古典计时器简介之一 qqtimer
  7. Linux和Windows下计算文件的Hash值
  8. 以实时风控场景为例,阿里云实时计算如何来做异常检测?
  9. 使用git时提示Could not create directory #39;%USERPROFILE%/.ssh#39;.percent_expand:unkown key %U...
  10. DTcms二次开发心得
  11. python2在线编译器_Skulpt搭建Python在线编译器(二):界面优化
  12. 上班,老实人和精明人的区别是什么?
  13. Git - 强制覆盖本地代码[与远程仓库保持一致]
  14. linux内核函数 ffs,linux内核中的宏ffs(x)
  15. vue大屏展示 代码 从0 到1
  16. php镂空窗,镂空文字效果 视频画面变成镂空文字效果制作
  17. crossorigin
  18. 患者到医院看病事件模拟
  19. 网络编程 -java高级技术
  20. 报错ImportError: cannot import name ‘webdriver‘ from partially initialized module ‘selenium‘ (most lik

热门文章

  1. 计算机ppt听课记录,怎样做好听课记录.ppt
  2. Cortex-M3 (NXP LPC1788)之PWM(脉宽调制器)
  3. java IO流的概念理解
  4. 手把手教你开发 MyBatis 插件
  5. vue 动态背景图轮播
  6. 1. 虚拟化Docker
  7. EmmyLua 断点调试、xlua断点调试
  8. 逆序输出字符串的两种方法
  9. 将输入的字符串逆序输出
  10. matlab bp结果,BP-networkmatlab BP神经网络实现手写数字识别,使用 。内有测试数据及实验结果,非常适合入门 276万源代码下载- www.pudn.com...