Skip to content

大量の音声データから笑い声部分を集めるやつ

License

Notifications You must be signed in to change notification settings

OzoneAsai/laughter-collector

 
 

Repository files navigation

Laughter Collector

音声データから笑い声を抽出してデータセットを作成するためのスクリプト群です。また非言語音声や感嘆詞の抽出も可能です(が誤りが多いかもしれません)。日本語で書き起こしてそれを使って判定しているので、日本語以外の音声ではうまく動かないかもしれません

原理

  • 音声ファイルを読み込み、-40dBを無音とみなしスライス (slice.py)
  • スライスした音声データに対して、Whisperで日本語へ書き起こしを行う (laughter_collector.py内部)
  • 書き起こしデータに対して、正規表現を用いて笑い声かどうか・非言語音声や感嘆詞かどうかを判定 (pattern.py)

使い方

Python>=3.10とNVidia GPUが必要です。

インストール

git clone https://github.com/litagin02/laughter-collector
cd laughter-collector
python -m venv venv
venv\Scripts\activate
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install -r requirements.txt

元データの準備

  • 音声ファイルたちをディレクトリ(以下path/to/original_dataとする)に格納
  • 各ファイルの拡張子は".wav", ".mp3", ".flac", ".ogg", ".opus"のいずれかである必要があります(必要に応じてutils.pyを書き換えれば他もいけます)。
  • path/to/original_dataでは好きなようにサブディレクトリたちの階層を作ってそこに音声ファイルを格納してください。デフォルトでは直下の音声ファイルは反映されず、1つ下の階層からのみ反映されます。直下のみを反映するには-nrオプションを指定してください。
  • 結果は相対パスを保持したまま指定したpath/to/outputに保存されます。

データセットの作成

python collect_laughter.py -i path/to/original_data -o path/to/output

裏ではslice.pyが呼び出され、マルチプロセスで音声を切り出してpath/to/output/tempにスライスされた音声が保存されて行き、それを本体のスクリプトが順次読み込んで書き起こしをバッチ処理で行います。

細かい他の引数はコードを参照してください。

結果

元々の音声ファイルが以下のような構造だったとします。

path/to/original_data
├── subdir1
│   ├── foo.wav
│   ├── bar.mp3
│   └── baz.ogg
└── subdir2
    ├── subdir3
    │   └── qux.mp3
    └── quux.flac

結果は以下のような構造になります。

path/to/output
├── laugh
│   ├── subdir1
│   |   ├── laugh.csv
│   │   ├── foo_0.wav
│   │   ├── foo_1.wav
│   │   ├── bar_0.wav
│   │   └── baz_0.wav
│   └── subdir2
│       ├── subdir3
│       |   ├── laugh.csv
│       │   └── qux_0.wav
|       ├── laugh.csv
│       └── quux_0.wav
├── nv
│   ├── subdir1
│   |   ├── nv.csv
│   │   ├── foo_2.wav
| ...
└── trans
    ├── subdir1
    │   └── all.csv
    └── subdir2
        ├── subdir3
        │   └── all.csv
        └── all.csv

ここでfoo_0.wavfoo.wavの0番目のスライスを示しています。trans.csvは書き起こしデータです。またlaugh.csvは笑い声と判定されたスライスの書き起こし、nv.csvは非言語音声や感嘆詞と判定されたスライスの書き起こし、またall.csvはそれ以外も含めた全てのスライスの書き起こしです。

注意

  • 笑い声の判定と非言語音声の判定では笑い声が優先されます。
  • 笑い声や非言語音声の判定の正規表現は改良の余地があると思うので、必要に応じてpattern.pyを変更してください。
  • 非言語音声の判定は誤りが多く、特定のひらがなから単語ができてしまう場合それが非言語音声として判定されることがあります。結果を見ながら、そのような単語をexclude_words.txtに追加してください(毎回このファイルが参照されるので、スクリプト実行中でも変更が反映されます)。
  • スライスの細かいパラメータや、笑い声正規表現等は、それぞれsplice.pypattern.py内を参照しつつ必要ならば変更してください。
  • デフォルトでは笑い声等判定のための書き起こしにはHugging FaceのWhisperのmediumモデルが使われます(笑い声や非言語音声かどうかさえ判定できればよく書き起こし精度はそこまで必要がない)、が必要に応じてcollect_laughter.pyの引数--model large-v2等でモデルを指定できます。
  • 細かい他の引数等はコードを参照してください。

その他のスクリプト

結果の笑い声ファイルたちに対するFaster Whisper (large-v2) での書き起こし:

python transcribe.py -i path/to/output/laugh -o transcriptions.csv

About

大量の音声データから笑い声部分を集めるやつ

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%