SoXで音声ファイルを分割してvadエフェクトをかけるバッチファイル

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


すでにある音声ファイルを指定した秒の長さに分割してvadエフェクトをかけたあと結合してまた戻すバッチファイルを作りました。SoXのインストールはSoX(Sound eXchange)で音声感知録音:その1の通りです。

vad_effect.bat


ひとつバッチファイルで完結しているのでバッチファイル名は何でもかまいません。

17行目までが設定項目になります。

デフォルト設定ではバッチファイルがあるフォルダにあるsourceフォルダにあるwavファイルにまずvadエフェクトをかけて3秒以下になった場合はそのファイルは削除します。

3秒より長いファイルはafter_vadフォルダに出力します。

after_vadフォルダにある5秒より長いファイルは5秒ごとに分割してそれぞれにvadエフェクトをかけたあと、再結合したあとafter_vadフォルダに出力します。
@echo off
rem 処理前ファイルのあるフォルダ
set SOURCE_DIR=source
rem 処理前ファイルの拡張子
set EXT=mp3
rem 処理後ファイルを入れるフォルダ
set EXTRACTED_DIR=after_vad
rem 処理後ファイルの拡張子(wav以外への変換はコードの追加が必要)
set OUTEXT=wav
rem vadエフェクト後に分割する間隔(秒)
set F_LEN=5
rem 最初にvadエフェクトをかけたあと削除する音声ファイルの長さ(秒)
set SEC=3
rem 分割処理後に削除する音声ファイルの長さ(秒)
set SEC2=1
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 EXTRACTED_DIR_P=%SD%\%EXTRACTED_DIR%
if not exist "%EXTRACTED_DIR_P%" (mkdir "%EXTRACTED_DIR_P%")
rem 一時作業ファイル
set TMP_DIR_P=%SD%\temp
if not exist "%TMP_DIR_P%" (mkdir "%TMP_DIR_P%")
set /A BULK=%BULK%-1
cd "%EXTRACTED_DIR_P%"
setlocal enabledelayedexpansion
for %%f in ("%SOURCE_DIR_P%\*.%EXT%") do (
  rem 変換後のファイル名
  set F_NAME=%%~nf.wav
  echo %%fをwavに変換して抽出中。
  sox "%%f" "!F_NAME!" vad reverse vad reverse
 echo 抽出後の!F_NAME!の長さが%SEC%秒以下なら削除します。
  rem sox --iで測定できないときのためにTをリセットする。
  set T=0
  for /F "tokens=1 delims=." %%t in ('sox --i -D "!F_NAME!"') do set T=%%t
  if !T! LEQ %SEC% (
    del /Q "!F_NAME!"
    echo !F_NAME!の長さが%SEC%秒以下なので削除しました。
  )
  if !T! GTR %F_LEN% (
    echo !F_NAME!は%F_LEN%秒より長いので%F_LEN%秒ごとに分割してvadエフェクトをかけています。
    sox !F_NAME! "%TMP_DIR_P%\%%~nf-%%5n.wav" trim 0 %F_LEN% vad reverse vad reverse : newfile : restart
    del /Q !F_NAME!
    cd "%TMP_DIR_P%"
    for %%g in (%%~nf*.wav) do (
   echo 分割後の%%gのファイルの長さを調べています。
   set T=0
      for /F "tokens=1 delims=." %%t in ('sox --i -D %%g') do set T=%%t
      if !T! LEQ %SEC2% (
    echo %%gは%SEC2%秒以下なので削除します。
        del /Q "%%g"
      ) 
    )
    echo 分割した%%~nf.wavファイルを結合しています。
    rem 結合するファイルリストをリセット
    set F_LIST=
    rem ファイルリストの要素数
    set C=0
    for %%g in (*.wav) do (
      if !C! EQU %BULK% (
        set F_LIST=!F_LIST! "%%g"
        rem F_LISTのファイルをout0.wavと結合してout.wavにする。
        echo !C!個のファイルを結合中。
        sox "%EXTRACTED_DIR_P%\out0.wav" !F_LIST! "%EXTRACTED_DIR_P%\out.wav"
    rem out0.wavを削除してout.wavをout0.wavに改名する。
        del /Q "%EXTRACTED_DIR_P%\out0.wav"
        move "%EXTRACTED_DIR_P%\out.wav" "%EXTRACTED_DIR_P%\out0.wav"
        set F_LIST=
        set C=0
      ) else (
        if not exist "%EXTRACTED_DIR_P%\out0.wav" (
      echo 最初のファイル%%gを%EXTRACTED_DIR_P%\out0.wavにします。
          move "%%g" "%EXTRACTED_DIR_P%\out0.wav"
        ) else (
          echo %%gをファイルリスト!F_LIST!に追加する。
          set F_LIST=!F_LIST! "%%g"
          set /A C=!C!+1
        )
      )
    )
    if !C! GTR 0 (
   echo ファイルリスト!F_LIST!に!C!個残っているファイルをout0.wavに結合します。
      sox "%EXTRACTED_DIR_P%\out0.wav" !F_LIST! "%EXTRACTED_DIR_P%\out.wav"
   del /Q "%EXTRACTED_DIR_P%\out0.wav"
      move "%EXTRACTED_DIR_P%\out.wav" "%EXTRACTED_DIR_P%\out0.wav"
    )
    if exist "%EXTRACTED_DIR_P%\out0.wav" (
      echo out0.wavを分割前のファイル名!F_NAME!に戻します。
      move "%EXTRACTED_DIR_P%\out0.wav" "%EXTRACTED_DIR_P%\!F_NAME!"
    del /Q "*.wav"
    )
    cd "%EXTRACTED_DIR_P%"
  )
)
endlocal
explorer "%EXTRACTED_DIR_P%"

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

PR

0 件のコメント:

コメントを投稿