Whisper の文字変換でエラー

(2024-12-06)

最近、今さらながら英語を勉強しようと思い立ち、こういう無駄な努力を何度も繰り返してきましたが、 今度は speak という AI の英語アプリがとても優秀なのでもう一度だけ挑戦したいと思っています。

昔から私の英語力はほとんど絶望的なレベルで何をやっても進歩しませんでしたが、ほんとにすべての方法を試してみたのかというと、 英語を話す人間との継続的な会話だけはやって来ませんでした。そんな環境を作るのは現実的には不可能でした。

そして、英語が上達するためには英語で会話するというこの方法しかないと言うことに今更ながら気づいたのでした。

私のような無茶苦茶な英語を話す人間に対して、いつでも我慢強く対応してくれるような立派な人格者は地球上に存在するとは思えず、 しかし AI であればキレることなくいつでも相手になってくれます。

こんなこと言ったら笑われるかもしれないなどと気を使う必要がありません。 AI を使った speak こそ私が思い描いていた理想の英語学習環境だと思います。

ボキャブラリーが足りない

そうは言うものの、少ない語彙力でいつまでも進歩のない会話を続けるのはやはり非効率的で、積極的にボキャブラリーを増やす必要があると思います。

むかし、アルクのボキャビルマラソンをしたことがありますが、それはそれなりに有意義ではありました。

以前からアルクでは 12,000 の単語をリストアップして難易度で 12 段階に分けて配布しています。

単語リスト・品詞・語義まではアルクにメールするとダウンロードリンクを教えてもらえるようです。 ただし、例文・音声まで希望すると当然ながら有料になるようです。

ネット上に csv を置いていないのは、著作権がアルクにあってネット上にそれを提示するのを禁止するとの意思で、個人的に使用する分には自由なようです。

何に著作権があるのかというと、12,000 の単語の分類方法だとのこと。英単語の分類方法に著作権を主張するのは少し違和感があります。

それはそうと、ボキャブラリーを増やすために、以前私が作ったデータベースはアルクの 12,000 のリストを参考にしたものですが、例文・音声は自分で独自に作成しました。

苦労したのは例文を作成することで、世界中のサイトにアクセスして、なるべく短くてその単語の意味がわからなくても類推できるような文章を自分で探してきてデータベース化しました。

そして、そのテキストを amazon polly で音声化しました。 amazon polly では男女数名の音声を選択することができ、いくつか試しているうちに 100 万語を超えてしまって課金されました。

そして、そのデータベースを wordpress でブログ上に展開して少しだけ勉強したのですが、やはりそれだけでは英語は進歩しませんでした。 この方法は、単にボキャブラリーを増やすために特化した方がいいようです。やはり大事なのはリアルタイムの会話なのです。

今回ボキャブラリーを増やす目的で、今回以前作ったデータベースを再設定しようとしたのですが、どこかに行ってしまってどうしても見つかりません。

音声ファイルからテキストを作成

音声ファイルはすべて残っていたので、そこからもう一度データベースを作れないかと考えました。

python を使えば音声ファイルからテキストファイルを作成することはできます。

whisper aaa.mp3 --model tiny --language English

10,000 以上残っていた音声ファイル(mp3)からテキストファイルを作成します。 これ、ものすごく時間がかかります。1 つを処理するのに 2 - 3 秒かかるので約 7 時間ほどでしょうか。

しかも時々エラーが混入します。

例えば以下のような音声ファイル。

この音声からテキストファイルを作成します。

The children learn edition and subtraction.

whisper は「addition」を「edition」と間違えてテキスト化しています。

そこで、「The children learn addition and subtraction.」で音声化します。

そしてこの音声ファイルをもう一度テキストに変換します。

The children learn addition and subtraction.

そうするときちんと変換されました。

つまり、python と言えども聞き取れない英語の音声があるようで、そんなもの私が聞き取れるはずがありません。

どれくらいあるのかすぐにはわかりませんが、テキスト化されたものをデータベースに書き込んで確認してみました。

import glob
import os
import pymysql
class Txt2db():
def __init__( self ):
self.host = 'localhost'
self.username ="root"
self.password = "pass"
self.dbname = "vocabura"
self.txtdir = "/home/user/ミュージック/after/"
def txtlist( self ):
txtl = glob.glob( self.txtdir + '*.txt')
insdata = []
for et in txtl:
txtname = os.path.splitext(os.path.basename( et ))[0]
with open( et ) as f:
s = f.read()
insdata = [txtname, s]
self.insertDB( insdata )
def insertDB( self, ar ):
conn = pymysql.connect(host= self.host,
user= self.username,
db= self.dbname,
password= self.password,
cursorclass=pymysql.cursors.DictCursor)
try:
with conn.cursor() as cursor:
sql = "UPDATE wordlist SET example = %s WHERE word = %s ;"
params = ( ar[1], ar[0])
cursor.execute( sql, params )
conn.commit()
finally:
conn.close()
if __name__ == '__main__':
t2b = Txt2db()
t2b.txtlist()

効率の悪いプログラムですが、4,000 行を 20 秒程度で書き込んでくれます。

出来上がったデータベースで以下のようなクエリを実行します。 このクエリは登録された単語が本文中で使われていない場合にデータを抽出するものです。

SELECT w1.wordID, w1.word, w1.mean, w1.example
FROM wordlist w1
WHERE w1.example NOT LIKE CONCAT('%', w1.word, '%');

これを実行すると、

count 単語 意味 例文
1 bend 曲げる She bent the hanger back into shape.
2 dare 挑戦 He took my dear to jump from the tree.
3 accompany 同⾏する Children must be accompanied by an adult.
4 addition 付加、⾜し算 The children learn edition and subtraction.
5 adviser 相談相⼿ She's an advisor to the President on Foreign Affairs.
6 bare 裸の He was there to the west.
7 bathe ⼊浴させる We'll be the baby after she eats.
8 bathtub 浴槽 The bath tubs are basically like huge swimming pools.
9 battery 電池 I need some new batteries for my Walkman.
10 beefsteak ⽜⾁の切り⾝、ビフテキ I think I'll have the beef steak.

複数形になったり過去形になったりして正常に変換されているものもありますが、明らかにおかしな変換がされているものがたくさんあります。

聞き取りが正常であるものも含めると、単語がそのまま例文の中で使用されないのは 1,100 個を超えていました。
これはあまりにも多いと思います。

whisper の精度を上げる

whisper の精度を上げることができるようです。

全部で 5 つの段階で動かすことができます。

モデル パラメータ数 実行速度(相対値) 精度
Tiny ~39M 4~8倍リアルタイム速(約8秒) 精度が低め
Base ~74M 2~4倍リアルタイム速(約15秒) 標準的
Small ~244M リアルタイム速(約60秒) 良好
Medium ~769M 0.5倍リアルタイム速(約120秒) 高精度
Large ~1550M 0.25倍リアルタイム速(約240秒) 非常に高精度

ただし、凄まじい時間がかかります。

私のコンピュータ環境で、短い英文をテキスト化するのに 2.2 秒ほどかかりますが、それは Tiny にしていたからで、Base にしてみたところ edition と addition はきちんと区別されました。 しかし、これまでの倍つまり 5 秒程かかりました。

でもこれで精度が上がるのであれば、一晩中コンピュータを動かしておけばいいだけのことです。