ルモーリン

jpegに音声を付けてmp4にするスクリプト

投稿:2023-03-22

マストドン(fedibird)で写真に合成音声を付けた動画をトゥートするようになった。 手軽に写真と音声から動画を作りたいので、写真を選択してテキストを入力するだけで動画になるスクリプトを作りたい。

# 【注意】powershellはBOM必要
# 静止画にボイスをつけてmp4を生成

if (1 -eq $args.Length -and ".jpg" -eq (Get-Item -Path $args[0]).Extension) {
	$jpg_path = $args[0]
	Write-Output "JPEGファイル $jpg_path"
	$wav_path = [System.IO.Path]::ChangeExtension($jpg_path, ".wav")
	Write-Output "WAVEファイル $wav_path"
	$mp4_path = [System.IO.Path]::ChangeExtension($jpg_path, ".mp4")
	Write-Output "MP4ファイル $mp4_path"
	$text = Read-Host "ボイスを入力してください"
	if (0 -lt $text.Length) {
		Write-Output "音声を生成"
		&"voicepeak" --say "$text" --out $wav_path --narrator "Japanese Male 3" --emotion happy=100,fun=100,angry=0,sad=0 | Out-Null
	}
	if (Test-Path -Path $wav_path) {
		Write-Output "動画を生成"
		$ArgList =
			"-loglevel", "warning",
			"-y",
			"-i", $jpg_path,
			"-guess_layout_max", "0",
			"-i", $wav_path,
			"-filter_complex", "[0:v]scale=width=-2:height=1080[video];[1:a]channelmap=0|0[audio]",
			"-map", "[video]",
			"-map", "[audio]",
			$mp4_path
		Start-Process -Wait -NoNewWindow -FilePath "ffmpeg" -ArgumentList $ArgList

		Write-Output "音声を削除"
		Remove-Item -Path $wav_path
	}
	if (Test-Path -Path $mp4_path) {
		Write-Output "動画を再生"
		Start-Process -FilePath $mp4_path
	}
} else {
	Write-Output "JPEGファイルを1個だけ選択してください。"
}

Pause

ffmpegとvoicepeakをインストールしてパスを切ります。 それとスクリプトへのショートカットを自分のアカウントのsendtoフォルダに置きます。

jpgファイルを選択、右クリックで「送る」から「jpgtext2mp4」を選択するとスクリプトが起動します。 「ボイスを入力してください」に台詞を入力すると合成音声が作られて、jpgと合わせて動画が作られます。