読者です 読者をやめる 読者になる 読者になる

daimac64's blog

50代からのWEBアプリ開発とその他もろもろの備忘録

音声ファイルを分割

録音した音声ファイルを無音部分で分割したので適当なフリーソフトがないか検索しているとAnacondaで簡単に実現できることが分かった。

VS Codeの統合ターミナル(Windows/macOSを意識しなくてよくなる)で環境を整える。

動画・音声処理用のライブラリ FFMPEG をインストー

$ conda install -c menpo ffmpeg

音声データ処理用のライブラリ Pydub をインストー

$ pip install pydub

Windows版で、エラーが発生!

Unknown or unsupported command ‘install’

$ where pip

でpipのインストール状況を確認するとAnacondaの他にPerlのpipがインストールされていることがわかる

  • C:\Dwimperl\perl\bin\pip
  • C:\Dwimperl\perl\bin\pip.bat
  • C:\ProgramData\Anaconda3\Scripts\pip.exe

以下のいづれかの方法で対処できると思います。お好みで。

  • PerlをUninstallする
  • 環境変数Pathを再定義する
  • フルパスでAnacondaのpipを指定して使用する
  • Anacondaのpipのpathをカレントディレクトリにして実行

Mac版では、別のエラーが発生!

RuntimeWarning: Couldn’t find ffmpeg or avconv - defaulting to ffmpeg, but may not work

ffmpegがうまく認識できないいないようだ。 インストールのミス?

ffmpegへのパスは通っている。 ffmpegコマンドを実行するとPermission Denied。確かに実行権がない。

$ conda uninstall -c menpo ffmpeg

FFMPEGを一旦アンインストール。

アンインストール後、念のため、以下のフォルダを削除

Users/user/anaconda/pkgs/ffmpeg-x.x.x-0 (xは、バージョン番号)

その後、再インストールで正常に動作するようになりました。

$ conda install -c menpo ffmpeg

音声ファイルの分割方法は、以下の通りです。

"""
コマンドライン引数で指定されたカレントディレクトリのwavファイルを
無音部分で分割します。
分割されたwavファイルは、splitフォルダに保存されます。
"""

import sys          # モジュール属性 argv を取得するため
import datetime
from pydub import AudioSegment
from pydub.silence import split_on_silence

ARGVS = sys.argv  # コマンドライン引数を格納したリストの取得

ARGC = len(ARGVS) # 引数の個数

if ARGC != 2:   # 引数が足りない場合は、その旨を表示
    print("Usage: # python " + ARGVS[0] + " wavfilename")
    quit()         # プログラムの終了

NAME = ARGVS[1]

START = datetime.datetime.now()
print("-- 解析開始 -- ", START)

SOUND = AudioSegment.from_file("./" + NAME + ".wav", format="wav")

CHUNKS = split_on_silence(

    SOUND,

    # ms以上の無音がある箇所で分割
    min_silence_len=5000,

    # dBFS以下で無音とみなす
    silence_thresh=-16,

    # 分割後500msだけ、無音を残す
    keep_silence=500
)
END = datetime.datetime.now()
print("-- 解析終了 -- ", END, " elapsed_time:", (END - START))
# 分割数の表示
print("分割数:{0}".format(len(CHUNKS)))

for i, chunk in enumerate(CHUNKS):
    chunk.export("./split/"+ NAME + "_{0}.wav".format(i), format="wav")

実装速度はかなり遅いです。

45分のwavファイルを分割するのに10分程度かかりました。

マシンスペックは、以下の通りです。

インタプリタだからか?だったら、コンパイルしてみよう!

$ python -m compileall [ファイル名]
$ python __pycache__/[ファイル名].[Pythonのバージョン].pyc

処理時間同じだった。なんでだろう?

そうか単に難読化してるだけだったかぁ。

速度的には、こちらがよいかも? stabucky.com

Audacityのパラメータを同様に設定したが、同じように分割されない。なぜ?