1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

音声ファイルから文字起こししたファイルを作成できる whisper.cpp を Docker 環境で構築する

Last updated at Posted at 2023-01-07

はじめに

タイトルの通りです。
某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-filestrans-files のフォルダが作成されます(設定内容による)

ファイル

※内容見るのが面倒な方は、以下に置いています

.env
# ユーザー情報(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
docker-compose.yml
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
Dockerfile
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
transcribe.sh
# 指定拡張子のファイルがあるか
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

構築&実行方法

  1. .env を編集します
    基本そのままで問題ないですが、モデルの設定は大きなサイズにすると、精度が上がるかと思います(多分)。
    GUI、UIDなどは、環境に合わせて変更してください。

  2. カレントディレクトリで コンテナを立てます

    docker-compose up -d --build
    

    audio-filestrans-files のフォルダが作成されます

  3. 作成された audio-files のフォルダで、直下に音声ファイルをおく
    ※ wav,aiff,aac,mp3 に対応
    ※ 本来は 16kHz の wav のみしか対応していないが、事前に変換する処理を実行している

  4. 以下のコマンドを実行して、文字起こし処理を実行(ホスト側からコンテナ内のシェルファイルを実行)

    docker exec -ti {コンテナ名} bash transcribe.sh
    
  • trans-files 以下のフォルダにテキストファイルが作成されている

注意点

MITライセンスなので、こういう使い方でも問題ないかと思いますが、展開は自己責任で、、

気づき

  • git-secrets を インストールしたら、Dockerfile内でgit clone できるので、わざわざホスト側に展開しなくてもよい
  • ffmpeg みたいに依存性悪くて(?)確認が出るものは、-f でインストール(いつも付けた方がよい?)
  • コンテナ内に入らなくても docker exec -ti {コンテナ名} [コマンド] で内部のシェルファイルを実行できる

最後に

C++とか自分でコーディングはあまりしたくないが、処理速度早くて便利なものは多いのかも、、、と思いました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?