CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

Wav2Vec2.0を使った音声認識を試してみました!

こんにちは、技術開発の三浦です。

暑い日が続き、若干夏バテ気味な毎日です。しかし今朝、早起きして外を歩いたら思っていたよりも風が涼しくて気持ちよく感じました。早寝早起きして涼しい時間に活動時間を持っていくことが出来れば、もしかしたら夏バテが良くなるかもしれない。そんなことを思いました。

最近NLP(自然言語処理)関連の技術を色々調べているのですが、キーボードを使って入力しているテキストを、マイクを通じた音声認識で入力出来たら面白そうだなと考えるようになりました。もしそれが可能なら、NLPのモデルの活用の幅がだいぶ広がりそうです。これまで音声認識の世界に触れたことがなかったので、音声認識を実現する手法について簡単に調べ、ひとまずやってみよう、と実際に音声認識を試してみた話をご紹介します。

Wav2Vec

音声認識について調べていくと、特に最近の記事で情報が多いのが「Wav2Vec」という手法でした。Wav2VecはFacebook AI Researchが2019年に発表した論文「WAV2VEC: UNSUPERVISED PRE-TRAINING FOR SPEECH RECOGNITION」で提案されている、ラベルが付いていない状態の大量の音声データに対して教師なし学習で事前学習を行い、少ないラベル付きデータでも高精度なモデルを生成することを可能にした手法です。

  • wav2vec: Unsupervised Pre-training for Speech Recognition
  • Steffen Schneider, Alexei Baevski, Ronan Collobert, Michael Auli
  • Submitted on 11 Apr 2019 (v1), last revised 11 Sep 2019
  • https://arxiv.org/abs/1904.05862

事前学習といえば、画像解析の世界では「ImageNet」による事前学習済みモデルや、自然言語処理の世界ではBERTやGPTといったTransformerのモデルがすぐに思いつきますが、音声認識の世界でも同様に事前学習の手法が活用されていることを初めて知りました。

Wav2Vecのモデルの構造は、大きく2つで構成されています。1つ目が音声データをエンコーディングする為のネットワーク(encoder network)で、2つ目がエンコーディングされたデータから文脈を抽出するネットワーク(context network)です。それぞれ畳み込みニューラルネットワーク(CNN)が使われています。

Wav2Vecには2020年、同じくFacebook AIの発表した論文「wav2vec 2.0: A Framework for Self-SupervisedLearning of Speech Representations」によって新しいバージョン「Wav2Vec2.0」が登場しました。Wav2Vec2.0のモデル構造では、encoder networkは引き続きCNNが使われているのですが、context networkの部分にTransformerが使われています。

  • wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations
  • Alexei Baevski, Henry Zhou, Abdelrahman Mohamed, Michael Auli
  • Submitted on 20 Jun 2020 (v1), last revised 22 Oct 2020
  • https://arxiv.org/abs/2006.11477

「Transformer」といえば、AIコミュニティ「Hugging Face」が思い浮かびます。もしかしたらモデルが公開されているかな、と調べてみると、Wav2Vec2.0の事前学習済みのモデルがHugging Faceで公開されていることが分かりました。しかも日本語でFine-tuningしたモデルも公開されているようです。

ここからはHugging Faceで提供されている日本語対応のWav2Vec2.0のモデルを使って、実際に自分の音声データを認識させる方法について調べたことをご紹介します。

セットアップ

まずは必要なライブラリをインストールします。

pip install torch transformers[ja] librosa

torchtransformers[ja]はWav2Vec2.0のモデルを使用するために必要で、librosaは音声ファイルを読み込むために使用します。

音声ファイル(wav)の読み込み

事前にサウンドレコーダーアプリなどで自分の音声を録音し、ファイルに保存しておきました。

「むかーしむかし、あるところに」としゃべっている様子

このファイルをPythonで読み込むには、librosaを使って以下のようにします。

import librosa
sound_file = 'data/test.wav'
sound_data,_ = librosa.load(sound_file, sr=16_000)

読み込んだデータは、numpy.ndarrayの形式で、形状は(52000,)のようになりました。形状は音声の録音時間によって変化すると思います。読み込む際サンプリングレートを指定出来るのですが、Hugging Faceで利用するモデルの説明に従い、16kHzを指定して読み込みました。

processorとmodelのダウンロード

Hugging Faceでは「Automatic Speech Recognition」というタスクで様々な音声認識のモデルが提供されています。「facebook/wav2vec2-large-xlsr-53 」というモデルを日本語でFine-tuningしたものが多く公開されているようで、今回もそのうちの一つを利用してみました。

色々試してみた結果、私の音声を一番正しく認識してくれたのがこちらのモデルでした。

huggingface.co

利用するモデルを決めたら、Hugging Faceからprocessormodelをダウンロードします。

import torch
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor

model_id = 'モデルIDを指定'

processor = Wav2Vec2Processor.from_pretrained(model_id)
model = Wav2Vec2ForCTC.from_pretrained(model_id)

モデルのサイズはかなり大きいようで、ダウンロードサイズは1.18Gと表示されていました。

音声認識の実行

あとはlibrosaで読み込んだ音声データをprocessorでモデルインプット用のデータに変換してmodelに入力し、出力結果をprocessorで加工して音声認識した結果のテキストを取得します。

input_data = processor(sound_data, sampling_rate=16_000, return_tensors="pt", padding=True)

with torch.no_grad():
    logits = model(input_data.input_values, attention_mask=inputs.attention_mask).logits

predicted_ids = torch.argmax(logits, dim=-1)
predicted_sentences = processor.batch_decode(predicted_ids)

print(predicted_sentences)

出力結果

['昔昔あるところに']

このように音声を認識し、テキストを得ることが出来ました!

まとめ

ということで、今回はHugging Faceで提供されているWav2Vec2.0の日本語対応モデルを使って音声認識を試してみたお話を紹介させて頂きました。今回調べたことを通じて、音声認識の世界でも事前学習の手法やTransformerが成果を出していることを知ることが出来ました。

音声からテキストを抽出することが出来たので、あとはこのテキストをNLPの処理にかけることで色々な仕組みを作ることが出来そうです。また今回の推論処理はGPUを使用しなくても数秒で結果を得ることが出来たので、割とコンパクトなハードウェア構成で実現することも出来そうだと思いました。

今回の手法を発展させると、音楽の解析も出来るかもしれません。こちらもいずれまた、ご紹介できればと思います。