はじめに
タイトルの通りです。
某PodCastの番組で知った文字起こしのアプリケーションの動作確認です。
普通に試すのは面白くなかったので、gccのコンテナ上で展開して実行してみました。
※こちらのプログラムをコンテナ上で展開しています
確認環境
- windows10 pro
- wsl2(20.04.5 LTS (Focal Fossa))
- Dockerのバージョン
- Docker version 20.10.18, build b40c2f6
- docker-compose version 1.29.2, build 5becea4c
※Docker Desktop ではありません
※基本、Docker のバージョンを合わせれば問題ないかと
フォルダ構成
[projectfolder]
├─ docker-compose.yml
├─ Dockerfile
├─ .env
└─ transcribe.sh
※途中、audio-files
と trans-files
のフォルダが作成されます(設定内容による)
ファイル
※内容見るのが面倒な方は、以下に置いています
# ユーザー情報(UID,GIDはホストの環境に合わせて)
UID=1000
GID=1000
USERNAME=cppuser
GROUPNAME=cppuser
# コンテナ内作業ディレクトリ
WORKDIR=/usr/src/app
# タイムゾーン
TIMEZONE=Asia/Tokyo
# gccの使用イメージタグ
GCC_IMAGE_TAG=12.2.0-bullseye
# リソース管理
PROJECT_NAME=cpp-whisper
IMAGE_VERSION=1.0
# 音声ファイルフォルダ(ホスト側設定)
AUDIO_FILE_DIR=audio-files
# 文字起こしファイル
TRANS_FILE_DIR=trans-files
# モデル(tiny, tiny.en, base, base.en, small, small.en, medium, medium.en, large)
MODEL_TYPE=small
version: '3'
services:
app:
image: ${PROJECT_NAME}:${IMAGE_VERSION}
build:
context: .
args:
UID: ${UID}
GID: ${GID}
USERNAME: ${USERNAME}
GROUPNAME: ${GROUPNAME}
WORKDIR: ${WORKDIR}
GCC_IMAGE_TAG: ${GCC_IMAGE_TAG}
MODEL_TYPE: ${MODEL_TYPE}
AUDIO_FILE_DIR: ${AUDIO_FILE_DIR}
TRANS_FILE_DIR: ${TRANS_FILE_DIR}
volumes:
- ./${AUDIO_FILE_DIR}:/var/tmp/${AUDIO_FILE_DIR}
- ./${TRANS_FILE_DIR}:/var/tmp/${TRANS_FILE_DIR}
restart: always
tty: true
ARG GCC_IMAGE_TAG
FROM gcc:$GCC_IMAGE_TAG
# パッケージ更新&追加
RUN apt-get update
RUN apt-get install -y vim git git-secrets ffmpeg
# パラメータ変数
ARG USERNAME
ARG GROUPNAME
ARG UID
ARG GID
ARG WORKDIR
ARG TIMEZONE
ARG MODEL_TYPE
ARG AUDIO_FILE_DIR
ARG TRANS_FILE_DIR
# 環境変数
ENV AUDIOFILEPATH=/var/tmp/$AUDIO_FILE_DIR
ENV TRANSFILEPATH=/var/tmp/$TRANS_FILE_DIR
# タイムゾーン設定
ENV TZ $TIMEZONE
# ユーザー追加
RUN groupadd -g $GID $GROUPNAME && \
useradd -m -s /bin/bash -u $UID -g $GID $USERNAME
# ルートフォルダ作成
RUN mkdir -p $WORKDIR
WORKDIR $WORKDIR
# リソース取得
RUN git clone https://github.com/ggerganov/whisper.cpp.git
# 権限変更
RUN chown -R $UID:$GID $WORKDIR/whisper.cpp
# ファイル参照フォルダ作成
RUN mkdir -p $AUDIOFILEPATH
RUN mkdir -p $TRANSFILEPATH
# 権限変更
RUN chown -R $UID:$GID $AUDIOFILEPATH
RUN chown -R $UID:$GID $TRANSFILEPATH
# ユーザー切り替え
USER $USERNAME
# 作業ディレクトリ設定
WORKDIR $WORKDIR/whisper.cpp
# 文字起こしファイルコピー
COPY transcribe.sh ./
# モデルダウンロード
RUN bash ./models/download-ggml-model.sh $MODEL_TYPE
# コンパイル
RUN make
# 指定拡張子のファイルがあるか
for _audio_file in ${AUDIOFILEPATH}/*.{wav,WAV,aiff,AIFF,aac,AAC,mp3,MP3}; do
# 指定拡張子がない場合は、以下の処理を行わない
[ -f "$_audio_file" ] || continue
# 拡張子なしのフォルダ
_audio_file_name=`basename ${_audio_file} | sed 's/\.[^\.]*$//'`
# 16kHzのWAVファイルに変換
ffmpeg -i ${_audio_file} -ar 16000 -ac 1 -c:a pcm_s16le ${AUDIOFILEPATH}/conv_${_audio_file_name}.wav
# 文字起こし処理実行
./main -m models/ggml-small.bin -f ${AUDIOFILEPATH}/conv_${_audio_file_name}.wav -l ja > ${TRANSFILEPATH}/${_audio_file_name}.txt
# 変換ファイル削除
rm -f ${AUDIOFILEPATH}/conv_${_audio_file_name}.wav
done
構築&実行方法
-
.env を編集します
基本そのままで問題ないですが、モデルの設定は大きなサイズにすると、精度が上がるかと思います(多分)。
GUI、UIDなどは、環境に合わせて変更してください。 -
カレントディレクトリで コンテナを立てます
docker-compose up -d --build
※
audio-files
とtrans-files
のフォルダが作成されます -
作成された
audio-files
のフォルダで、直下に音声ファイルをおく
※ wav,aiff,aac,mp3 に対応
※ 本来は 16kHz の wav のみしか対応していないが、事前に変換する処理を実行している -
以下のコマンドを実行して、文字起こし処理を実行(ホスト側からコンテナ内のシェルファイルを実行)
docker exec -ti {コンテナ名} bash transcribe.sh
-
trans-files
以下のフォルダにテキストファイルが作成されている
注意点
MITライセンスなので、こういう使い方でも問題ないかと思いますが、展開は自己責任で、、
気づき
- git-secrets を インストールしたら、Dockerfile内でgit clone できるので、わざわざホスト側に展開しなくてもよい
- ffmpeg みたいに依存性悪くて(?)確認が出るものは、-f でインストール(いつも付けた方がよい?)
- コンテナ内に入らなくても
docker exec -ti {コンテナ名} [コマンド]
で内部のシェルファイルを実行できる
最後に
C++とか自分でコーディングはあまりしたくないが、処理速度早くて便利なものは多いのかも、、、と思いました。