長い録音を3分ずつに分ける|Python標準のwaveでWAVを分割

文字起こしのサービスには、1回に扱える長さに上限があることがあります。たとえばNottaのフリープランは、公式の料金ページで「1回3分まで」とされています(音声メモから記事の下書きを作る流れ)。長く話した録音を、上限に合わせて決まった長さごとのファイルに分けるには、専用のソフトを入れなくても、Pythonに最初から入っている wave モジュールでできます(WAV形式の場合)。この記事では、10分の録音を3分ずつに分けるコードと、実行した結果を紹介します。

(確認:筆者のPC(Python 3.13の標準モジュール wave)で、2026年10月21日に実行。録音の代わりに、10分のテスト用のWAV(16kHz・16ビット・モノラル、440Hzの音)を作って分けました。MP3やM4Aは、このコードでは扱えません)

テスト用の録音を作る

# 検証用:10分のテスト用WAV(16kHz・16ビット・モノラル、440Hzの音)を作る
import wave, math, struct
RATE, SEC = 16000, 600
with wave.open("long.wav", "wb") as w:
    w.setnchannels(1); w.setsampwidth(2); w.setframerate(RATE)
    one_sec = b"".join(struct.pack("<h", int(3000 * math.sin(2 * math.pi * 440 * i / RATE))) for i in range(RATE))
    for _ in range(SEC):
        w.writeframes(one_sec)
print("作成: long.wav")

自分の録音を分ける場合は、この手順は要りません。WAVで保存した録音を、そのまま次のコードに渡します。

分けるコード

# WAVの録音を、決まった秒数ごとのファイルに分ける(Python標準のwaveモジュールだけを使う)
import wave, sys, os

src = sys.argv[1]                        # 例: long.wav
chunk_sec = int(sys.argv[2])             # 例: 180(3分)
base = os.path.splitext(src)[0]
with wave.open(src, "rb") as r:
    ch, width, rate, frames = r.getnchannels(), r.getsampwidth(), r.getframerate(), r.getnframes()
    print(f"元のファイル: {src} {frames / rate:.1f}秒 / {rate}Hz / {width * 8}ビット / {ch}ch / {os.path.getsize(src):,}バイト")
    per = chunk_sec * rate
    n = 0
    while True:
        data = r.readframes(per)
        if not data:
            break
        n += 1
        out = f"{base}_{n:02d}.wav"
        with wave.open(out, "wb") as w:
            w.setnchannels(ch); w.setsampwidth(width); w.setframerate(rate)
            w.writeframes(data)
        with wave.open(out, "rb") as chk:
            print(f"  {out}: {chk.getnframes() / rate:.1f}秒 / {os.path.getsize(out):,}バイト")

使い方は python split_wav.py long.wav 180 のように、ファイル名と、1つあたりの秒数を渡します。元のファイルと同じ形式(サンプリング周波数・ビット数・チャンネル数)のまま、long_01.wav、long_02.wav…と順に書き出し、書き出した後に開き直して長さを表示します。元のファイルは変えません。

実行の結果

元のファイル: long.wav 600.0秒 / 16000Hz / 16ビット / 1ch / 19,200,044バイト
  long_01.wav: 180.0秒 / 5,760,044バイト
  long_02.wav: 180.0秒 / 5,760,044バイト
  long_03.wav: 180.0秒 / 5,760,044バイト
  long_04.wav: 60.0秒 / 1,920,044バイト
  • 600秒(10分)の録音が、180秒×3つと、残りの60秒の、4つのファイルになった
  • 1つ(180秒)の容量は5,760,044バイト。16,000回×2バイト×180秒=5,760,000バイトに、WAVの見出し(44バイト)を足した値と一致した
  • 4つの合計の長さ(600秒)は、元の長さと同じ

WAVの容量の計算式(サンプリング周波数×ビット数÷8×チャンネル数)と、形式ごとの1時間あたりの目安は、録音ファイルの容量の計算にまとめています。

分ける時の注意

  • 言葉の途中で切れる:決まった秒数で機械的に切るので、文の途中で分かれることがある。文字起こしの後、つなぎ目の前後の文を確かめる
  • WAVだけ:wave モジュールはWAV(PCM)を読み書きするもの。スマホの録音がM4AやMP3なら、まずWAVで保存し直すか、別の道具を使う
  • 容量:WAVは圧縮しないため容量が大きい。アップロードの容量に上限があるサービスでは、モノラル・低めのサンプリング周波数で録ると小さくなる
  • 月の上限:分けても、使う時間の合計は変わらない。月に使える分数は、サービスのプランで確かめる

分けた後の流れ

  1. 分けたファイルを順に文字起こしする
  2. テキストをつなげて、言いよどみ(「えー」など)を整える。Pythonで整える方法は、別の記事「文字起こしのテキストを整える」にまとめています
  3. 事実の確認をしてから、記事の下書きにする(AI生成記事の公開前チェックリスト)

文字起こしの精度を自分で測る方法は文字起こしの精度を自分で測る方法にまとめています。

この記事で確かめていないこと

  • 実際の話し声の録音での、つなぎ目の文字起こしの精度
  • 各サービスの1回あたりの上限の最新の値(サービスの公式ページで確認)
  • M4A・MP3を分ける方法

まとめ

  • WAVの録音は、Python標準の wave モジュールだけで、決まった秒数ごとのファイルに分けられる
  • 10分のテスト用の録音を3分ずつに分けると、180秒×3と60秒の4つになり、長さと容量は計算と一致した
  • 言葉の途中で切れるので、文字起こしの後につなぎ目を確かめる

本記事は、筆者のPCで確かめたコードの紹介です。録音の扱いは、各サービスの利用規約に従ってください。