SoXで音声ファイルを結合するバッチファイル

前の関連記事:SoXで音声感知録音:その6 話し声を準リアルタイム録音2


SoXで音声感知録音:その3 自動録音環境構築まとめの音声ファイルを結合するバッチファイルsox_concat.batは一つずつSoXを起動してファイル結合をしているため時間がかかっていました。SoXは複数ファイルを引数にして一度に結合できるので音声ファイルを結合するバッチファイルを作り直しました。

sox_concat.bat


バッチファイルと同じフォルダにあるsourceフォルダにいれた音声ファイルを結合してバッチファイルと同じフォルダにout0.wavファイルを出力します。

先頭のファイルの後ろに結合するので先頭のファイルは書き換えられます。

EXTで入力ファイル形式、OUTEXTで出力ファイル形式を指定できます。

SoXの引数の長さには限度があるのでglob Filename too longというエラーが出てくる場合はBULKの数値を小さくします。
@echo off
rem 処理前ファイルのあるフォルダ
set SOURCE_DIR=source
rem 処理前ファイルの拡張子
set EXT=wav
rem 処理後ファイルの拡張子
set OUTEXT=wav
rem ファイルを結合するときに一括処理するファイル数。大きくする程処理が速くなるがあまり大きくするとエラーがでる。
set BULK=200

rem sox.exeへのパスの設定。環境変数PATHに設定しているときは不要。
rem Windows7 64bitの場合。
path %PATH%;C:\Program Files (x86)\sox-14-4-2
rem WindowsXPの場合。
path %PATH%;C:\Program Files\sox-14-4-2
rem sox.exeにパスが通っているかの確認。
set T=0
for /F "delims= " %%t in ('sox --version') do set T=%%t
if %T%==0 (
  cls
  echo sox.exeが見つかりません。
  echo.
  pause
  exit
)
rem SoXの既定の音声デバイスの設定。
set AUDIODRIVER=waveaudio
rem このスクリプトがあるディレクトリ。
set SD=%CD%
set SOURCE_DIR_P=%SD%\%SOURCE_DIR%
if not exist "%SOURCE_DIR_P%" (mkdir "%SOURCE_DIR_P%")
set /A BULK=%BULK%-1
setlocal enabledelayedexpansion
echo %SOURCE_DIR%フォルダにある%EXT%ファイルを結合しています。
rem 結合するファイルリストをリセット
set F_LIST=
rem ファイルリストの要素数
set C=0
cd "%SOURCE_DIR_P%"
for %%g in (*.%EXT%) do (
  if !C! EQU %BULK% (
    set F_LIST=!F_LIST! "%%g"
    rem F_LISTのファイルをout0.wavと結合してout.wavにする。
    echo !C!個のファイルを結合中。
    sox "%SD%\out0.wav" !F_LIST! "%SD%\out.wav"
  rem out0.wavを削除してout.wavをout0.wavに改名する。
    del /Q "%SD%\out0.wav"
    move "%SD%\out.wav" "%SD%\out0.wav"
    set F_LIST=
    set C=0
  ) else (
    if not exist "%SD%\out0.wav" (
   echo 最初のファイル%%gを%SD%\out0.wavにする。
      sox "%%g" "%SD%\out0.wav"
      del /Q "%%g"
    ) else (
      echo %%gをファイルリスト!F_LIST!に追加する。
      set F_LIST=!F_LIST! "%%g"
      set /A C=!C!+1
    )
  )
)
rem !F_LIST!に!C!個残っているファイルを結合する。
if !C! GTR 0 (
 echo !C!個を結合中。
  sox "%SD%\out0.wav" !F_LIST! "%SD%\out.wav"
 del /Q "%SD%\out0.wav"
  move "%SD%\out.wav" "%SD%\out0.wav"
)
cd %SD%
if not %OUTEXT% EQU wav (
  sox out.wav out0.%OUTEXT%
)
endlocal
PR

0 件のコメント:

コメントを投稿