先日、オーディオ切替ボタンをつくったときに”AppleScript”というものを知った。
ざっくりいうと、操作をスクリプトで実行できるもの。
CLI(黒い画面のやつ)と違うのは、CLIがより内部的な操作ができて、AppleScriptは普段の操作レベルのスクリプト化、みたいな感じだろうか。
このAppleScriptとはなにかをchatGPTにきいて調べてたら、アプリ化して毎回同じ操作を自動で行えることがわかった。
おお、これは便利そうだと思い、早速使ってみることにした。
自動オーディオファイル変換ツールをつくった
ときどき動画データから音声を抽出したり、WAVをMP3に変換したいときがある。
これまでは、都度動画ソフトやDAW、あるいはオンラインサービスなどで書き出していたのだが、どうやらわざわざそんなことしなくてもPC内で処理できるようだ。
使用するのは”ffmpeg”というコマンドラインツール。
CLI上で指定するだけで、いちいちソフトを開かなくても素早く変換を行ってくれるツールだ。
いままで存在はぼんやり知ってたけど、CLIなので敬遠していた。
これを、AppleScriptで簡単に使えるようにするのが今回の仕組み。
つくりかた
chatGPTとの会話の流れで、「こういうものがつくりたい」と言うと、AppleScriptのコードを書いてくれた。
今回は自分でコードを書くこともなく、試しながら細かい修正をしていくだけで完成できた。
念のためにGeminiにも投げて問題ないか確認はした。
その後、スクリプトエディタ (mac標準で入ってる)で動作確認後にファイル→書き出す、でアプリ化できる。
アプリ化してしまえば、あとはそのアイコンをダブルクリックするだけで実行できる。簡単だ!
使い方
使い方はなるべくシンプルかつ一括で行える形にした。
すごいのは、動画も音声も一括で指定形式に変換できる。
ffmpegがどちらも幅広く対応してるみたいで、おかげでも元データの形式でいちいち悩まなくてよさそう。
変換したい動画や音声ファイルを一つのフォルダに入れ、そのフォルダを選択すると、

こんな感じでポップアップが出る。
出力形式を選ぶと変換が始まり、


変換完了!これだけ。

指定したフォルダの中に、新しくフォルダができて、その中に変換したものが入っている。
これまでいちいちソフトを起動させたりしていたので、めっちゃ早くなった。便利!
感想
今回は完全にノーコードでつくれた。
またこのほかに、初代SP404用にファイル変換し直すツールもつくった。
まだこちらは本体で動作確認してないが、問題ないといいな。
AIのおかげで、簡単なものとはいえアプリっぽいものをつくることができた。
いやーすごいな。
最後にいちおう今回のコード貼っておきます。
AppleScriptなのでmacのみ、かつffmpegはmacportsからのものを使っているので、使える人はあまりいないかもしれませんが。
前回の記事はこちら↓
https://note.com/kodokubu88/n/n5c2ec4ade27f
コード
chatGPTにつくってもらったそのままコピペです。
ffmpeg を MacPorts でインストールしている前提となってます(/opt/local/bin/ffmpeg)
-- ユーザーに対象フォルダを選ばせる
set parentFolderAlias to choose folder with prompt "変換したいフォルダを選んでください"
set parentFolderRef to parentFolderAlias as text
set convertList to {}
set displayText to ""
tell application "Finder"
-- 名前順でファイルを取得
set fileList to sort (every file of folder parentFolderRef) by name
-- 変換先フォルダを作成(なければ新規)
set targetFolderName to "Converted_Audio"
if not (exists folder targetFolderName of folder parentFolderRef) then
make new folder at folder parentFolderRef with properties {name:targetFolderName}
end if
set targetFolder to folder targetFolderName of folder parentFolderRef
-- 対応拡張子
set supportedExtensions to {".wav", ".aiff", ".aif", ".mp3", ".m4a", ".aac", ".flac", ".ogg", ".wma", ".mp4", ".mov", ".avi", ".mkv", ".wmv", ".flv", ".webm"}
repeat with f in fileList
set oldName to name of f
set oldPath to POSIX path of (f as alias)
-- 拡張子判定
set AppleScript's text item delimiters to "."
set nameParts to every text item of oldName
set AppleScript's text item delimiters to ""
if (count of nameParts) > 1 then
set ext to last item of nameParts
else
set ext to ""
end if
if "." & ext is in supportedExtensions then
set end of convertList to {oldName:oldName, oldPath:oldPath}
set displayText to displayText & oldName & return
end if
end repeat
-- 変換先フォルダのPOSIXパス
set targetPath to POSIX path of (targetFolder as alias)
end tell
-- 変換処理
if (count of convertList) > 0 then
display dialog "変換対象一覧:" & return & displayText & return & return & "出力形式を選んでください" buttons {"キャンセル", "MP3", "WAV"} default button "WAV"
set chosenFormat to button returned of result
if chosenFormat is not "キャンセル" then
-- ★★★ 処理中ダイアログ ★★★
display alert "変換中…" message "変換が終わったら、再度ポップアップでお知らせします" giving up after 9999
repeat with itemInfo in convertList
set oldName to itemInfo's oldName
set oldPath to itemInfo's oldPath
-- ベース名取得
set AppleScript's text item delimiters to "."
set nameParts to every text item of oldName
if (count of nameParts) > 1 then
set baseNameParts to items 1 thru ((count of nameParts) - 1) of nameParts
set AppleScript's text item delimiters to "."
set baseName to baseNameParts as text
else
set baseName to oldName
end if
set AppleScript's text item delimiters to ""
-- ffmpeg 実行(MacPorts)
if chosenFormat is "WAV" then
set newName to baseName & ".wav"
set newPath to targetPath & newName
do shell script "/opt/local/bin/ffmpeg -i " & quoted form of oldPath & " -y -vn -ar 44100 -ac 2 -sample_fmt s16 " & quoted form of newPath
else if chosenFormat is "MP3" then
set newName to baseName & ".mp3"
set newPath to targetPath & newName
do shell script "/opt/local/bin/ffmpeg -i " & quoted form of oldPath & " -y -vn -codec:a libmp3lame -qscale:a 2 " & quoted form of newPath
end if
end repeat
-- 完了
display dialog "変換が完了しました!" buttons {"OK"} default button "OK"
end if
else
display dialog "変換対象のファイルはありません。" buttons {"OK"} default button "OK"
end if