Python을 통해 비디오에서 오디오를 추출하고 오디오를 텍스트로 변환하는 방법

일반적인 생각:

(1) moviepy 라이브러리의 VideoFileClip 클래스를 사용하여 비디오 파일을 읽고 오디오 파일로 변환합니다.

(2) pydub 라이브러리의 Splitonsilence 기능을 사용하여 음성 인식을 위해 오디오 파일을 여러 오디오 세그먼트로 분할합니다.

(3) 음성 인식을 위해 SpeechRecognition 라이브러리의 Recognizer 클래스를 사용하고 인식 결과를 텍스트 파일에 씁니다.

알아채다:

오디오 파일을 여러 오디오 세그먼트로 분할하고 각 세그먼트에서 음성 인식을 수행한 다음 마지막으로 모든 인식 결과를 텍스트 파일로 병합합니다.

운영 환경에 대한 간략한 설명:

(1) 맥 OS 13.3.1

(2) 파이참 2021.1 

전체 코드:

from moviepy.editor import VideoFileClip
from pathlib import Path
import os
import speech_recognition as sr
from pydub import AudioSegment
import datetime
from pydub.silence import split_on_silence
from tqdm import tqdm

# 视频文件夹路径
video_folder = './folder'

# 初始化语音识别器
r = sr.Recognizer()

# 遍历视频文件夹中的所有视频文件
for video_file in tqdm(Path(video_folder).rglob('*.mp4')):
    # 提取视频文件名和扩展名
    file_name = video_file.stem
    print(f'Processing video file: {file_name}')

    # 构建视频文件路径和音频文件路径
    audio_file = f'{file_name}.wav'
    video_clip = VideoFileClip(str(video_file))
    video_clip.audio.write_audiofile(audio_file)


def get_large_audio_transcription(path):
    sound = AudioSegment.from_wav(path)
    chunks = split_on_silence(sound, min_silence_len=500, silence_thresh=sound.dBFS - 14, keep_silence=500, )
    folder_name = "audio-chunks"
    # 要创建一个目录来存储音频块
    if not os.path.isdir(folder_name):
        os.mkdir(folder_name)
    whole_text = []
    time_lines = []
    # 处理每一个音频模块
    start_time = datetime.datetime.fromisoformat('2022-01-01T00:00:00')

    for i, audio_chunk in enumerate(chunks, start=1):
        # 导出音频,并保存
        chunk_filename = os.path.join(folder_name, f"chunk{i}.wav")
        audio_chunk.export(chunk_filename, format="wav")

      
        with sr.AudioFile(chunk_filename) as source:
            audio_listened = r.record(source)
       
        text = ""
        try:
            text = r.recognize_google(audio_listened, language="zh-CN", show_all=True)
            if text and len(text['alternative']) > 0:
                text = text['alternative'][0]['transcript']
            else:
                text = ""
        except sr.UnknownValueError as e:
            # print("Error:", str(e))
            pass
        else:
            if text:
                text = f"{text.capitalize()}."
                # print(start_time.time(), ":", text)
                whole_text.append(text)
                time_lines.append(start_time)
                duration = audio_chunk.duration_seconds
                start_time += datetime.timedelta(seconds=duration)
    # return the text for all chunks detected
    return whole_text, time_lines


# 使用SpeechRecognition库进行语音识别
with open(f'{file_name}.txt', 'w', encoding='utf-8') as f:
    for text, time in tqdm(zip(*get_large_audio_transcription(audio_file)),
                           total=len(list(get_large_audio_transcription(audio_file)))):
        f.write(f'{time.time()} {text}\n')

print('All done!')

작업 결과:

 

추천

출처blog.csdn.net/qq_23938507/article/details/130398279