PythonでMAD作成支援ツールを作った話(音声認識)

#免責事項
この記事には素人が書いたガバコードが含まれています。このコードを実行したことにより発生した損害に対して、作者は一切の責任を負いかねます。

##動機
MADが作りたい->でも細切れの音声をいちいち開いて確認するのめんどい->かと言って全部のファイルに名前つけるのも面倒臭い

###動作確認した環境
Windows10
Python3.9.1

##事前準備
* Pythonのインストール
* Speech Recognizerとpyaudioをpipで落としておく
pyaudioの導入に失敗した人は[この記事](https://qiita.com/sugi-juku/items/c92f8f170a6b455e15f2)に解決策が載ってました
* Audacityのインストール(日本語化を推奨)

##下ごしらえ
Audacityにスライスしてない生の音声をD&Dとかで投げる![D&Dで放り込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/3c6e843a-69d8-9b73-58c4-54cef3f961f2.png)

Ctrl+aで全選択してから*重要*エフェクト->増幅で音を一定にする(初期値で足りなければ適当にパラメータいじる)
![増幅する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/c73b2781-e032-4b34-78b2-736405562b80.png)
![いじらんでもおそらく問題ない](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/541bbfe8-e767-e8be-21f3-d2d0980ce1bf.png)

解析->無音の検出でスライスする
![とても便利](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/17d651dc-e920-708d-78b9-0835e7e3eb2e.png)
上が閾値で真ん中が無音と判定するまでの時間(下はたぶん関係ない)
元音声ファイルによるけど
閾値を厳しめ(-50dB~)にして検出時間を短くするといい感じ
ある程度きつめにカットされるから自分でいらないラベルを削る必要があるかも
![オプション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/5daba4e8-adf4-ab2d-44b9-24aa2ade4763.png)

ラベルがつけられたら書き出す(ファイル->書き出し->複数ファイルの書き出し)
![ラベリング完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/d3e2a6d6-0f94-c715-c8f2-ede08f4d827e.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/fbb329b4-c610-6b86-4374-d11509e00686.png)

書き出し先フォルダとかを設定する
命名は"ファイル名プレフィックスの後に番号付け"を推奨
![適当にフォルダやらを指定する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/3c248eff-64b4-b83c-8f33-f1e8fb1d6357.png)

書き出しが終わるまで待つ

##調理

```
import pyaudio
import speech_recognition
import os
import glob
import json
import time

work_dir = input('作業先ディレクトリを絶対パスで指定してください > ')
if work_dir[-1:] != '\\':
    work_dir = work_dir + '\\'

def rename(dir):
    #ファイルリストの取得と存在確認
    files = glob.glob(dir + '*')
    if len(files) == None:
        print('有効なファイルが存在しませんでした')
        return

    print('ファイルの取得に成功: ' + str(len(files)) + '件')

    #ディレクトリを移動
    if (len(dir) == None) or os.path.exists(dir) == False:
        print('パスが間違っているようです')
        return
    if os.getcwd() != dir:
        os.chdir(dir)

    #初期化
    r = speech_recognition.Recognizer()
    index = 0

    for file in files:
        if os.path.exists(file) == False:
            print('ファイルが存在しません')
            break
        if '.wav' not in file:
            print('wavファイルではありませんでした')
            continue

        print('認識を開始...')
        text = ''
        try:
            with speech_recognition.AudioFile(file) as source:
                audio = r.record(source)
            result = r.recognize_google(audio, language='ja-JP')
            text = json.dumps(result, ensure_ascii=False)
        except Exception as e:
            print('読み取りに失敗しました。ファイル名を自分で設定してください')
            text = 'failed'

        if '"' in text:
            text = text.strip('"')
            

        print('認識結果: ' + text)
        os.rename(file, dir + str(index) + '_' + text + '.wav')
        index += 1
        print('ファイル名の変更が完了しました')

        time.sleep(1)
        
    print('ファイル名の書き換えが終わりました')
    
rename(work_dir)
```
拡張子.pyで保存、Powershell開いて(例)```python3 hoge.py``` 実行する
作業先ディレクトリにはさっきスライスを書き出したフォルダを指定する(例)C:\hogehoge\

完成品の名前がfailedになってるやつは解析失敗してるので自分でファイル名書き直してください

##できたもの

精度はお察しレベルだけどないよりはマシかな？程度
![failedは解析失敗した奴](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770613/e0dc2b08-b18c-1cba-64d2-b226bd09e0d4.png)

##結論

これいる？

#参考
https://qiita.com/daiarg/items/ff1b9f91d0804e6a8f18
https://qiita.com/sugi-juku/items/c92f8f170a6b455e15f2