#!/usr/bin/env python3
"""
汎用的な音声抽出・変換プログラム。
詳細説明:
PydubライブラリとFFmpegを利用して、様々な音声/動画ファイルを指定された形式
(MP3、WAVなど)に変換します。入力ファイルが新しい場合のみ更新するオプションや、
既存の出力ファイルを強制的に上書きするオプションも提供します。
このスクリプトは、音声/動画ファイルから高品質なオーディオを抽出・変換するのに役立ちます。
関連リンク: :doc:`to_audio_usage`
"""
import os
import sys
import glob
import argparse
missing = []
for lib in ["pydub"]:
try:
__import__(lib)
except ImportError:
missing.append(lib)
if missing:
print(f"Error: Missing libraries:\n{', '.join(missing)}")
print(f" pip install pydub PyAudio")
print(f" install ffmpeg from https://ffmpeg.org/download.html and add to PATH")
print(f" Linux: apt update; apt install ffmpeg; apt-get install python3-dev libasound-dev")
print(f" macOS: brew install ffmpeg portaudio")
input("\nPress ENTER to terminate>>\n")
sys.exit(1)
from pydub import AudioSegment
[ドキュメント]
def convert_to_audio(input_path: str, format: str, output_path: str, bitrate: str, sample_rate: int | None,
update: int, overwrite: int) -> None:
"""
指定された入力ファイルをオーディオ形式に変換し、出力パスに保存します。
詳細説明:
入力ファイルが存在しない場合はエラーとして終了します。
出力ファイルが既に存在する場合、`overwrite` フラグが設定されていれば上書きします。
`update` フラグが設定されている場合、入力ファイルの最終更新時刻が出力ファイルよりも
新しい場合にのみ変換を実行します。
`pydub.AudioSegment.from_file` を使用してファイルを読み込み、必要に応じて
サンプリングレートを設定し、最終的に `audio.export` で指定されたフォーマットと
ビットレートでオーディオファイルを出力します。動画ファイルからの音声抽出もサポートします。
:param input_path: 入力ファイルへのパス(音声または動画形式)。
:type input_path: str
:param format: 出力オーディオのフォーマット(例: "mp3", "wav")。
:type format: str
:param output_path: 出力オーディオファイルへのパス。Noneの場合、入力パスから自動生成されます。
:type output_path: str
:param bitrate: 出力オーディオのビットレート(例: "192k")。
:type bitrate: str
:param sample_rate: 出力オーディオのサンプリングレート(Hz)。Noneの場合は変更しません。
:type sample_rate: int | None
:param update: 0以外の場合、出力ファイルが存在し、入力ファイルの方が新しい場合にのみ更新します。
:type update: int
:param overwrite: 0以外の場合、出力ファイルが存在しても強制的に上書きします。
:type overwrite: int
:returns: 変換が成功した場合はTrue、それ以外はFalse。
:rtype: bool
"""
output_path = output_path or os.path.splitext(input_path)[0] + f".{format}"
if not os.path.isfile(input_path):
print(f"Error: '{input_path}' は存在しません。", file=sys.stderr)
sys.exit(1)
do_convert = False
if os.path.exists(output_path):
if overwrite:
do_convert = True
print(f"[{output_path}] は存在しますが、上書きします")
elif not update:
do_convert = False
print(f"[{output_path}] は存在しますが、更新しません")
else:
input_mtime = os.path.getmtime(input_path)
output_mtime = os.path.getmtime(output_path)
if input_mtime > output_mtime:
do_convert = True
print(f"[{output_path}] は存在しますが、[{input_path}]の方が新しいので更新します")
else:
print(f"[{output_path}] は存在しますが、[{input_path}]の方が古いので更新しません")
else:
do_convert = True
if not do_convert: return False
try:
# ファイル読み込み (動画ファイルも ffmpeg 経由で音声のみ読み込み可能)
audio = AudioSegment.from_file(input_path)
except Exception as e:
print(f"ファイル読み込みエラー: {e}", file=sys.stderr)
# sys.exit(1)
return False
if sample_rate:
audio = audio.set_frame_rate(sample_rate)
print(f"オーディオファイル [{output_path}] を作成中...")
try:
audio.export(output_path, format=format, bitrate=bitrate)
except Exception as e:
print(f"書き出しエラー: {e}", file=sys.stderr)
# sys.exit(1)
return False
print(f"オーディオファイルを作成しました: {output_path}")
return True
[ドキュメント]
def main() -> None:
"""
スクリプトのエントリポイント。コマンドライン引数を解析し、ファイル変換を実行します。
詳細説明:
`argparse` モジュールを使用して、入力ファイル、出力フォーマット、出力パス、
ビットレート、サンプリングレート、更新/上書きオプションなどのコマンドライン引数を定義します。
指定された入力パターンに一致するすべてのファイルに対して `convert_to_audio` 関数を呼び出し、
個別にオーディオ変換処理を実行します。変換処理の開始前に、設定された引数情報を
ユーザーに表示します。
:returns: この関数は何も返しません。
:rtype: None
"""
parser = argparse.ArgumentParser(
description="汎用的な MP3 抽出・変換プログラム"
)
parser.add_argument(
"input",
help="入力ファイルパス (音声/動画形式ファイル)"
)
parser.add_argument(
"-f", "--format",
default="mp3",
help="出力ファイルタイプ (省略時はmp3)"
)
parser.add_argument(
"-o", "--output",
help="出力 MP3 ファイルパス (省略時は入力名から生成)"
)
parser.add_argument(
"-b", "--bitrate",
default="192k",
help="MP3 ビットレート (例: 128k, 192k; デフォルト: 192k)"
)
parser.add_argument(
"-r", "--samplerate",
type=int,
help="サンプリングレート (Hz, オプション)"
)
parser.add_argument(
"--update",
type = int,
default = 0,
help = "出力ファイルが存在している場合、元ファイルの方が新しい場合のみ変換"
)
parser.add_argument(
"--overwrite",
type = int,
default = 0,
help = "出力ファイルが存在していても上書き"
)
print()
print("汎用的な MP3 抽出・変換プログラム")
args = parser.parse_args()
files = glob.glob(args.input)
print(f"入力ファイル: {args.input}")
print(f" ファイル: {files}")
print(f"出力フォーマット: {args.format}")
print(f"出力ファイル: {args.output or '自動生成'}")
print(f"ビットレート: {args.bitrate}")
if args.samplerate:
print(f"サンプリングレート: {args.samplerate} Hz")
else:
print("サンプリングレート: 省略")
print(f"update: {args.update}")
print(f"overwrite: {args.overwrite}")
for f in files:
convert_to_audio(f, args.format, args.output, args.bitrate, args.samplerate, args.update, args.overwrite)
input("\nPress ENTER to terminate>>\n")
if __name__ == "__main__":
main()