语音识别提取视频文案

这个程序的功能是读取指定文件夹中的视频文件,将其转换为音频文件,并使用百度语音识别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和运行程序放置到同一目录

生成的word文档:
语音识别提取视频文案_第1张图片

你可能感兴趣的:(Python学习,语音识别,音视频,python)