文章目录

  • 问题
  • 解决
    • 截图
    • srt格式原理
    • 识别语音的讯飞接口调用函数
    • 处理结果,得到字符
    • 列表合成字典

问题

讯飞文字转写长语音只有5h免费,想要体验50000分钟白嫖的,看我另一篇文章
最近在看一些教程,发现没有字幕,网络上也没有匹配的,看着很别扭
因此我使用au处理了视频,得到了视频声音,wav格式,20多分钟长度
然后使用讯飞的语音识别接口识别了下,得到了每句话识别的文字和视频对应的时间
然后按照srt格式对其进行了输出
这样就能给那些没有字幕的视频自动添加字幕了
我的需求大致满足了,记录一下。

解决

截图

视频字幕效果

字幕是语音识别自动添加的
代码框输出格式

最后会生成srt字幕文件

srt格式原理


如图,第一个是序号,第二个是字幕显示时间段,精确到微秒,底下就是文字,中英文随意
字幕序号一般是顺序增加的,但是对视频没用,主要还是为了方便翻译人员翻译和观看,但是不可或缺,这是必要的格式
更加详细的看这个链接,这是我查的资料https://www.cnblogs.com/tocy/p/subtitle-format-srt.html

识别语音的讯飞接口调用函数

这个直接复制粘贴就行,只是一个调用的函数,非常通用,下面的另外一个函数是调用他的,位于同一个文件夹下的两个py文件
voice_get_text.py

# -*- coding: utf-8 -*-
#
#
# 非实时转写调用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 = '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: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 . 获取结果aaa=self.get_result_request(taskid=taskid)return aaaprint(aaa)

处理结果,得到字符

放入自己在讯飞申请的语音转文字功能的id与key,执行后会得到一个巨长的声音识别后的dict字符串,自己处理一下变成srt格式就行了。当然这里我写的输出就是srt
video_to_txt.py

# coding=gbk
import voice_get_text
import datetime
video_path=input("音频路径:").replace("\\",'/')
print("开始处理...请等待")
api = voice_get_text.RequestApi(appid="申请的id", secret_key="申请的key",upload_file_path=video_path)
myresult=api.all_api_request()
def get_format_time(time_long):def format_number(num):if len(str(num))>1:return str(num)else:return "0"+str(num)myhour=0mysecond=int(time_long/1000)myminute=0mymilsec=0if mysecond<1:return "00:00:00,%s"%(time_long)else:if mysecond>60:myminute=int(mysecond/60)if myminute>60:myhour=int(myminute/60)myminute=myminute-myhour*60mysecond=mysecond-myhour*3600-myminute*60mymilsec=time_long-1000*(mysecond+myhour*3600+myminute*60)return "%s:%s:%s,%s"%(format_number(myhour),format_number(myminute),format_number(mysecond),\format_number(mymilsec))else:mysecond=int(mysecond-myminute*60)mymilsec=time_long-1000*(mysecond+myminute*60)return "00:%s:%s,%s"%(format_number(myminute),format_number(mysecond),format_number(mymilsec))else:mymilsec=time_long-mysecond*1000return "00:00:%s,%s"%(mysecond,mymilsec)
myresult_str=myresult["data"]
myresult_sp=myresult_str.split("},{")
myresult_sp=myresult_sp[1:-1]
myword=""
flag_num=0
for i in myresult_sp:flag_num+=1print(i)word=[]key=[]a=i.split(",")for j in a:temp=j.split(":")key.append(temp[0][1:-1])word.append(temp[1][1:-1])get_dic=dict(zip(key,word))print(get_dic)bg= get_format_time(int(get_dic["bg"]))ed= get_format_time(int(get_dic["ed"]))real_word=get_dic["onebest"]newword=str(flag_num)+"\n"+bg+" --> "+ed+'\n'+real_word+"\n\n\n"myword=myword+newword
print(myword)
# myword=video_path.split("/")[-1]+"\n"+myword
nowTime_str = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H-%M-%S')
path_file=r"C:\Users\Administrator.DESKTOP-KMH7HN6\Desktop\video_text\%s.srt"%(nowTime_str)
f = open(path_file,'a')
f.write(myword)
f.write('\n')
f.close()
print('已经识别完成,见输出目录下的srt文件')
input()

列表合成字典

这个无视即可,随手写的代码

# -*- coding: utf-8 -*-
keys = ['a', 'b', 'c']
values = [1, 2, 3]
mydic = dict(zip(keys, values))
print (mydic)

python-视频声音根据语音识别自动转为带时间的srt字幕文件相关推荐

  1. python-根据语音识别让无字幕视频自动生成字幕,附srt字幕文件

    问题 各大平台都有长语音转写的服务,但是收费昂贵,而且有次数和时间限制. 因此我想到了一个白嫖的好办法.将长音频根据语句停顿切割得到短音频,使用他们提供的短音频识别服务来识别长音频不是更好吗?粗略计算 ...

  2. 【C#】Whisper 离线语音识别(微软晓晓语音合成的音频)(带时间戳、srt字幕)...

    语音合成&语音识别 用微软语音合成功能生成xiaoxiao的语音. 用Whisper离线识别合成的语音输出srt字幕. 一.语音合成 参考这个网址:https://www.bilibili.c ...

  3. python调用开源求解器SCIP求解带时间窗车辆路径问题(VRPTW)

    文章目录 1. 问题定义 2. 数学模型 3. python调用SCIP实现代码 4. 结果 参考文献 1. 问题定义 带时间窗车辆路径问题(vehicle routing problem with ...

  4. python神经网络编程pdf_[人工智能]Python神经网络编程(高清,带详细书签) pdf文件[11.49MB]-码姐姐下载...

    Python神经网络编程(高清,带详细书签) [更多关于<深度学习>资料,加qq群:851916415领取!] 本书首先从简单的思路着手,详细介绍了理解神经网络如何工作所必须的基础知识.第 ...

  5. 如何一键生成字幕,如何快速处理生肉资源?借助whisper语音识别系统生成.srt字幕文件 手把手教学在Windows、CPU版本下whisper的安装与使用,快速上手!

    目录 一.前言 二.本机环境 三.安装步骤: 步骤1:下载Git并添加环境变量 步骤2:下载ffmpeg并添加环境变量 步骤3:安装pytorch 步骤4:安装whisper 四.whisper的应用 ...

  6. Python编程之读取Excel xlsx格式带合并单元格的文件

    1.文件内容 2.代码实现 import xlrd apply_dic = [] def get_excel():with xlrd.open_workbook(r'kecheng.xlsx') as ...

  7. Python根据身份证号计算年龄和退休时间并保存Excel文件

    封面图片:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等配 ...

  8. 视频文件的srt字幕 文件

    例子: 很简单就不多说了 文件名:ALTIMA - I'll believe.srt 1 00:00:00,000 --> 00:00:03,000 I'll believe 歌:ALTIMA  ...

  9. 如何快速把mkv转为mp4格式,并带(保留)字幕!可在iPhone上播放

    mkv文件其实属于封装格式,包括视频.音频.字幕等文件,像一些PR等剪辑软件就不能直接调用,而且很多播放器在识别这些文件时也可能因为兼容性问题导致不能播放.解决办法很简单,把mkv文件转为mp4格式就 ...

最新文章

  1. c# 对象json互相转换_C#匿名对象(转JSON)互转、动态添加属性
  2. 在 ES6中 改良的5个 JavaScript “缺陷”
  3. IOS对plist配置文件的读写操作
  4. 实时操作系统与通用计算机操作系统的区别,实时操作系统(RTOS)和通用操作系统(OS)之间的区别...
  5. sql练习(针对Mysql)
  6. 算法题复习(快排、链表、二分、哈希、双指针)
  7. php ues incolde,17秋东财《大学英语2》在线作业三答案
  8. 图:广州南洋理工职业学院管理系“相聚南洋”朗诵(演讲)比赛尘埃落定
  9. http客户端-性能比较系列-第二篇-多线程
  10. 项目管理其实可以简单一点——项目风险
  11. python图书馆座位预约系统毕业设计开题报告
  12. 计算机应用 课件 .doc,《计算机应用基础》课件36915.doc
  13. Win11无线鼠标没反应怎么办?无线鼠标不能用是什么原因?
  14. 微信小程序的wx:for和vue的v-for
  15. 解决Error: Assertion failed (chunk.m_size <= 0xFFFF)和Set OPENCV_ENABLE_NONFREE CMake option问题
  16. 目前大数据分析的发展状况是怎样
  17. AI数学基础——经验分布,熵
  18. 20年南京大学软件工程考研经验分享
  19. 方队 - 启发式合并 - 主席树
  20. 第四篇 再读Spring 之BeanDefinition注册

热门文章

  1. JSON与XML的区别
  2. 帝国cmssitemap.php,帝国CMS网站地图sitemap的制作
  3. 并发与多线程之线程安全篇
  4. 解决win10分辨率过高导致某些软件显示小的办法:
  5. 将讲解如何利用WinNTSetup安装win10
  6. api响应泛型参数 swagger_你还在用丝袜哥(Swagger)?今天不如换换口味!
  7. 使用域名访问网站或者静态页面
  8. [Swift]Alamofire使用嵌套参数进行网络请求遇到的问题
  9. c# 窗体控件上绘制跟随鼠标的十字线
  10. VS项目工程目录设置详细说明