Python + ESPnetで音声データにおける日本語の文字起こし(ASR)を実装する

Python + ESPnetで音声データ(60s以内)における日本語の文字起こし(ASR)で整理します.

今回はGoogle ColabとGoogle Driveを連携させて,notebook形式で実行してます.

Google Colaboratory(以下Google Colab)は、Google社が無料で提供している機械学習の教育や研究用の開発環境です。開発環境はJupyter Notebookに似たインターフェースを持ち、Pythonの主要なライブラリがプリインストールされています。
引用元:Google Colabの使い方 (opens new window)

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

# Google Colabのファイル構成

プロジェクトディレクトリはASRとしています.度々,省略しています.

本稿では,岡田斗司夫さんの切り抜き動画 (opens new window)を文字起こしします.

ASR
├── /ASR_FILES
|   ├── okada.mp4 <- 文字起こし動画
|   └── /output/okada.txt <- 文字起こしたテキスト
└── ESPnetASR.ipynb <- 実行用ノートブック

# Google Driveと連携

Google ColabとGoogle Driveを連携させて,作業ディレクトリを作成します.

# Google Driveと連携
from google.colab import drive
drive.mount('/content/drive')
# 作業ディレクトリの作成
%cd /content/drive/MyDrive/
!mkdir -p ASR
%cd ASR
!ls

# モジュールのインストール

下記のコマンドでモジュールをインストールします.

# ffmpeg
!apt-get install ffmpeg
# pip
!pip install torch
!pip install espnet_model_zoo

# 長い音声データでのASR実行

実行過程は下記の通りです.

  1. ライブラリのインポート
  2. 動画データから音声データへ(mp4→wav)
  3. wavファイルをテキストに変換
  4. 0〜3をdefでまとめる
  5. ASR実行

# ライブラリのインポート

import wave
import struct
import math
import os
from scipy import fromstring, int16

import subprocess

import shutil
import glob

import soundfile
from espnet_model_zoo.downloader import ModelDownloader
from espnet2.bin.asr_inference import Speech2Text

# 動画データから音声データへ(mp4→wav)

ffmpegで動画から音声への変換を実行します.

ESPNetでは下記のwavファイルの設定でないと,ちゃんと文字起こしされません.

  • Channel num : 1
  • Sample width : 2
  • Sampling rate : 16000

上記の設定を加味した変換は下記の通りとなります.

# 音声ファイルへの変換
def mp4_to_wav(mp4f):
    wavf = mp4f.replace('.mp4', '.wav')
    subprocess.run(['ffmpeg', '-i', mp4f, '-ar', '16000', '-ac', '1', '-y', '-f', 'wav' ,wavf], 
                   encoding='utf-8', stdout=subprocess.PIPE)
    return wavf

# 複数のwavファイルを順にテキストに変換

# 複数ファイルの音声のテキスト変換
def wav_asr_espnet(wavf, asr_model):
    output_text = ''
    # 複数処理
    print('音声のテキスト変換')
    # wavファイルの読み込み
    speech, _ = soundfile.read(wavf)
    # 音声のテキスト変換
    nbests = asr_model(speech)
    text, *_ = nbests[0]

    # 各ファイルの出力結果の結合
    output_text = output_text + text + '\n\n'
    # wavファイルを削除
    os.remove(wavf)
    print(wavf)   
    return output_text

# 1〜4をdefでまとめる

# mp4からwavへの変換から音声のテキスト変換まで
def mp4_asr_espnet(mp4f):
    # mp4のディレクトリ
    input_dir = os.path.dirname(mp4f)
    # 学習済みをダウンロードし、音声認識モデルを作成
    d = ModelDownloader()
    speech2text = Speech2Text(
            **d.download_and_unpack("kan-bayashi/csj_asr_train_asr_transformer_raw_char_sp_valid.acc.ave"),
            device="cuda"  # CPU で認識を行う場合は省略
            )

    # 出力ディレクトリ
    os.makedirs(input_dir + '/output/', exist_ok=True)
    
    # 音声ファイルへの変換
    wav_file = mp4_to_wav(mp4f)
    
    # 複数ファイルの音声のテキスト変換
    out_text = wav_asr_espnet(wav_file, speech2text)
    
    # テキストファイルへの入力
    mp4f_name = os.path.basename(mp4f)
    txt_file = input_dir + '/output/' + mp4f_name.replace('.mp4', '.txt')
    print('テキスト出力')
    print(txt_file)
    f = open(txt_file, 'w')
    f.write(out_text)
    f.close()

# ASR実行

mp4_asr_espnet(mp4_file)

# まとめ

本稿では,Python + ESPnetで音声データ(60s以内)における日本語の文字起こし(ASR)で整理しました.

# 参考サイト

ESPnet2で始めるEnd-to-End音声処理 (opens new window)

複雑な音声処理タスクを一気通貫で実装できる! ESPnetの概念と特徴について (opens new window)

簡単に作れるTTSモデル:ESPnetを用いたつくよみちゃんTTSモデル作成 (opens new window)

ESPnet による音声認識入門 ~ESPnet Model Zoo 編~ (opens new window)

End-to-End音声処理ツールキットESPnetの紹介 (opens new window)

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

国別covid-19感染者データでアニメーション棒グラフを作成しよう

国別covid-19感染者データでアニメーション棒グラフを作成しよう

国別covid-19感染者データでアニメーション棒グラフを作成します.

CycleGANの概要

CycleGANの概要

CycleGANの概要を記述します.