先日、オーディオ切替ボタンをつくったときに”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