Speech-to-Text(Reazonspeech/Amzon Transcribe/Whisper ) を試してみた!
はじめに
ChatGPT等のAIの進化については盛り上がりを見せているが、音声データのテキスト化についても精度や速度がとても向上しているとのこと。
各エンジン(モデル?)を使った場合の比較サイトはいくつかあるので、特徴についてはそういうのを参考に何となく把握したのだが、いざお試しで実装しようとしたら意外と手こずってしまった。同じ事をやろうとしたら、また手こずる気がするのでメモを残しておく。
実施環境
■ PCスペック
CPU:Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz 3.20 GHz
メモリ:8.00 GB
※API利用のものは、本PCのリソースでモデルを動かしているわけではない。
■ OS
Windows 10 Pro
■ 各種SW&パッケージのバージョン(今回インストールするもの含む)
- git 2.44.0.windows.1
- python 3.9.13
- pip 21.3.1
※基本はvenvで作成した仮想環境を activate してpythonパッケージのインストールはしている。
メモ内容
以下の3つのエンジンを動かすための流れとサンプルコードの記載。
- Reazon Speech v2(オンプレCPUで実行)
- Amazon Transcribe(クラウドネイティブなSaas)
- Whisper(オンプレCPUで実行)
※ Whisper自体は、OpenAIが提供するオープンソースの音声認識モデルのため、ローカル環境や自分のサーバー上で実行することが可能。Whisper APIは クラウドベースのサービス。
性能比較について、以下のサイトを参考にしている。
●ReazonSpeechv2 と Nue-asr と whisper の比較
●whisper と Amazon Transcribe の比較
① Reazon Speech v2
1). 必要ソフトウェアのインストール・アップデート
以下2つのソフトをインストールする必要がある。
-
SoX のインストール(※音声の認識や加工をターミナル上で出来るソフト)
⇒ https://sourceforge.net/projects/sox/
※インストール後はPATHを通す必要がある。 -
Microsoft Visual C++ 14.0 以降をインストールする必要あり
⇒ https://tech.nkhn37.net/python-pip-install-error-microsoft-visual-c-14/
2). 事前に必要な pythonパッケージのインストール
pip install numpy # 基本的なパッケージ
pip install pandas # 基本的なパッケージ
pip install Cython
pip install typing_extensions
※GPU を使う場合は、事前に pytorch のインストールも必要らしい
3). ReazonSpeech v2 のセットアップ
git clone https://github.com/reazon-research/ReazonSpeech
pip install ReazonSpeech/pkg/nemo-asr
一応上記の pip install が正常に成功すれば使える様にはなるはずだが、学習済みモデルをローカルに保管して置いた方が使用時のメモリ展開に時間がかからないため、以下の様に少し改造した。
-
Hugging Face より、該当のモデルを直接ダウンロードする
⇒ https://huggingface.co/reazon-research/reazonspeech-nemo-v2/tree/main
→ reazonspeech-nemo-v2.nemo -
[仮想環境] > Lib > site-packages > reazonspeech\nemo\asr\transcribe.py に追記
# load_model() メソッドをコピーして、最後の return 部分だけ変更
def load_model_from_local(device=None):
"""Load ReazonSpeech model
Args:
device (str): Specify "cuda" or "cpu"
Returns:
nemo.collections.asr.models.EncDecRNNTBPEModel
"""
if device is None:
if torch.cuda.is_available():
device = "cuda"
else:
device = "cpu"
from nemo.utils import logging
logging.setLevel(logging.ERROR)
from nemo.collections.asr.models import EncDecRNNTBPEModel
return EncDecRNNTBPEModel.restore_from(restore_path='[ダウンロードしたモデルの格納フォルダパス]/reazonspeech-nemo-v2.nemo',
map_location=device)
- [仮想環境] > Lib > site-packages > reazonspeech\nemo\asr\_init_.py の修正
from .interface import TranscribeConfig
#from .transcribe import transcribe, load_model # 修正前
from .transcribe import transcribe, load_model, load_model_from_local # 修正後
from .audio import audio_from_numpy, audio_from_tensor, audio_from_path
4). ReazonSpeech v2 を動かすサンプルコード
from reazonspeech.nemo.asr import load_model, transcribe, audio_from_path, load_model_from_local
# 実行時にローカルに保存済みモデルをメモリに展開する(3分くらいかかった)
model = load_model_from_local(device='cpu')
# ⇒ メモリ8GB搭載のPCだが、展開完了後80%近くの使用率となる。
# ローカルの音声ファイルを読み込む
filepath = "./sample1.mp3"
audio = audio_from_path(filepath)
# 音声認識を適用する
result = transcribe(model, audio)
② Amazon Transcribe
1). ローカルにある音声ファイルをS3にアップロード
S3に適当なバケットを作成する。設定は基本デフォルトのまま。
バケット名 ⇒ 任意
オブジェクト所有者 ⇒ ACL無効(推奨)
アクセス設定 ⇒ パブリックアクセスをすべてブロック
バケットの作成が問題なく完了していれば、そこに任意のファイル(今回はmp3で試している)をアップロードする。
2). IAMユーザーを作成
API実行するためのIAMユーザーを作成し、AmazonTrascribe
を操作するための権限を付ける。
- IAM > ユーザー > ユーザーの作成
- 適当なユーザー名を入力し、『次へ』 ※"AWS マネジ~を提供する" のチェックは入れてない。
- 許可の設定では、ポリシーを直接アタッチする。(以下のポリシーを付けた)
- AmazonS3FullAccess
- AmazonTranscribeFullAccess
※pythonからAWSサービスを実行する際に、IAMのアクセスキーが必要となるため、このタイミングで作っておいても良い。
- IAM > ユーザー > [ユーザー名] に入り、『セキュリティ認証情報』のタブをクリック
- 少し下にアクセスキーに関わる項目があるため、『アクセスキーを作成』
- ユースケースは『ローカルコード』を選択して、『次へ』
- 作成されたタイミングで、アクセスキーとシークレットアクセスキーをメモしておく。
3). ローカルPCのPythonから、AmazonTranscribeを試してみる
Pythonには事前に必要な pythonパッケージをインストール
# Boto3とは、AWSの各種サービスをPythonから操作するためのライブラリ。AWSが公式で提供している。
pip install boto3
# boto3==1.34.123
AmazonTranscribe の実行サンプルコード
# ライブラリのインポートとリージョン設定
import os
import boto3
os.environ['AWS_DEFAULT_REGION'] = 'ap-northeast-1'
# 実行インスタンスの作成
transcribe_client = boto3.client(
'transcribe',
aws_access_key_id="【上記のアクセスキー】",
aws_secret_access_key="【上記のシークレットアクセスキー】",
#aws_session_token='YOUR_SESSION_TOKEN' # IAMロール利用の場合のみ設定
)
# 文字起こししたいテキストなどを設定
bucket_name = "***********************"
object_name = "sample.mp"
media_file_url = 's3://' + bucket_name + '/' + object_name
language = "ja-JP"
job_name = "transcribe_test_job1" # ここは任意で良い!!
# 文字起こしジョブの開始
transcribe_client.start_transcription_job(
TranscriptionJobName=job_name,
LanguageCode=language,
Media={
'MediaFileUri': media_file_url
},
#OutputBucketName=bucket_name
)
# ジョブのステータスをポーリングして確認
while True:
status = transcribe_client.get_transcription_job(TranscriptionJobName=job_name)
if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
break
print("Waiting for job to complete...")
time.sleep(15)
# ジョブが完了したら、結果を取得
if status['TranscriptionJob']['TranscriptionJobStatus'] == 'COMPLETED':
transcript_uri = status['TranscriptionJob']['Transcript']['TranscriptFileUri']
print(f"Transcription completed. Transcript URL: {transcript_uri}")
# 文字起こし結果を取得して表示
import requests
result = requests.get(transcript_uri)
transcript = result.json()
print("Transcript text:")
print(transcript['results']['transcripts'][0]['transcript'])
出力はjsonファイルなので、
これまではAmazon Transcribeで管理されているS3バケットに結果が保存され、ユーザーは署名付きURLから結果をダウンロードする必要がありました。
③ Whisper
1). 事前に必要な pythonパッケージのインストール
pip install git+https://github.com/openai/whisper.git
2). Whisper を動かすサンプルコード
import whisper
model = whisper.load_model("base")。
# ローカルの音声ファイルを読み込み、音声認識を適用する
filepath = "./sample1.mp3"
result = model.transcribe(filepath)
print(result["text"])
Discussion