【Google Colab】音声ファイルを無音区間で25MB以下に分割する

文字起こし

前回までの記事

【OpenAI】WhisperとGoogle Colaboratoryで録画ファイルの文字起こし

【FFmpeg】録画ファイルを音声だけにしてファイルサイズを下げる方法

音声ファイルのサンプルレートを下げるだけでは、OpenAIのWhisperで解析しきることができなかったため、分割してAPIに渡したいと思います。
その為、ファイル分割を行いたいのですが、話途中で分割してしまうと誤変換されてしまう可能性があるので、無音区間で分割します。
さらに、Whisperに渡すために25MB以下になるようにします。

Google Colaboratoryで分割する

Colabを立ち上げる

使い方は下記の記事を参考にしてください。

【OpenAI】WhisperとGoogle Colaboratoryで録画ファイルの文字起こし

ファイルを準備する

画像の通りの場所に音声ファイルをアップロードしてください。

コードを入力する

下記のコードをColabに入力してください。

!pip install pydub
import os
import subprocess
import sys
import pydub
from pydub import AudioSegment
from pydub.silence import split_on_silence

src_file = "input.wav"
work_dir = "work"

os.makedirs(work_dir, exist_ok=True)

max_file_size = 25 * 1000 * 1000 * 0.9   # Whisper APIに送信できるのは25MBまで。10%ほどブレを見込んでおく。

# split_on_silenceで分割する際のパラメータ。適宜調整。
min_silence_len = 500
keep_silence = 500
silence_thresh = -90

sound = AudioSegment.from_file(src_file, format="wav")
total_length = len(sound)
total_size = os.path.getsize(src_file)
max_length = total_length * (max_file_size / total_size)     # ファイルサイズと時間から、分割する最大時間を取得する

# 無音部分をカットして分割
chunks = split_on_silence(
    sound,
    min_silence_len=min_silence_len,
    silence_thresh=silence_thresh,
    keep_silence=keep_silence,
)

num_of_chunks = len(chunks)

def output_mp3(chunk, output):
    chunk.export(output, format="wav")
    s = AudioSegment.from_file(output, "wav")

# 分割したチャンクをmax_lengthごとに結合
current_chunk = None
for i, c in enumerate(chunks):
    if current_chunk is None:
        current_chunk = c
        continue
    temp_chunk = current_chunk + c
    outFilePath = f"{work_dir}/out_{i + 1}.wav"
    if len(temp_chunk) > max_length:
        output_mp3(current_chunk, outFilePath)
        current_chunk = c
    else:
        if i == len(chunks) - 1:
            output_mp3(temp_chunk, outFilePath)
        else:
            current_chunk += c

実行する

上から順番に実行してください。
実行が完了するとworkフォルダが作成され、「out_〇〇.wav」というファイルが複数できていると思います。
これだけで簡単に音声ファイルの分割ができてしまいます。
ぜひやってみてください。

コメント