文章目录

  • 前言
  • 具体过程
    • 1.讯飞开放平台创建应用
    • 2.代码示例
    • 3.代码说明
    • 4.测试结果

前言

今天朋友在群里面问有没有录音转文字的免费软件?我就去网上搜了一下,发现网上大多数是超出一定时长就收费的,而我朋友的音频比较多,加起来有几个小时,于是我想着能不能调用接口,用python实现这个功能。

上图是某在线平台的音频转文字功能,可以看到超出时长收费也是比较贵的。
因为之前了解到讯飞主要做这方面,所以我选择了讯飞的开发平台。

具体过程

1.讯飞开放平台创建应用

进入官网讯飞开放平台
注册登录后点击语音转写

再点击控制台创建应用即可。
创建完后会得到APPID和密钥(这个代码要用)。

创建完应用后我们可以先领取5小时体验包。

2.代码示例

找到开发文档,里面有代码示例。


我用的是python示例,并按照需求改了一下代码。

# -*- coding: utf-8 -*-
#
#   author: yanmeng2
#
# 非实时转写调用demoimport base64
import hashlib
import hmac
import json
import os
import time
import reimport 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 = 'true'
# 多候选词个数
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:if apiname=='/getResult':results=re.findall(r"\"onebest\":\"(.+?)\",",result['data'])print(results)upload_file_path = self.upload_file_pathwith open(str(upload_file_path)+".txt", "a", encoding='utf-8') as f:for i in results:f.write(i)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(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"")api.all_api_request()

3.代码说明

使用上面的代码需要加三处地方。
代码倒数第二行的appid和密钥用你自己的,文件路径是音频的文件路径。

4.测试结果


上面是我的文件目录(音频时长大概五十多分钟)。

上面即为生成的TXT文本。

体验包的时长也被扣了,不过5小时是够用的(新用户最多可以领50小时)。

录音转文字python实现相关推荐

  1. 语音识别转文字python

    # -*- coding: UTF-8 -*- '''参考 https://blog.csdn.net/qq_43280079/article/details/99684389 https://www ...

  2. 录音文件下载_音频转文字怎么转?大家都说好用的手机APP:录音转文字助手

    音频转文字怎么转?由于工作需要,很多办公室的小伙伴经常要整理会议纪要.谈话内容等.这时候,拥有一款可以把音频转换成文字的软件,对于办公室小伙伴来说尤为重要. 今天,小编来给小伙伴们推荐一款大家都说好用 ...

  3. 录音转成文字 android,安卓手机自带的录音转文字功能这么强大,堪称会议神器!你会用吗...

    原标题:安卓手机自带的录音转文字功能这么强大,堪称会议神器!你会用吗 有的小伙伴在开会时经常需要录音,然后要对录音进行整理变成文字稿,每次都要花很多的时间和精力,难不成你还在傻傻的手动录入,别傻了!不 ...

  4. 喜马拉雅xm格式转化mp3_怎样让mp3录音转文字?

    我们大多数的的音频格式是mp3格式的,比如说我们录制了一段音频但是我们又想把它转化成文字的形式保存,总不能是一字一字的在键盘上敲打下来吧!那么我们有没有什么简便的方法把mp3录音转文字呢?小编在这点上 ...

  5. 华为手机记事本导出_涨知识!原来华为手机自带的录音转文字这么好用,秒变会议神器...

    华为手机在今年的第二季度占据38%的市场份额,可以说是远远甩开的友商,那华为手机为什么这么受消费者欢迎呢?其实很大一部分是因为它的实用性,可是说华为手机很多功能都可以帮助我们提高工作效率. 比如无线投 ...

  6. 中如何实现文字转语音_录音转文字、文字转语音,学会这一招就够了!手把手教你如何操作...

    阅读文章时候想着有人可以把文章读给我听就好了,写作时想着语音直接可以转换成文字就好了,大家是不是有时会突然冒出这样的想法?七十这些看似天真的想法,还真的有办法解决,这里就手把手教你如何操作才能将的文字 ...

  7. 华为做raid5步骤_华为手机这个功能真棒!一键将录音转为文字!快快用起来吧...

    天天开会本来就很烦了,而且还要做会议记录,简直是烦上加烦.其实,如果你有一台华为手机的话,根本不用烦,华为拥有强大的录音转文字功能,能帮你快速将会议录音转为文字,让你轻松搞定会议记录~ 一.自带转换 ...

  8. android 获取录音时长_录音转文字,支持安卓和IOS和PC

    在生活过过程中,我们需要用笔去记录一些比较重要的会议记录,但是在这个过程中我们肯定会遗漏一些关键的要点 还有电话录音的时候我们需要做案例分析的时候,如果反反复复去听感觉大脑没有那么容易反应过来,对于分 ...

  9. 喜马拉雅 xm文件转m4a_录音转文字:学习/办公/生活都极为实用!

    工作中需要录音的地方太多了,像记者需要做采访.上班族需要开会.谈合作,学生.学者需要备课等等. 很多人曾饱受整理录音文件之苦. 半个小时的录音文件,要反复重听.反复码字. 花了一个小时,才能完整地把录 ...

  10. linux下录音识别成文字软件下载,录音转文字分享助手

    录音转文字分享助手是一款非常实用的录音软件,能够帮助用户在录音的同时可以快速的将内容转化成文字输出,不管是办公还是生活都可以进行使用,方便快捷,录制到好玩有趣的音频时还可以在录音转文字分享助手中一键进 ...

最新文章

  1. 未经任何测试的源代码开放
  2. zabbix1.8和2.0版本通用的安装脚本
  3. Integer对象范围(-128-127)之间(Integer. valueOf()方法)
  4. 程序员九重镜界,很老的今天刚刚翻出来
  5. 【转】ABP源码分析十四:Entity的设计
  6. 语言压缩zip win_主流压缩软件挨个尝试后,我选择了没有短板的全能压缩Bandizip...
  7. HTML1.0 - html 环境搭建 开发工具
  8. php 服务器监控源码,PHP自动Get监控源码
  9. 桌面养花-DesktopPlant v2.3.12原创汉化版
  10. Java测试驱动开发(TDD)
  11. HTML——使用表格制作个人简历
  12. boren - 飞机大战9之战机爆炸
  13. Vue之watch监听
  14. 2022年十一届认证杯B题
  15. Springboot旧衣捐赠平台设计与实现 p40x5计算机毕业设计-课程设计-期末作业-毕设程序代做
  16. jQuery第三方插件
  17. HTML a标签之空链接
  18. css:html元素的定位
  19. 小白说js--我是一个逆袭的JS
  20. Lucene 查询中的距离查询(proximity query)

热门文章

  1. 使用Editplus查看空格
  2. 详解Unity中的摄像机及实例应用
  3. VBoxGuestAdditions.iso下载地址
  4. dubbo线程池中无可用线程
  5. linux lightdm启动阶段黑屏,Ubuntu卡logo、卡住、黑屏无法正常启动、屏幕和键盘背光无法调节等一系列问题的罪恢祸首:NVIDIA显卡驱动...
  6. 柠檬视频php源码,最新柠檬视频完整开源版源码分享,自适应WAP手机端,含APP源代码,详细的安装教程等等...
  7. 阿里巴巴矢量图标库的引入——symbol类型的使用——阿里图标组件封装
  8. 互联网寒冬!闭关60天学懂NDK+Flutter,专题解析
  9. 计算机课初中文化的学生招,计算机应用 教学计划
  10. 【Matlab取整函数】