Python embeddable package を用いて環境構築不要な簡易 GUI 付き音声文字起こしツールを作成/部署内展開した話

embeddable-python-whisper AI



(注意:初版公開日の 2023/08/21 時点では部署内への展開前であり,身内をテストユーザーとしてレビューいただいている状況です.)
社会人たるもの,クライアントや社内に対する会議への参加は不可避で,付随して議事録作成もほぼ不可避な業務と言えるでしょう.
特に 2 時間を越すような長丁場の会議である場合は,脳みそや指が疲れたりして,どこかで抜け漏れが発生してしまう...なんてこともあると思います.
そこで出てくるのが web 会議ツールの録画であったりボイスレコーダーで,音声を再生/巻き戻しを繰り返しながら必要箇所を文字起こししていく行為は確実性は高いと言えますが,再生/巻き戻しするためのソフトと,文字起こしでタイプするためのテキストエディタを行ったり来たりするので,非常に作業性が悪いですし,とても退屈な作業です.(何回か経験しました.)

上記を解決するために,当該記事では,OpenAI whisper を用いて文字起こしするツールの導入方法について紹介します.
しかしながら,

  • 「whisper で文字起こししてみた」のような web 記事は非常に多く存在している
  • 文字起こししたい人たちは,例えば「全くプログラミングに触れたことのない方」など,サクッと環境構築したり whisper を動したりができない人も多く想定される(少なくても弊社内に存在する)
  • 文字起こしツールは市販でもそこそこの金額で売られていたり,制限付きのクラウドサービスも存在するが,手持ちのパソコンのローカル環境で,環境構築ほとんど無しで,何より無料で使いたいというニーズがあるであろう
  • 業務効率化
  • AI の民主化

といったモチベーションから,無料かつ環境構築不要な文字起こしツールを作成して社内展開したので,当該記事では,これの作成方法について紹介していきます.

(whisper の説明については親切な公式 web サイトや多くの記事があるため,当該記事では取り扱いません.)

想定環境

  • Windows 10 / 11・・・・弊社及び一般会社員御用達 OS,かつ,Mac or linux 使用者/会社であれば,恐らく,制限なく自力で whisper 動作可能と予想
  • Python embeddable package で構築したい python バージョンと同じ python をインストール・・・・標準ライブラリの tkinter が python embeddable package には入っていないため.
  • gitbash, cygwin, mingw, busybox などの linux コマンドが使える環境(.tar.gz の展開/圧縮に使用)・・・・ない場合は,git をインストールする際についでについてくる gitbash をおすすめしますが,訳あってインストールしたくない場合は,busybox (HP: https://frippery.org/busybox/ , ダウンロードページ: https://frippery.org/files/busybox/busybox.exe) はインストール不要のポータブル版として使えるのでおすすめです.

ツール作成方法ハイライト

ツール作成方法は簡易的に言うと以下です.

  1. Python embeddable package をダウンロード
  2. pip 導入
  3. 必要なパッケージを pip install
  4. tkinter をインストールしている python のフォルダからコピー
  5. ソースコードなどの必要なファイルを github (https://github.com/KazutoMakino/transcript) から持ってくる
  6. ffmpeg.exe をダウンロードして所定のフォルダに保存(展開先においてインストール済みでパスが通っているなら,この工程は無視)
  7. 各モデルや必要なファイルを web からダウンロードし,ローカルの所定のフォルダに保存しておく(例えばオフライン PC やプロキシ突破を不要にしたいなどインターネット接続無しで動作させたい場合)
  8. embeddable 版 python をフォルダごと移動し,簡易的に実行するためのバッチファイルを整備
  9. (配布したければ .tar.gz 形式で固めて配布)

詳細は次章から記載していきます.

ツール作成方法詳細

1. Python embeddable package をダウンロード

当該ツールは .exe 化して配布せず,環境構築不要でポータブル版として動作する python embeddable package を用います.
(ちなみに .exe 化しない理由は,そもそも .exe 化が面倒,変更や追加が容易,別にソースを秘匿化する必要がない,などです.)

まずは,python 公式サイトのダウンロードページにアクセスします.(ダウンロードページにいない場合は,下図のように Downloads タブをクリックすることで移動できます.)

Downloads ページ下部の “Looking for a specific release?” 欄の表から,今回は,”Python 3.11.4″ を選択.

選択した python バージョンのダウンロードページ下部の “Files” から,展開先 PC の仕様にあった embeddable package をダウンロード.(下図では,一般的な windows 64-bit 版としています.)

ダウンロードした “python-{バージョン}-embed-amd64.zip” を展開します.
この展開された中身が,embeddable 版の python 環境です.

2. pip 導入

これから各種ライブラリを pip install していきますが,embeddable 版には公式のパッケージインストーラーである pip が最初から入っていません.
ですので,以下の手順で pip を導入していきます.

展開したフォルダに有る “python{バージョン}._pth” をテキストエディタで開き,5 行目が “#import site” となっているので,”#” を消してコメントアウトから復帰させて保存します.(下図では python311._pth を gitbash の vim で開いています.)

次に,pip を導入するために必要な python ファイル: “get-pip.py” をこちらのリンク (https://bootstrap.pypa.io/get-pip.py) からダウンロードします.
ファイルの保存の仕方は,上記リンクを右クリックして “名前をつけて保存” を選択する,もしくは,リンクを開いて右クリックして “名前をつけて保存” を選択します.
そして,ダウンロードしてきた “get-pip.py” を,先程展開した “python-{バージョン}-embed-{PC}/” フォルダ内に移します.

次にコマンドプロンプトを起動し,この階層まで移動します.
home からここまで来るのが面倒なので,このフォルダ上でコマンドプロンプトを起動させたい場合は,エクスプローラーで対象のフォルダ内に入り,下図のようにパスが表示されている枠に “cmd” を記入して enter キーを押下することにより,このフォルダ上でコマンドプロンプトが開きます.

開いたコマンドプロンプトにて,以下を実行することで pip / setuptools / wheel といったパッケージインストールに必要なパッケージがインストールされます.

.\python.exe get-pip.py

単に “python” でなく “.\python.exe” としている理由は,仮に OS に python がインストールされていてパスが通っている場合に,embeddable 版でなくインストールしている側の python を指定しないように,明示的に「ここの python」という意味で “.\python.exe” としています.

もしここで社内プロキシなどの影響でネットワークエラーが出る場合は,以下を実行してプロキシ回避したのちに,もう一度上記実行してください.

set HTTP_PROXY=http://{プロキシの IP アドレス}:{ポート番号}
set HTTPS_PROXY=http://{プロキシの IP アドレス}:{ポート番号}

企業によってはユーザー名とパスワードが必要な場合があります.
その場合は,以下の形式で実行してください.

set HTTP_PROXY=http://{ユーザー名}:{パスワード}@{プロキシの IP アドレス}:{ポート番号}
set HTTPS_PROXY=http://{ユーザー名}:{パスワード}@{プロキシの IP アドレス}:{ポート番号}

上記のユーザー名やパスワードは管轄の社内 IT 部門から配布されたり,また,プロキシの IP アドレスやポート番号についても社内イントラにて公開されていることが多いと思います.
もしも,プロキシの IP アドレスが分からない場合は,プロテクトされているかもしれませんが,以下コマンドにて確認できます.

netsh winhttp show proxy

続いてポート番号は,windows の 「設定」→「ネットワークとインターネット」→「プロキシ」 に進むことによりポート番号が確認できると思います.

パッケージのインストールなど,社内プロキシを突破する必要がある場合は,今後,上記を実行してください.

現状インストールされているパッケージを見るには,以下を実行します.

.\python.exe -m pip list

必要なパッケージを pip install

続いて,ツール実行に必要なパッケージを pip install していきます.
Python embeddable package の環境に pip install したい場合は,embeddable 版のフォルダでコマンドプロンプトにて以下を実行します.

.\python.exe -m pip install {パッケージ名称}

もちろん,社内プロキシがある場合は前の節を参考に “set HTTP_PROXY=・・・” で事前に突破しておくことが必要です.
今回必要なパッケージを加味して,以下を実行することにより必要なパッケージを導入します.

.\python.exe -m pip install openai-whisper tqdm librosa pysimplegui pytz pydantic

しかしながら,embeddable 版の環境では以下のようなエラーが出ます.

Collecting future (from ffmpeg-python==0.2.0->openai-whisper)
  Using cached future-0.18.3.tar.gz (840 kB)
  Preparing metadata (setup.py) ... error
  error: subprocess-exited-with-error

  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [6 lines of output]
      Traceback (most recent call last):
        File "<string>", line 2, in <module>
        File "<pip-setuptools-caller>", line 34, in <module>
        File "C:\Users\user_name\AppData\Local\Temp\pip-install-7cvu507o\future_3ff65faf7c894ea6a7dead4ce355f2e5\setup.py", line 86, in <module>
          import src.future
      ModuleNotFoundError: No module named 'src'
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

” ModuleNotFoundError: No module named ‘src’ ” ということで,どうやらパッケージ:”future” におけるインストールの時に実行される “setup.py” から,モジュール:”src” が参照できないというエラーであることが分かります.
従って,embeddable 版に future を pip install するためには,future の setup.py の import 周りを書き換える必要があります.

まずは,PyPI (Python Package Index) の future のページ (https://pypi.org/project/future/#files) から “future-{バージョン}.tar.gz” をダウンロードします.

次に,想定環境の章で記載した linux コマンドが使える gitbash などのシェルで,ダウンロードしてきた .tar.gz を以下のコマンドで展開します.(.tar.gz は .zip のようなもので,複数ファイルを .tar でまとめ,gzip により圧縮されたファイル形式を指します.)

tar -xvf ./future-{バージョン}.tar.gz

すると,”future-{バージョン}/” という名称のフォルダにて展開されますので,このフォルダ内直下の “setup.py” をテキストエディタにて開きます.
そして,下図のように,”import src.future” が記載されているよりも上の行に “sys.path.append(“”)” と記載し保存します.

こうすることにより,同階層にある “src/” が参照できるようになります.
次に,この “future-{バージョン}/” フォルダを .zip に圧縮します.
そしてこの圧縮されたファイル “future-{バージョン}.zip” を embeddable 版のフォルダに入れ,このフォルダ上にて,以下のように .zip ファイルを指定して pip install します.

.\python.exe -m pip install .\future-0.18.3.zip

これで,無事に “future” が入りました.
再び以下を実行し,必要なパッケージを導入します.

.\python.exe -m pip install openai-whisper tqdm librosa pysimplegui pytz pydantic

今回は pip install できたかと思います.(WARNING 出ますが無視して構いません.)

tkinter をインストールしている python のフォルダからコピー

embeddable 版の初期状態では,pip と同様に,python の GUI が作れる標準ライブラリである tkinter を用いることができません.
インタラクティブシェルにて実行すると次のとおりです.

C:\Users\user_name\Downloads\python-3.11.4-embed-amd64>.\python.exe
Python 3.11.4 (tags/v3.11.4:d2340ef, Jun  7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'tkinter'

このとおり,「tkinter というモジュールはない」というエラーが送出されました.
embeddable 版で tkinter を用いるためには,インストールしている python 環境があるフォルダ(”{installed python}/” として省略)から以下のファイルを “python-{バージョン}-embed-{PC}/” フォルダの直下に置きます.
(インストール時に推奨されているように “install for all users” にチェックをつけずにインストールした場合は “C:\Users\user_name\AppData\Local\Programs\Python\Python{バージョン}/”,チェックを付けてインストールした場合は “C:¥Program Files (x86)”)

  • {installed python}/DLLs/_tkinter.pyd
  • {installed python}/DLLs/tcl86t.dll
  • {installed python}/DLLs/tk86t.dll
  • {installed python}/Lib/tkinter/
  • {installed python}/tcl/

では,もう一度インタラクティブシェルにて実行してみましょう.

>>> import tkinter
>>> tkinter.TkVersion
8.6

このとおり,tkinter が使えるようになりました.

ツールのパッケージに必要なソースコードを準備

こちらのリポジトリ (https://github.com/KazutoMakino/transcript) をローカルに git clone,あるいは,「Code」→「Download ZIP」 でローカルに .zip ファイルがダウンロードされるのでこれを展開することで,ソースコード群が得られます.
ここで,もし embeddable 版で配布するのであれば,展開された “transcript/” フォルダから

  • “assets/” ・・・・ 配布先用の README ファイルに必要な画像群
  • “src/” ・・・・ ソースコード
  • “README_for_deployment.md” ・・・・ 配布先用の README ファイル(免責事項も記載)

があれば良く,他は不要なので削除します.
また,”README_for_deployment.md” は配布用の README となるので,”README.md” というファイル名に変更するのが好ましいでしょう.(配布用では,もとからある README.md は不要です.)

ffmpeg.exe をダウンロードして所定のフォルダに保存

文字起こしができるライブラリの whisper を動作させるためには “ffmpeg.exe” が必要です.

FFmpeg の .zip がダウンロードできる github (https://github.com/BtbN/FFmpeg-Builds/releases) で,以下の矢印の通り,”ffmpeg-master-latest-win64-lgpl-shared.zip” をダウンロード/展開し,”ffmpeg-master-latest-win64-lgpl/bin/ffmpeg.exe” を “transcript/src/” にコピーします.

今回のツールは一部改変など含めても商用利用を想定していません.一応ライセンスを気にして,LGPL 版を用いています.

各モデルや必要なファイルを web からダウンロードし,ローカルの所定のフォルダに保存

ここでは,例えばツールの展開先にて社内プロキシを突破させたくない場合とか,オフライン PC を想定する場合に必要な工程であるため,これら関係なければ無視していただいて構いません.

以下リンクの各学習済みモデル(whisper のバージョンが “20230314” の場合)のファイルをダウンロードし,”transcript” 直下に “.model/” ディレクトリを作成して,そこに保存します.
(ちなみに,どのモデルがどこからダウンロードするかについては,”whisper/__init__.py” の冒頭で確認できます.(参考:https://github.com/openai/whisper/discussions/63))

また,以下2つの語彙ファイル (参考ページでは “vocab files” と呼称) も必要で,以下リンクからダウンロードし,”transcript” 直下に “.whisper/” ディレクトリを作成して,そこに保存します.(参考:https://github.com/openai/whisper/discussions/1399

embeddable 版 python をフォルダごと移動し,簡易的に実行するためのバッチファイル整備

以上で材料は揃いました.
いよいよ仕上げです.

今まで作ってきた embeddable 版 python のフォルダである “python-{バージョン}-embed-{PC}/” を python 実行環境として使うため,フォルダ丸ごと “transcript/” フォルダ内に移動します.

配布先でツールを簡単に使ってもらうために,単一ファイルをダブルクリックするだけで実行できるように,以下の内容のバッチファイル “voice2txt.bat” を “transcript/src/” 上に作成します.

mkdir %homepath%\.cache\whisper
copy /y ..\.whisper\* %homepath%\.cache\whisper\.
..\python-{バージョン}-embed-{PC}\python.exe .\voice2txt.py
pause

ここで,バッチファイルの中身の意味は以下です.

  • 1,2 行目・・・・ファイル読み込み先のフォルダ作成 & 語彙ファイル移動
  • 3 行目・・・・カレントディレクトリが “transcript/src/” であるときの embeddable 版を用いた実行方法
  • 4 行目・・・・”voice2txt.py” 実行時のエラーを確認するために,プログラムが異常終了してもシェルが瞬時に落ちないように入力待ちする

また,展開先 PC で社内プロキシを経由してモデルなどを web からダウンロードしても良い場合は,”pip 導入” のところで記載した “set HTTP_PROXY” などを “voice2txt.bat” の上部に付け加えても良いでしょう.

これで “transcript/src/voice2txt.bat” をダブルクリックであったり,コマンドラインからワンラインで実行できるなど,かなり簡単にツールが使えるようにパッケージングできました.
一応ツールには GUI をつけており,どのような操作であったり GUI かについて気になる方は,こちら (https://github.com/KazutoMakino/transcript/blob/main/README_for_deployment.md) の “使用方法” の章をご覧ください.

おまけ:配布用にサンプル音声ファイルをつけ,.tar.gz で固めて展開

残りは配布のみとなり .tar.gz で固めるだけですが,せっかくなのでその前にサンプル音声ファイルも添えておきましょう.

「音声ファイル データ フリー」でググれば多くの情報が出てきますし,過去の会議のレコードやご自身の肉声録音ファイルを “transcript/data/sample/” の中にでも入れましょう.

最後に次のコマンドで .tar.gz で固めて完成です.

tar -zcvf ./transcript.tar.gz ./transcript/

ツールの実行結果一例

例えば,こちらの音声ファイル (http://pro-video.jp/voice/announce/mp3/g_23.mp3) の文字起こしについて,当該ツールを用いて small / medium の 2 つのモデルで実行した結果が次です.

--- small ---
海外旅行に行きたいけどなかなか 休みも取れないし流行りの店にも飽きちゃった親子でアウトドア体験 もいいけど用意も必要なかなか一歩が踏み出せないアンディー は困っていました息子の剣がテレビで見たアメリカのバーベキュー を食べたいというのですアメリカのバーベキューはワイルドだじいちゃん がよくやってくれたと思い出話をしてたせいでしょうか

--- medium ---
海外旅行に行きたいけどなかなか休みも取れないし、流行りの店にも飽きちゃった。親子でアウトドア体験もいいけど、用意も必要、なかなか一歩が踏み出せない。アンディは困っていました。息子の件がテレビで見たアメリカのバーベキューを食べたいというのです。アメリカのバーベキューはワイルドだ。じいちゃんがよくやってくれたと思い出話をしてたせいでしょうか。

small でも結構意味の分かる文になっていますが,medium の方は句読点もついていて,固有名詞以外は完璧に文字起こしできました.
デモについて “ツールの実行結果一例” の章のとおり上手く文字起こしできましたが,もちろん,音声が聞き取りやすいことが前提であり,音声の聞き取りやすさというのも文字起こしの精度に対して非常に大きく影響してきますので,きちんと目的のデータを取れるようなシステムを構築することが何よりも重要であると考えます.

終わりに

当該記事では,「社内ツールとして展開することで業務の効率化を狙った無料かつ環境構築不要な文字起こしツールの作成方法」について紹介しました.
実際,文字起こしを行うツールとしては,web 会議ツールの Teams などに備わっていたり,web 版の MicroSoft Office Word の文字起こし機能があったりと各種存在します.
また,話し手の違いについても認識し,話し手ごとに区別して文字起こしすることも可能です.
が,制約付きであったり,有料サービスであったりするため,制限なく簡易的に使用できる当該ツールが少しでも役に立てれば良いな,と期待しています.

コメント

タイトルとURLをコピーしました