这个程序的功能是读取指定文件夹中的视频文件,将其转换为音频文件,并使用百度语音识别API将音频文件转换为文本,最后将文本保存到一个Word文档中。程序使用了多个Python库和技术,包括:
aip:百度AI开放平台的Python SDK,用于调用语音识别API。
ffmpy3:用于将视频文件转换为音频文件。
tkinter:Python的标准GUI库,用于创建GUI界面。
os:用于操作文件和目录。
time:用于获取当前时间。
json:用于处理JSON格式的数据。
traceback:用于获取异常信息。
docx:用于创建和操作Word文档。
程序的主要流程是:首先使用tkinter库创建一个GUI界面,让用户选择要处理的文件夹。然后程序遍历文件夹中的所有文件,对于视频文件,使用ffmpy3库将其转换为音频文件,然后使用aip库将音频文件转换为文本,并将文本添加到Word文档中。对于已经是音频文件的文件,直接使用aip库将其转换为文本,并将文本添加到Word文档中。最后,程序将Word文档保存到本地。
#读取视频并将其转换为音频,整理成不多于60s的音频文件由百度接口进行识别
#实现读取文件夹依次读取其中视频
from aip import AipSpeech
from ffmpy3 import FFmpeg
from tkinter import *
import tkinter.filedialog
import tkinter.messagebox
import random
import os
import time
import json
import traceback
from docx import Document
from docx.shared import Pt #设置像素、缩进等
from docx.shared import RGBColor #设置字体颜色
from docx.oxml.ns import qn
document = Document()
class Translate():
counter = 0
def __init__(self):
self.APP_ID = '31585854'
self.API_KEY = '2jSOXUSuiNpfWyCuHGP62SWG '
self.SECRET_KEY = 'Yp7bNwjBPSCCunWnc28SmzsyQ8zTbXxA '
self.root = tkinter.Tk()
self.root.title("语音识别")
self.root.minsize = (600, 400)
self.frame = tkinter.Frame(self.root)
self.frame.pack()
self.start_button = tkinter.Button(self.frame, command=self.chose, text="选择文件夹").grid(row=1, column=0,pady=5)
self.speech_text = tkinter.Text()
self.speech_text.pack()
tkinter.mainloop()
#选择文件夹依次读取其中所有视频文件转换为音频
def chose(self):
selectFolderName = tkinter.filedialog.askdirectory(title='选择文件夹')
speech_type = ['.wav' ,'.pcm']
video_type = ['.mp4', '.rmvb', '.avi']
for root, dirs, files in os.walk(selectFolderName):
for file in files:
type = os.path.splitext(file)[1]
if(type in speech_type):
self.to_screen("正在识别...")
self.speech_to_text(os.path.join(root, file))
elif(type in video_type):
speech_path = self.video_to_speech(os.path.join(root, file))
self.to_screen("转换成功,正在识别...")
self.speech_to_text(speech_path)
else:
self.to_screen("错误的文件格式")
def video_to_speech(self, filepath):
try:
self.to_screen("正在转换文件...")
voice_location = os.path.join(os.path.dirname(os.path.realpath(__file__)), "video_output")
if not os.path.exists(voice_location):
os.makedirs(voice_location)
outputfile = "%s/%s.wav" % (voice_location, os.path.splitext(os.path.basename(filepath))[0])
ff = FFmpeg(
inputs={filepath: None},
outputs={outputfile: '-vn -ar 8000 -ac 2 -ab 8000 -f wav'}
)
ff.cmd
ff.run()
except:
tkinter.messagebox.showerror('错误',traceback.format_exc())
return outputfile
# 读取音频文件,切割成不大于60s的文件,分别读取并识别,分别添加到word文档中
def speech_to_text(self, filePath):
client = AipSpeech(self.APP_ID, self.API_KEY, self.SECRET_KEY)
#标题前添加序号counter
Translate.counter+=1
print(Translate.counter)
document.add_heading(str(Translate.counter) + ". "+os.path.splitext(os.path.basename(filePath))[0], level=1)
with open(filePath, 'rb') as fp:
audio_data = fp.read()
audio_length = len(audio_data)
#大于60s时
if (audio_length > 60 * 16000):
# 分割音频文件
speech_list = []
speech_number = audio_length // (60 * 16000)
for i in range(speech_number):
speech_list.append(audio_data[i * (60 * 16000):(i + 1) * (60 * 16000)])
speech_list.append(audio_data[speech_number * (60 * 16000):])
# 识别音频文件
for i in range(len(speech_list)):
res = client.asr(speech_list[i], 'wav', 16000, {
'dev_pid': 1537,
})
if (res['err_no'] == 0):
self.to_screen(res['result'][0])
document.add_paragraph(res['result'])
# 小于60s时
if (audio_length <= 60 * 16000):
res = client.asr(audio_data, 'wav', 16000, {
'dev_pid': 1537,
})
if(res['err_no'] == 0):
self.to_screen(res['result'][0])
document.add_paragraph(res['result'])
for paragraph in document.paragraphs:
for run in paragraph.runs:
run.font.size = Pt(11)
run.font.color.rgb = RGBColor(0, 0, 0)
run.font.name = "黑体"
# 设置像黑体这样的中文字体,必须添加下面 2 行代码
r = run._element.rPr.rFonts
r.set(qn("w:eastAsia"), "黑体")
document.save("result.docx")
def to_screen(self, text):
self.speech_text.insert(INSERT, '%s\n' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
self.speech_text.insert(END, '%s\n' % text)
def main():
text = Translate()
print("所有项目识别完毕")
os.system('pause')
if __name__ == "__main__":
main()
需要将ffmpeg.exe和运行程序放置到同一目录