python读取视频文字_用Python提取视频课程中的文稿

一、 提取文字

我们的最终目的是要拿到文字稿,在一段视频中真正包含文字信息的其实不是视频文件而是音频文件,这下问题就变成从音频提取文字也就是语音识别。关于语音转换文字,腾讯/百度/讯飞都提供有自己的API,大家可以根据自己的习惯选用,我用的是百度API,就以此为例进行演示。

接下来就要去查百度的语音识别API文档,看看它对待提取的音频文件有什么要求,下图就是百度的python SDK文档页面:

在这个文档中,对百度语音识别API所支持的音频格式进行了明确,概况起来主要有三点要求:参数:16k 采样率、16bit 位深、单声道;

格式:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式);

其他:完整语音文件,时长不超过60s。

二、 提取音频

音频转文字的技术解决了,接着要解决的就是把目标视频文件转换为百度API所支持的音频(对应的格式、参数)。从视频中提取音频可以使用FFmpeg,在音频提取过程中还要对音频的采样率、声道数、码率进行设置,同时指定输出音频格式。除此之外,由于百度API最多只支持60秒长度的音频,而我们需要转换的视频长度通常要远高于这个时长,所以还需要使用pydub对音频文件进行切割,然后分段进行文字转换。所以从视频到音频的大概流程应该是这样的:

这下方法就明确了,下面就来看看是如何一步步具体实现视频转文字这个功能的。

三、代码实现

1.视频转音频

前面我们说过,对于一个视频文件需要使用FFmpeg转换成音频,FFmpeg是一个非常快速的视频和音频转换器,语法格式是这样的:

ffmpeg -y -i 16k.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm

上面这条语句的作用是把wav文件转换为16k、16bits位深的单声道pcm文件,其中16k.wav是输入文件、16k.pcm是输出文件,两者之间的内容是输出文件的参数设置。在python中使用FFmpeg需要借助于ffmpy3这个库,语法格式也要做稍许调整。来看下面这段代码,它的作用是把一段视频转换为wav文件:其中inputfile是待转换的视频文件,其参数为空;

outputfile是输出文件路径,其参数中对采样率、声道数以及文件格式等进行了指定;

global_options是全局参数,-y的作用是允许覆盖已有文件;

from ffmpy3 import FFmpeg

# 视频转wav音频

def vedio_to_wav(file):

inputfile = file

file_type = file.split('.')[-1]

outputfile = inputfile.replace(file_type, 'wav')

ff = FFmpeg(inputs={inputfile: None},

global_options=['-y'],

outputs={outputfile: '-vn -ar 16000 -ac l -ab 192 -f wav'})

ff.cmd

ff.run()

return outputfile

通过上面这段代码,可以实现整段视频到音频的转换。

2.音频切割

获取完一整段长音频还要进行切割操作。音频切割的关键是找准每一段的起始和结束的时间节点,所以首先我们要获取整个音频文件的总长度,然后以60秒为间隔进行切分,并计算每一段音频开始秒数和结束秒数,然后切割提取。实现这个功能的代码如下:

import os

from ffmpy3 import FFmpeg

from pydub.audio_segment import AudioSegment

# 音频切割,每段不长于60秒

def wav_split(file):

main_wav_path=file

path=os.path.dirname(file)+'/'

sound_len=int(float(mediainfo(main_wav_path)['duration']))

sound=AudioSegment.from_mp3(main_wav_path)

part_file_list=list()

if sound_len > 60:

n=sound_len//60

if n*60

n+=1

for i in range(n):

start_time=i*60*1000+1

end_time=(i+1)*60*1000

if end_time>sound_len*1000:

end_time=sound_len*1000

word=sound[start_time:end_time]

part_file_name='{}part_sound_{}.wav'.format(path,i)

word.export(part_file_name,format="wav")

part_file_list.append(part_file_name)

return part_file_list

注:通过以上方法进行切割,可能会存在某一个读音被切分在相邻两段音频中的情况,从而在音频到文字的转换阶段造成误差。

3.音频转文字

现在进入本文的核心环节——文字提取,如果要自己写这个功能的话估计费尽心思也写不出来,但是如果使用各种语音识别API就简单多了,使用百度语音识别API对一段音频(小于60秒)进行文字提取的代码如下,其中的APP_ID、API_KEY和SECRET_KEY需要到百度AI开放平台中注册后才能获取。

步骤:

from aip import AipSpeech

# 百度语音转文字

def BAIDU_ASR(wavfile):

# 读取音频文件

def get_file_content(file):

with open(file,'rb') as fp:

return fp.read()

""" 你的 APPID AK SK """

APP_ID = '你的 App ID'

API_KEY = '你的 Api Key'

SECRET_KEY = '你的 Secret Key'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

result = client.asr(get_file_content(wavfile),'wav',16000,{

'dev_pid':1537

})

return result['result']

上面这段代码中,首先建立一个语音识别对象client,然后调用asr方法完成文字的提取,'dev_pid'参数用来指定音频中的语言类型,1537对应的是纯中文普通话。目前支持的语言类型有以下几种:

4.操作界面

通过上面三个步骤,从视频到文字的转换流程就基本实现了,之后只需要把从每段音频中提取的文字合并到一起输出就可以。

当然,在实现基本功能的基础上,还可以进行一些完善工作,例如每次转换之前我们都需要指定目标视频文件和文本的输出目录,对此可以用tkinter做一个简单的UI界面。添加操作界面还有一个好处就是可以用pyinstaller打包成可执行文件,以便分享给其他人使用。

四、工具介绍

FFmpeg简介

FFmpeg基础使用

Python ffmpy3与FFmpeg的安装

安装命令:

pip install ffmpy3

去官网下载FFmpeg,根据自身电脑版本下载相应安装包

from ffmpy3 import FFmpeg

# 最简单的用法是将媒体从一种格式转换为另一种格式(在本例中是从MP4转换为MPEG传输流),同时保留所有其他属性:

ff = FFmpeg(inputs={'test.mp4': None},

outputs={'output.ts': None})

print(ff.cmd)

ff.run()

在运行以上代码进行媒体文件格式转换时,会出现以下错误,这是因为ffmpy3中没有自带ffmpeg可执行文件

File "E:\Python\Python36\lib\site-packages\ffmpy3.py", line 124, in run

raise FFExecutableNotFoundError("Executable '{0}' not found".format(self.executable))

ffmpy3.FFExecutableNotFoundError: Executable 'ffmpeg' not found

解决办法:

解决方法一:解压ffmpeg文件,将ffmpeg文件中的可执行文件ffmpeg.exe复制到当前项目文件目录下

解决方法二:打开ffmpy3.py文件,将中参数executable的值改为ffmpeg.exe可执行文件的绝对路径。

__init__(self, executable='ffmpeg', global_options=None, inputs=None, outputs=None)

self, executable='E:\\dev_software\\fmpeg\\ffmpeg-20191016-29dac29-win64-static\\bin\\ffmpeg.exe', global_options='', inputs=None

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值