fc2ブログ

OpenAIのWhisper APIを使う

 ChatGPT関連のネット記事を読んでいる中で、同社OpenAIが開発した音声認識AIのWhisperのAPIが利用できるようになったとの記事を見つけました。

 2023/3/1のOpenAIの記事によると、ChatGPTとWhisperモデルがAPIで利用できるようになり、開発者は最先端の言語(チャットだけでなく!)と音声テキスト変換機能にアクセスできるようになった。オープンソースのWhisper large-v2モデルをAPIで使用できることで、はるかに高速で費用対効果の高い結果が得られ、具体的には以下のことが可能になるとのこと。
 ・音声が含まれている言語に音声を書き起こす。
 ・音声を英語に翻訳して書き起こす。
ファイルのアップロードは現在25MBに制限されており、次の入力ファイルタイプがサポートされている: mp3、mp4、mpeg、mpga、m4a、wavおよびwebm。

今回、Whisper APIに加え、以前試したことがある、
 ① Google Documentの音声入力(無料)
 ② AzureのSpeechToTextサービス(一定使用までは無料)
も合わせて比較・評価してみました。

音声の題材は、稲盛和夫さんの経営講和の「成功の方程式」からの一節を使いました。mihon_230326.png音声はWAVファイルとして事前準備しました。講演での話し言葉で、言い直しもある音声をAIがどのように認識して文字起こしをするか、一つずつ見て行きましょう。

① Google Documentの音声入力
 Google Documentで新規ファイル開いて「ツール ー 音声入力」を選択すると、準備は完了です。GoogleDocument_1_230326.pngドキュメントの左上のマイクマークを押すと、音声認識が開始され、文字起こしが始まります。GoogleDocument_2_230326.png 文字起こしの結果は以下の通りで、細かい部分(漢字の表記がひらがなのままや誤変換)はともかく、大きく誤認識している所もありました。また、句読点が全くなく、どこで区切れば良いのか、直感的にも分かりにくい結果でした。また、大きく認識外れしている部分もあり、なぜ外れるのか?よく分かりません。ひどいですね・・。Google_230326.png (誤) → (正)
・お経 → 経営 ・・ なぜ間違えるのか?確かに稲盛さんは得度されておられるが・・。
・何回 → なんかを
・なのいらないした後 → なんかいろいろないっぱい、こう ・・ 話し言葉で難?
・飲み慣れて → いうのはみんな挙げて
・雨が → アメリカ
・禿 → 挙
・だから → ですから
・は家でもですよ2分が → たちでもですね。運不運が
・よく✖️ → よく言われております。 ・・ 文末が勝手に消えている。

② AzureのSpeechToTextサービス
 以下のPythonコードを実行させました。AzureのCognitiveServiceのSpeechサービスのKeyアカウントが必要で6行目に指定しておきます。音声ファイルは9行目です。
import azure.cognitiveservices.speech as speechsdk
import time
import re

def from_file():
speech_config = speechsdk.SpeechConfig("・・My key・・", "japaneast")
speech_config.speech_recognition_language="ja-JP"

audio_input = speechsdk.AudioConfig(filename="./inamori.wav")
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_input)

print("Recognizing first result...")

done = False
def stop_cb(evt):
print('CLOSING on {}'.format(evt))
nonlocal done
done = True

#認識部分だけを取り出します。
def split(evt):
st = re.search(r'\".+?\"',str(evt))
print(st.group(0).strip('"'))

# 認識を行った時の設定
speech_recognizer.recognized.connect(split)

# 認識が終わる時の設定
speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)

# 処理前の時刻
t1 = time.time()

# 認識開始
speech_recognizer.start_continuous_recognition()
# 音声が終わるまでループを続けます
while not done:
time.sleep(.5)
# 認識終了
speech_recognizer.stop_continuous_recognition()

# 処理後の時刻
t2 = time.time()
# 経過時間を表示
elapsed_time = t2-t1
print(f"経過時間:{elapsed_time}")

from_file()
実行結果は以下の通りでした。Google Documentよりは改善されたものでした。Azure_230326.png (誤) → (正)
・ふーん → 不運
・ヒーローに適 → 非論理的 ・・ 音は合っている?・・(笑)
・賞 → 書
・ふんふん → 運不運

③ OpenAIのWhisper API
 参考サイトを元に、以下のPythonコードを実行させました。4行目でOpenAIのキーを設定し、6行目で音声ファイルを指定して、7行目でWhisperAPIを呼び出しています。
import os
import openai

openai.api_key = " ** My Openai key ** "

audio_file= open("./inamori.wav", "rb")
transcript = openai.Audio.transcribe("whisper-1", audio_file)
print(transcript["text"])
実行結果は以下の通りでした。見ての通り、GoogleDocumentやAzureのSpeechToTextに比べ、誤認識が少ない結果でした。openai_230326.png結果を深読みすると、話し言葉を「書き言葉」にあえて変換して、分かりやすくしている感じも見受けられます。恐るべしです。
・なんかいろんな → いろいろな
・いっぱいこう、あの → いっぱい
・条件をですね → 条件も
・良くないというふうによく言われております → 良くないとよく言われております

今回の評価で、OpenAIのWhisper APIがGoogleDocumentやAzureのSpeechToTextに比べて、一番精度が良い音声認識結果であると考えました。今回、このAPIを利用した際の費用は、67secの音声で0.01$程度(1.3円程度)でした。文字起こしを行う手間を考えると、良心的な価格と思いました。
スポンサーサイト



実家に帰省する

 昨日(3/20)、実家(生家)から自宅に帰ってきました。4泊5日の滞在でしたが、実父の認知症の状況を生で共有できました。介護をしている実母とそれを近くで見守っている姉の苦労がよく分かりました。離れて生活している私は金銭面のフォローと帰省時の家廻りの困りごとや肉体労働?の対応です。
 帰省の間に実家の玄関に設置した手すりのレンタルの契約手続きと、倉庫内の不用物の廃棄・掃除と、徘徊防止用に玄関に予備鍵(内側と外側の2種類)を設置しました。

 徘徊対応については、過去2回、歩行もままならない中、勝手に玄関のドアを開けて外出したことがあるために行いました。一度は実母が短時間の外出の中、鍵を自分で開けて外出し、外の段差に足を取られて転倒し、頭を強く打ち、倒れていた所を近所の人に見つけてもらい、助けてもらったことがありました。

 鍵をつける必要性を感じ、外側は「留守わからん錠」、内側は「ワイヤーロック」を取り付けました。設置後の様子はこんな感じです。key230321.png実母にも施錠/解錠の動作確認をしてもらい、安心して帰宅の途につきました。

 いつも博多を去る時は寂しくてつらいんですよね。特に新幹線で小倉を出て新関門トンネル(全長18,713m)に入って、通り抜けることで気持ちが完全に切り替わるんですね。過去と未来の間のトンネルです。今回、小倉を立ってから新関門トンネルに入るまでを動画で撮影しました。車窓からたまに見える海(関門海峡)を見ると、再び現実に戻る寂しさを感じます・・。

 ただ、天気も非常に良かったので気分を戻して博多から京都までの新幹線の旅を満喫することにしました(山陽新幹線はトンネルが多く、山間部を走るので景色を十分楽しめないのが難点ですが・・)。暇つぶしに、携帯のGPSを使って停車駅のMAPのスナップショットと撮りながら・・。 Shinkansen230321.png 前回の帰省の際は、関西が大雨で在来線が止まっていたので、苦労して自宅に戻りましたが、今回はスムーズに帰ることができました。
 今後、実父の認知症はさらに悪化していくと思いますが、定期的に帰省して一緒に過ごせる時間を大事にしたいと思います。

縦書き日本語OCRを試す

 縦書きの日本語文章が書かれた画像から文字を抽出すべく、GoogleドキュメントとTesseractを用いた方法を試してみました。

 まず、Googleドキュメントです。目的の画像ファイルをGoogleドライブにアップロードし、その画像を選択して、右クリックし、「アプリで開く」-「Googleドキュメント」を選択すると、OCR_1_230319.png Googleドキュメントが起動し、画像と一緒にOCRされ抽出された文章が表示されました。OCR_2_230319.png初期画面は超巨大なフォントで表示され、なんじゃこりゃ状態でしたが、フォントサイズを小さくすると、こんな感じになりました。OCR_3_230319.png出典はマルクス・アウレーリウス著、神谷美恵子訳の『自省録』の一部です。 Googleドキュメントの添削結果は以下の通りです。赤字が過不足文字、誤認文字です。OCR_4_230319.png
 次に、Tesseractです。Macのターミナルから以下のコマンドを入力しました。jpn_vertは縦書き用の学習データです。
tesseract p1.png p1.txt -l jpn_vert
出力されたp1.txtを添削すると以下の通りです。OCR_5_230319.png
 過不足文字数、誤認文字数をカウントするとGoogleドキュメントが29文字、Tesseractが57文字で、Googleドキュメントの方が誤認識が少ないことが分かりました。

[Googleドキュメント 誤認29文字]
・はかど -> × (3)
・I -> 一 (1)
・ひだぼり -> × (4)
・× -> 款彫 (2)
・猟 -> 舞踊 (2)
・× -> 二 (1)
・」-> × (1)
・ト・ヘーゲモニコン -> × (9)
・× -> を (1)
・× -> な (1)
・× -> 親切、 (3)
・× -> 徳 (1)

[Tesseract 誤認57文字]
・× -> 一 (1)
・× -> 、 (1)
・× -> めに私は起きるの (8)
・× -> ついっているの (7)
・鏡 -> 蟻 (1)
・學時 -> 蜘蛛 (2)
・務 -> 馳 (1)
・喜時 -> 款彫 (2)
・と -> こ (1)
・人 -> × (1)
・ば -> は (1)
・4 -> × (1)
・混 -> 汲 (1)
・っ -> × (1)
・護 -> 謹 (1)
・若 -> 苦 (1)
・岐 -> 呟 (1)
・宇 -> 寡 (1)
・志 -> 邁 (1)
・× -> けにはいかない (7)
・× -> れつき能力がな (7)
・× -> らしたり、人に取入 (9)

また、別の画像ファイルでも同様に縦書き日本語OCRを試してみようと思います。

ポケットWi-Fiルータを買う

 父親が先月末に要介護3に認定され、今後のことを家族と話すために、休暇を取って、今週木曜日(3/16)から実家の博多に久々に帰省する予定です。

 要介護3の心身状態をネット記事から引用すると、以下の通りですべて父親に当てはまっています。
  ・立ち上がりや片足立ちなどの複雑な動作が自力ではできない。
  ・歩行や立位保持が1人でできない場合がある。
  ・排泄、入浴などの日常生活全般に介護を必要とする。
  ・着替えや掃除など身の回りのことができない。
  ・認知症による問題行動が見られる。
 実家には母親、実家の近くに姉が住んでおり、父親の身の回りは母親、フォローは姉に行ってもらっていますが、実家から離れた所で生活している私はまだ社会人になっていない子供もいるので、会社を辞めて実家に戻るわけにも行かず、金銭面でのフォローしかできていません・・。

 前回帰省したのは、22年7月中旬でコロナ第七波がピークになる前の頃でした。毎回、実家に帰って困るのは、実家にはネット環境がないことです。帰省中に会社の仕事が急に入って来ても携帯でテザリングして、VPN経由で会社のサーバにアクセスしなくてはならず、作業効率もよくありません。会社の仕事は会社携帯(iPhone)のテザリングを使いますが、個人用途のネット利用はポケットWi-Fiをレンタルして以前は使っていました。ただ、コロナ禍になり、在宅勤務が増えた頃からポケットWi-Fiのニーズが増えてきたのか、品薄で希望機種を借りることが出来ずに、直近では「ハズレ」を立て続けに引いてしまっています。

 ちなみに過去レンタルして最悪だったポケットWi-Fiは「macaroon」というものです。レンタル会社に希望機種の在庫がない?ので(本当はこのmacaroonしかないのでは?)送られてきたものですが、一瞬発注を間違えたのかなとも思いました。
 実家はソフトバンクの拠点でありながら、立地環境のせいか、ソフトバンクの電波が非常に弱いです。このmacaroonもソフトバンクでは快適に使えるといいながら、全くつながりませんでした。苦情を言って返金はしてもらいましたが・・。

 その後、この1、2年は、必要最小限のネット利用にとどめ、個人携帯(Android)のテザリングで対応している有り様でした。今後、親の関係で帰省することが増えることも考えられるので、今回Wi-FiルータとプリペイドSIMの組み合わせで個人で所有することにしました。

 購入したのはNECのAtermモバイルルータ MP02LN-SWです。また、プリペードSIMは「DoCoMoのMVNO回線 データ専用 SIMカード 10GB/180日」を選びました。10GB使い切るか、使用開始から180日間で利用できなくなるSIMカードで、帰省などの短期間利用には最適なものと思いました。MVNOは、Mobile Virtual Network Operator(仮想移動体通信事業者)の略で無線通信インフラを他社から借り受けてサービスを提供する事業者のことですね。

 初めての利用ということもあり、セットアップは若干手こずりましたが、無事に動作確認できました。Alterm_230312_1.pngSIMカードはnanoSIMで写真の通りセットし、Alterm_230312_2.pngロックしました。Alterm_230312_3.png電池をセットして、電源ONさせると、Wi-Fi親機として機能し、Internet設定は未完了の状態でした。そこで、iPadにスターターアプリを入れてセットアップしました。
 Internetに接続するためのAPN(Access Point Name)は手動で設定しました。設定の途中で「SIMを認識できません」という一瞬しくじったかなと思う状況がありましたが、本体を数回再起動する中で正常に認識できるようになりました。
 スターターアプリを使わなくてもWi-Fi親機のURLにアクセスすることで、各種設定もできそうですね。設定後に気付きました。次回はこちらからトライしてみようと思います。Alterm_230312_4.png 実家に持ち込んでも無事に利用できることを祈ります。DoCoMo回線なので大丈夫と思いますが・・。

追記(3/17)
 帰省後、実家で使用しました。たまに通信が遅いかなと思う時がありますが、問題なく利用できています。やはりDoCoMoなのでしょうね。

ChatGPT APIを使う

 OpenAIが3/1(米国時間)、ChatGPTのAPIの提供を開始したことをネット記事で知り、早速使ってみました。

 すでにこのサービスを利用されている方のWeb情報を参考にサンプルコードを実行すると、以下のエラーが出ました。opennai_error_230304.png「クォータを超過しています。プランと課金内容をご確認ください。」とのエラーです。ChatGPTのAPIは有償なので、課金コースが違うというエラーのようです。

 OpenAIにログインして、個人アカウント(Personal)をクリックして、Manage accountを選択して、openai_1_230304.pngUsageをクリックすると、ChatGPTがリリースされる以前にOpenAIをFreeアカウントで利用していた時の情報が表示されました。昨年(2022年)の6月にFreeアカウントが失効していました。openai_2_230304.pngBillingのOverviewを選択して、Set up paid accountをクリックして、openai_3_230304.png個人利用(I'm an individual)を選択した後にopenai_4_230304.pngカード情報を入力すれば、アカウントを作成できました。openai_5_230304.pngopenai_6_230304.png利用金額の上限の$25はopenai_7_230304.png有償サービスを使いすぎないように、念のため付けたリミットによるものです。
 最後に、個人のAPIキーを新規に作成し、取得しておきます。openai_8_230304.png
 準備ができましたので、以下のコードを実行させました。前回のブログに書いた同じ質問である、式3x^2-xを因数分解する問題です。
import openai
openai.api_key = "sk- ・・・・ HlVG" # User API key

res = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "日本語で返答してください。"
},
{
"role": "user",
"content": "Factorize the following equation: 3x^2-x."
},
],
)
print(res)
print(res["choices"][0]["message"]["content"])
実行結果はJSON方式で返ってきます。
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "\n\n3x^2-x\u306e\u56e0\u6570\u5206\u89e3\u306f\u3001x(3x-1)\u3067\u3059\u3002",
"role": "assistant"
}
}
],
"created": 1677924931,
"id": "chatcmpl-6qJ ・・・・・ wnIze",
"model": "gpt-3.5-turbo-0301",
"object": "chat.completion",
"usage": {
"completion_tokens": 23,
"prompt_tokens": 37,
"total_tokens": 60
}
}
3x^2-xの因数分解は、x(3x-1)です。
当然ながら、チャット形式で実行させた結果と同じ結果が返ってきました。

今回、ChatGPTのAPIを使える形にしましたが、自分のソフトウェアに組み込む用途以外には使わないような気がします。無償のChatGPTでも十分遊べますからね。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: