【完全解説】OMFファイルからWAV音声を抽出する方法|Pythonスクリプト付き

投稿者: | 2025年5月13日

何らかのプロジェクトでやり取りを行う際に、実にさまざまなフォーマットでデータのやり取りを行うことがあるかと思います。

過去仕事をしている上で筆者が一番困ったのがフロッピーディスクのMIDIファイル救出。

そうです、もはや救出という名に相応しいですよね。

OMFファイルに関して言えば現在はAAF主流となっていますが、まだまだ現場では使われることがたまにある方式になります。

今回はデータフォーマットOMFを取り扱う方法。
実はこれ、やっかいなのがMacの方はLogicなどで読み込みは可能とされているのですが、実際はファイルが開けないケースがほとんどだったり、公式に対応しているというわけではないようです。

キーパーソン紹介

こうたろう

この記事を担当:こうたろう

1986年生まれ
音大卒業後日本、スウェーデン、ドイツにて音楽活動
ドイツで「ピアノとコントラバスのためのソナタ」をリリースし、ステファン・デザイアーからマルチマイクREC技術を学び帰国
金田式DC録音のスタジオにて音響学を学ぶ
独立後芸術工房Pinocoaを結成しアルゼンチンタンゴ音楽を専門にプロデュース
その後写真・映像スタジオで音響担当を経験し、写真を学ぶ
現在はヒーリングサウンド専門の音楽ブランド[Curanz Sounds]を立ち上げ、ピアニスト, 音響エンジニア, マルチメディアクリエーターとして活動中
当サイトでは音響エンジニアとしての経験、写真スタジオで学んだ経験を活かし、制作機材の解説や紹介をしています。
♪この記事には広告リンクを含みます♪

WAVEファイルの抽出

主な目的はオーディオデータの抽出ではないでしょうか?

OMFファイルで格納できるオーディオ形式は大きく分けて3種類になります。

✅ 対応フォーマットと特徴

フォーマットチャンク識別子拡張子備考
WAVRIFF.wavRIFF構造(リトルエンディアン)
AIFFFORM.aiffIFF構造(ビッグエンディアン)
SD2Sd2f.sd2古いPro Tools形式、構造不明瞭

Pythonで抽出コードを作成する際は、それぞれチャンク識別子を指定して、抽出しなければ取り出せません。

プロジェクトリーダーが制作したOMFデータで中のフォーマットが不明な場合は3種類すべて書き込んでOKです。

また、プログラム自体は、Pythonの標準ライブラリで抽出可能ですので、特別新しいライブラリーを入れる必要はありません。

Mac 抽出サンプルコード

#!/usr/bin/env python3
"""
OMFファイル内に埋め込まれた音声(WAV, AIFF, SD2)をすべて抽出するスクリプト
"""

import os

def extract_audio_chunks(omf_path, output_dir):
    os.makedirs(output_dir, exist_ok=True)

    with open(omf_path, "rb") as f:
        data = f.read()

    patterns = {
        b"RIFF": ("wav", "little"),
        b"FORM": ("aiff", "big"),
        b"Sd2f": ("sd2", None)  # SD2はサイズの取得が特殊、暫定対応
    }

    count = 0
    for pattern, (ext, endian) in patterns.items():
        print(f"\n🔍 チャンク検索: {pattern.decode()}")

        start = 0
        while True:
            start = data.find(pattern, start)
            if start == -1:
                break

            # SD2は長さ情報がないことが多いため暫定:300KBで仮カット
            if pattern == b"Sd2f":
                end = start + 300 * 1024
                audio_data = data[start:end]
            else:
                # 長さ情報はチャンクの4バイト後
                size_bytes = data[start + 4:start + 8]
                if len(size_bytes) < 4:
                    break
                size = int.from_bytes(size_bytes, byteorder=endian)
                end = start + 8 + size
                if end > len(data) or size < 44:
                    print(f"⚠️ 無効または破損した{ext.upper()}チャンクをスキップ(size={size})")
                    start += 4
                    continue
                audio_data = data[start:end]

            filename = f"extracted_{count}.{ext}"
            out_path = os.path.join(output_dir, filename)
            with open(out_path, "wb") as out_file:
                out_file.write(audio_data)

            print(f"✅ {filename} を保存しました({end - start}バイト)")
            count += 1
            start = end

    if count == 0:
        print("❌ いずれの音声フォーマットも検出できませんでした。")
    else:
        print(f"\n🎉 抽出完了:{count}個のファイルを保存しました。")


# 実行対象パスの指定(パスはユーザー環境に応じて変更)
if __name__ == "__main__":
    omf_path = "OMFがあるパス名.omf"
    output_dir = "ファイルを書き出したい場所のパス"

    if not os.path.isfile(omf_path):
        print(f"❌ OMFファイルが見つかりません:{omf_path}")
    else:
        print(f"🔎 読み込みファイル:{omf_path}")
        print(f"💾 書き出し先フォルダ:{output_dir}")
        extract_audio_chunks(omf_path, output_dir)

Windowsでの抽出サンプルコード

✅ Windows対応ポイント

要点対応内容
パス表記\ではなく**raw文字列(r"...")**を使用
日本語パス対応UTF-8エンコーディングで読み込み
拡張子の付与、改行コードなど全プラットフォーム共通
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
OMFファイルから埋め込み音声(WAV, AIFF, SD2)を抽出するWindows対応スクリプト
"""

import os

def extract_audio_chunks(omf_path, output_dir):
    os.makedirs(output_dir, exist_ok=True)

    with open(omf_path, "rb") as f:
        data = f.read()

    patterns = {
        b"RIFF": ("wav", "little"),
        b"FORM": ("aiff", "big"),
        b"Sd2f": ("sd2", None)  # SD2は構造が特殊、サイズは仮設定
    }

    count = 0
    for pattern, (ext, endian) in patterns.items():
        print(f"\n🔍 チャンク検索: {pattern.decode()}")

        start = 0
        while True:
            start = data.find(pattern, start)
            if start == -1:
                break

            if pattern == b"Sd2f":
                end = start + 300 * 1024  # 仮に300KBで切る
                audio_data = data[start:end]
            else:
                size_bytes = data[start + 4:start + 8]
                if len(size_bytes) < 4:
                    break
                size = int.from_bytes(size_bytes, byteorder=endian)
                end = start + 8 + size

                if end > len(data) or size < 44:
                    print(f"⚠️ 無効な{ext.upper()}チャンクをスキップ(size={size})")
                    start += 4
                    continue

                audio_data = data[start:end]

            filename = f"extracted_{count}.{ext}"
            out_path = os.path.join(output_dir, filename)
            with open(out_path, "wb") as out_file:
                out_file.write(audio_data)

            print(f"✅ 保存: {filename}({end - start}バイト)")
            count += 1
            start = end

    if count == 0:
        print("❌ 有効な音声チャンクは見つかりませんでした。")
    else:
        print(f"\n🎉 抽出完了:{count}個のファイルを保存しました。")


if __name__ == "__main__":
    # Windows用のパス指定(raw文字列で記述)
    omf_path = r"C:\Users\YourUsername\Downloads\AUDIO_REEL_OMF.omf"
    output_dir = r"C:\Users\YourUsername\Downloads\OMF_OUTPUT"

    if not os.path.isfile(omf_path):
        print(f"❌ OMFファイルが見つかりません:{omf_path}")
    else:
        print(f"🔎 読み込みファイル:{omf_path}")
        print(f"💾 書き出し先フォルダ:{output_dir}")
        extract_audio_chunks(omf_path, output_dir)

OMFで読み込めるソフトウェア一覧

ソフトウェア名 読み込み(Import) 書き出し(Export) 備考
Pro Tools OMF/AAFともに業界標準。完全対応。
Logic Pro × OMFの読み込みのみ対応。AAF不可。
Final Cut Pro × × OMF非対応。FCPXMLによる中継が必要。
DaVinci Resolve ◯(Studio版) △(FCPXML or AAF) OMF読み込みはStudio版限定。
Adobe Premiere Pro OMF書き出しに対応。AAF推奨。
Avid Media Composer OMFは元祖。高度なAAF連携が主流。
Reaper × 無料でOMF読み込み可。書き出しは非対応。
Cubase / Nuendo × × OMF非対応。AAFを使う必要あり。
Studio One × × OMF/AAFともに非対応。
AATranslator(Windows) 変換専用ツール。OMF ⇄ AAF ⇄ FCPXML変換が可能。

OMFファイルとは何か?

OMF(Open Media Framework)ファイルとは、音声編集や映像編集において、複数のソフトウェア間で編集データと素材ファイルをやり取りするための「中間ファイル形式」です。

※ポストプロダクション(編集・ミックス)のために開発された業務用の中間データ形式

🔍 正式名称と概要

  • 正式名称:Open Media Framework Interchange(OMFI)
  • 開発元:Avid Technology社(1990年代)
  • 拡張子:通常 .omf
  • 目的異なるソフト間で、タイムライン情報・オーディオ素材・クリップ構成を共有する

📦 OMFファイルに含まれるもの

含まれる情報内容の例
音声素材WAV、AIFF、SD2などの形式(埋め込み or 参照)
トラック情報何本のトラックで構成されているか
タイムコード開始時刻、素材の配置タイミング
フェード、ボリュームクロスフェード、パンニング、音量カーブ情報など
参照パス(場合による)音声ファイルの外部リンク情報(Referenced形式)

🔄 OMFファイルの2つの種類

タイプ説明
Embedded型音声ファイルそのものがOMF内部に埋め込まれている(ポータブルで便利)
Referenced型外部のWAVやAIFFを参照するだけ(ファイル移動時にリンク切れの恐れあり)

🎬 なぜOMFが重要なのか?

OMFは、ポストプロダクション(収録後の編集工程)において、音声と映像を別ソフトウェアで編集するプロ現場のニーズに応えるために生まれました。

例:

  • 映像編集:Adobe Premiere、Final Cut Pro
  • 音声編集:Pro Tools、Reaper、Logic Pro

映像編集ソフトで組んだタイムラインを、音声専門のソフトにそのまま引き渡して仕上げる(ミキシング・ノイズ除去など)ために不可欠です。

AAFとの違い(後継フォーマット)

項目OMFAAF(Advanced Authoring Format)
開発時期1990年代前半2000年代以降
拡張性制限ありメタデータ・映像・エフェクトなども保持可能
互換性古いシステムでは安定新しいソフトウェアで標準化が進行中
現在の主流性一部現場で現役映像音声の複合ポスト制作ではAAFが主流

📜 OMFの歴史:映像と音のプロの現場をつなぐための発明

🏭 開発者

  • Avid Technology(アビッド・テクノロジー)
    • 米国のポストプロダクション機器・ソフトの専門企業
    • 1987年設立

🕰 誕生時期

  • 1991年頃
    • 業界初の「ノンリニア編集ソフト」Avid Media Composer の流通とともに登場
    • 映像・音声をテープレスで編集できるようになり、ソフト間連携のための共通交換フォーマットが必要となった

🎯 開発目的

  • 映像編集ソフトと音声編集ソフト間で、「タイムラインと素材を忠実に受け渡すための中間形式」を確立する
  • 映像業界と音響業界の共通言語として生まれました。

🌐 OMFとポストプロダクションの実際の使われ方

例:テレビ番組の編集ワークフロー

  1. Premiereで映像編集(仮ミックス含む)
  2. OMFファイルを書き出してPro Toolsに渡す
  3. Pro Toolsで音響効果やノイズ除去、本格的なミックスを行う
  4. 最終的に映像と音声を再統合(マスタリング)