2023年5月18日木曜日

whisperを使って自動文字起こしシステムを作ってみた

 家族が録音したデータをいちいち聞いてまとめるのが大変で負担になっているということだったので、最近流行りのAIを使って文字起こしをするシステムを作ってみました。

文字起こしをしてくれるクラウドサービスなどもあるようでしたが、今回はオープンソースで使えるwhisperを使ってみました。

whisperはOpenAI社の作った自動文字起こしするためのAIで、日本語に対応した学習モデルも公開されています。

whisper + python で思ったよりもかなり簡単にできてしまったので驚いています。家族も大満足なので、おすすめです。


作ったシステムの概要

音声データをフォルダに入れておいて、定期的にサーバから音声ファイルを確認して、文字起こしがされていなければそのファイルを文字起こしして結果のテキストファイルを特定のフォルダに書き出す、というものです。

文字起こし自体はpythonで実現しました。
定期的な処理は自宅のサーバ(ubuntu)のcronで定期実行しています。
文字起こしにはそれなりに時間がかかるので、夜間に実行するようにしています。

必要なソフトウェアのインストール

以下のブログを参考にさせていただきました。

以下、前提としてpythonの環境構築はできているものとします。
今回はubuntu 20.04で実行しています。

whisperのインストール

githubに公開されているものをpipコマンドでインストールします。

$ pip install git+https://github.com/openai/whisper.git

ちょっと時間がかかります。
このインストールが完了した時点では学習モデルはダウンロードされていません。

ffmpegのインストール

今回、iphoneで録音したデータをNASに保存してもらい、その文字起こしを行いました。
iphoneの標準のアプリで録音されたデータはm4aという拡張子で、ubuntu標準ではコーデックがないようなので、ffmpegをインストールしておきます。

$ sudo apt-get install ffmpeg

Pythonスクリプト(文字起こし)

文字起こしスクリプトはpythonで実装しました。
文字起こしした結果のテキストファイルは指定のフォルダパスに、音声ファイルのファイル名の拡張子を.txtに変えたファイル名で保存するようにしています。

毎回すべての音声ファイルを文字起こしするといろいろと無駄なので、音声ファイルとテキストファイルの一覧を比較し、テキストファイル(文字起こしの結果ファイル)がないもののみ文字起こしするようにしています。

whisperの文字起こし結果は音声ファイルの時間なども含まれていますが、文字起こししたテキストのみ保存しています。

以下が最終的なファイルです。

  1. # -*- encoding:utf-8 -*-
  2. #----------------------------------------------------
  3. # auto_whisper.py
  4. #
  5. # generate trascription file from audio data.
  6. # ---------------------------------------------------
  7. import glob
  8. import os
  9. import re
  10. import whisper
  11.  
  12. # audio file types
  13. audio_types = "(m4a|mp3|wav)"
  14.  
  15. # filepath
  16. audio_folder_path = "音声ファイルのフォルダパス"
  17. text_folder_path = "出力テキストファイルのフォルダパス"
  18.  
  19. # audio file list
  20. audio_file_list = []
  21. for audio_file in glob.glob(audio_folder_path+"/*"):
  22. if re.match('.+\.'+audio_types+'$', audio_file):
  23. audio_file_list.append(audio_file)
  24.  
  25. # text file list
  26. text_file_list = []
  27. for text_file in glob.glob(text_folder_path+"/*"):
  28. if re.match('.+\.txt$', text_file):
  29. text_file_list.append(os.path.splitext(os.path.basename(text_file))[0])
  30.  
  31. # pick up audio files that have not yet been transcripted.
  32. transcript_file_list = []
  33. for audio_file in audio_file_list:
  34. if os.path.splitext(os.path.basename(audio_file))[0] in text_file_list:
  35. print(audio_file, "ari")
  36. else:
  37. print(audio_file, "nashi")
  38. transcript_file_list.append(audio_file)
  39.  
  40. # transcript files
  41. if bool(transcript_file_list):
  42. # load model
  43. model = whisper.load_model("small")
  44.  
  45. print("transcripting...")
  46.  
  47. # transcript files
  48. for transcript_file in transcript_file_list:
  49. print("trascripting: "+ transcript_file)
  50. # output file
  51. output_file_path = text_folder_path + "/" + os.path.splitext(os.path.basename(transcript_file))[0] + ".txt"
  52. f = open(output_file_path, 'w')
  53.  
  54. result = model.transcribe(transcript_file, verbose=True, language='ja')
  55.  
  56. f.write(result["text"])
  57.  
  58. f.close()
  59.  
  60. # end


定期実行

定期実行はシンプルにcronを使っています。
処理時間がかかるので夜間に実行するようにしています。


2023年2月19日日曜日

Kicad 6 で部品がSTEPファイルに出力できない場合の対応策

 Kicad 6 でSTEPファイルに出力してFusion360でインポートをよく実施するのですが、

そのときに部品がSTEPファイルにエクスポートできていない時があります。

対策として、部品の3DモデルをSTEPファイルにする必要があります。


デフォルトのライブラリではwrl形式のファイルだったりするので、その場合には対応が必要です。


デフォルトの3DモデルのフォルダにSTEPファイルも入っているので、その場合には差し替えるだけでOKです。