GeminiAPIを使って音声データセットのラベル付けを行う

初めに

音声のラベル付けをする場合、LLMを使って文字お越しデータから行う or マルチモーダルを使って音声およびテキストからラベル付けをする方法になります。

今回は、GeminaiのAPIを使って音声および文字お越しデータを渡してその音声がどのような音声なのかのラベル付けをしてみます

以下で実際に試したリポジトリを公開しています

github.com

開発環境

準備

まずは環境構築です

uv venv -p 3.11
source .venv/bin/activate

また以下のドキュメントを参考にAPIの作成を行います

ai.google.dev

GeminiAPI SDKをインストールします

uv pip install -q -U google-generativeai

環境変数を取得するために、以下のライブラリも入れます

uv pip install python-dotenv

GeminiAPIを使ってラベル付けつけ

現時点では、英語の音声しか認識できないため 精度はよくないと思われます

まずはライブラリをインポートして、使用するモデルの設定を行います。

import google.generativeai as genai
import os

genai.configure(api_key=os.environ["API_KEY"])
model = genai.GenerativeModel(model_name="gemini-1.5-flash")

音声データおよびテキストは以下のようにしてAPIに渡すことができます

# 音声データを読み込む
audio_data = {
    "mime_type": "audio/wav",
    "data": pathlib.Path(audio_file_path).read_bytes()
}

# プロンプトと音声データを Gemini に渡す
response = model.generate_content([prompt, audio_data])

全体のコードは以下になります

import google.generativeai as genai
import os
from dotenv import load_dotenv
import pathlib

# .env ファイルから環境変数を読み込む
load_dotenv()
genai.configure(api_key=os.environ["geminai_api"])

# Gemini モデルを初期化
model = genai.GenerativeModel(model_name="gemini-1.5-flash")

# 文字起こしテキスト
transcription = "また、東寺のように、五大明王と呼ばれる、主要な明王の中央に配されることも多い。"  # 実際の文字起こしテキストを入力してください

# 音声ファイルのパスを指定
audio_file_path = 'input.wav'  # 実際の音声ファイルのパスに置き換えてください

# プロンプトを英語で作成
prompt = f"""Analyze the following audio and transcription text, and determine the speaker's emotion by selecting the most appropriate label from the list below:

- Angry
- Disgusted
- Embarrassed
- Fearful
- Happy
- Sad
- Surprised
- Neutral
- Sexual1  # aegi voices
- Sexual2  # chupa voices

Please provide your answer by selecting only one emotion label from the list.

Transcription text:
{transcription}
"""

# 音声データを読み込む
audio_data = {
    "mime_type": "audio/wav",
    "data": pathlib.Path(audio_file_path).read_bytes()
}

# プロンプトと音声データを Gemini に渡す
response = model.generate_content([prompt, audio_data])

# 結果を表示
print(response.text.strip())

manga-ocrを動かす

初めに

日本の漫画フォーマットに特化したOCRのライブラリがあるので動かしてみます

github.com

開発環境

環境セットアップ

公式のままだとエラーになるので、pyproject.toml を変更します

requires-python = ">=3.8"

上記のように3.8以上にしておきます

そのあとは、以下でライブラリを入れていきます(torchはCPU版になりますが、今回は簡単な推論だけなのでそのままにします)

uv sync

推論

以下のようなコードを使って漫画の画像をOCRで文字認識を行います。画像はリポジトリ内に入っているサンプル画像を使用します

from manga_ocr import MangaOcr

mocr = MangaOcr()
text = mocr(r"assets\examples\00.jpg")

print(text)

画像をOCEで認識した結果は以下のようになりました

素直にあやまるしか

Kotoba-Speech v0.1をDockerを使ってローカル環境で推論を行う

初めに

こちら動かしていきます。

github.com

昔にライブラリのverが合わずに諦めていたのですが、以下の方がPRでライブラリのverを固定するものを出していたので、こちらを元にいろいろ行い Dockerを使ってローカル推論を行います。

github.com

すぐに動かしたい方は以下にdockerおよびdocker composeを使って環境構築をしたものをRepositoryにあげているので、こちらで動かしてください

github.com

以下でビルドおよび推論ができます

docker compose build
docker compose run kotoba_speech

以下で公式の事前学習モデルを使って推論をすることができます

python -i fam/llm/fast_inference.py  --model_name kotoba-tech/kotoba-speech-v0.1
tts.synthesise(text="コトバテクノロジーズのミッションは音声基盤モデルを作る事です。", spk_ref_path="assets/bria.mp3")

開発環境

  • Windows 11
  • Docker Desktop
  • Docker Compose version v2.29.2-desktop.2

構築時の詳細

FlashAttentionのインストールについて

基本上手くインストールできない & ビルドをすると永遠に終わらないので、以下のwheelから適切なものを使ってインストールを行います。

今回は 以下の条件ものを使います * CUDAバージョン:CUDA 12 * PyTorchバージョン:PyTorch 2.2 * Pythonバージョン:Python 3.10 * C++11 ABI:TRUE

こちらに該当するものは、flash_attn-2.7.0.post2+cu12torch2.2cxx11abiTRUE-cp310-cp310-linux_x86_64.whl になるため、以下でダウンロードおよびインストールを行います

RUN wget -q https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.0.post2/flash_attn-2.7.0.post2%2Bcu12torch2.2cxx11abiTRUE-cp310-cp310-linux_x86_64.whl \
    && pip install flash_attn-2.7.0.post2+cu12torch2.2cxx11abiTRUE-cp310-cp310-linux_x86_64.whl \
    && rm flash_attn-2.7.0.post2+cu12torch2.2cxx11abiTRUE-cp310-cp310-linux_x86_64.whl

github.com

audiocraftのインストール

audiocraftをpipからインストールをしようとすると以下のようなエラーが出ました

            [end of output]

        note: This error originates from a subprocess, and is likely not a problem with pip.
        ERROR: Failed building wheel for numpy
        Running setup.py clean for numpy
        error: subprocess-exited-with-error

        × python setup.py clean did not run successfully.
        │ exit code: 1
        ╰─> [10 lines of output]
            Running from numpy source directory.

            `setup.py clean` is not supported, use one of the following instead:

              - `git clean -xdf` (cleans all files)
              - `git clean -Xdf` (cleans all versioned files, doesn't touch
                                  files that aren't checked into the git repo)

            Add `--force` to your command to use it anyway if you must (unsupported).

            [end of output]

        note: This error originates from a subprocess, and is likely not a problem with pip.
        ERROR: Failed cleaning build dir for numpy
      Failed to build numpy
      ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects
      [end of output]

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

× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.

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

(エラー文はログの最後の部分のみ)

今回は audiocraftをcloneして、フォルダ内からインストールを行っています

RUN git clone https://github.com/facebookresearch/audiocraft.git \
    && cd audiocraft \
    && pip install . \
    && pip list | grep audiocraft \
    && cd .. \
    && rm -rf audiocraft

pytorchの古い問題

はじめの方はpytorch 2.1で構築をしていたのですが、以下のエラー起きてpytorch 2.2にしています

AttributeError: torch._inductor.config.fx_graph_cache does not exist

このエラーは、torch._inductor.config 内に fx_graph_cache という属性が存在しないために発生しています。

ボリュームマウントを使ったフォルダ共有

Dockerfileのみの場合、docker image内で作成したファイルなどホスト側のPCからアクセスする場合すこしめんどくさいです。そのため以下のように docker composeを使って ボリュームマウントを行って今う

version: '3.9'

services:
  kotoba_speech:
    build:
      context: .
      dockerfile: Dockerfile
    image: kotoba_speech_image
    volumes:
      - .:/home/user/kotoba_speech_release
    runtime: nvidia  # 追加
    stdin_open: true
    tty: true
    command: >
      /bin/bash -c "
      cd /home/user/kotoba_speech_release &&
      pip install -e . &&
      exec /bin/bash
      "

こちらによって推論時の生成物をすぐに確認することができます

推論

ビルドなどが終わった後は、以下で推論を行います

python -i fam/llm/fast_inference.py --model_name kotoba-tech/kotoba-speech-v0.1 tts.synthesise(text="コトバテクノロジーズのミッションは音声基盤モデルを作る事です。", spk_ref_path="assets/bria.mp3")

これによって以下のようにファイルが生成されます

boltz(Boltz-1)を使って生体分子相互作用モデリングを行う

初めに

Boltz-1は、タンパク質、RNA、DNA、小分子などの生体分子の3D構造を予測することができます。面白そうなので実際に実行してみます

github.com

以下で実際に動かしたuv環境をアップロードしています。(公式をforkしてuvでライブラリのver固定したもの)

github.com

開発環境

セットアップ

まずは ReadMe通りにセットアップを行います。

git clone https://github.com/jwohlwend/boltz.git
cd boltz

次にuvの環境を作ります

uv venv -p 3.11
source .venv/bin/activate

次にデフォルトのライブラリを入れます

uv pip install -e .

手元の環境だとtorchがCUDA対応のものがデフォルトでインストールされず、そのまま推論するとGPUが対応していないというエラーになったので、torchをCUDA対応のものにします

uv pip install torch  --index-url https://download.pytorch.org/whl/cu121 --force-reinstall

タンパク質とリガンド(分子)の情報から推論

以下の examples/ligand.yaml を使って推論を行います

version: 1  # Optional, defaults to 1
sequences:
  - protein:
      id: [A, B]
      sequence: MVTPEGNVSLVDESLLVGVTDEDRAVRSAHQFYERLIGLWAPAVMEAAHELGVFAALAEAPADSGELARRLDCDARAMRVLLDALYAYDVIDRIHDTNGFRYLLSAEARECLLPGTLFSLVGKFMHDINVAWPAWRNLAEVVRHGARDTSGAESPNGIAQEDYESLVGGINFWAPPIVTTLSRKLRASGRSGDATASVLDVGCGTGLYSQLLLREFPRWTATGLDVERIATLANAQALRLGVEERFATRAGDFWRGGWGTGYDLVLFANIFHLQTPASAVRLMRHAAACLAPDGLVAVVDQIVDADREPKTPQDRFALLFAASMTNTGGGDAYTFQEYEEWFTAAGLQRIETLDTPMHRILLARRATEPSAVPEGQASENLYFQ
      msa: ./examples/msa/seq1.a3m
  - ligand:
      id: [C, D]
      ccd: SAH
  - ligand:
      id: [E, F]
      smiles: N[C@@H](Cc1ccc(O)cc1)C(=O)O

上記は以下の内容をしているみたいです(o1より)

1. タンパク質
yaml
- protein:
    id: [A, B]
    sequence: MVTPEGNVSLVDESLLVGVTD...
    msa: ./examples/msa/seq1.a3m
ID: [A, B] はタンパク質の鎖(チェーン)IDを示しています。
アミノ酸配列: MVTPEGNVSLVDESLLVGVTD... はタンパク質の一次構造(アミノ酸配列)です。
MSAファイル: ./examples/msa/seq1.a3m は、この配列に対応する多重配列アラインメント(MSA)のファイルへのパスです。
具体的な物質名:

このアミノ酸配列は、実際のタンパク質を表しています。提供された配列をデータベースで検索すると、**ヒトのグルタチオン-S-トランスフェラーゼP(GSTP1)**に高い類似性が見られます。

2. リガンド1
yaml
- ligand:
    id: [C, D]
    ccd: SAH
ID: [C, D] はリガンドのチェーンIDを示しています。
CCD: SAH は、PDBのChemical Component Dictionary(化学成分辞書)における3文字コードです。
具体的な物質名:

SAH は S-アデノシル-L-ホモシステイン(S-Adenosyl-L-homocysteine) を示します。
S-アデノシル-L-ホモシステインは、生体内で重要なメチル基供与体であるS-アデノシルメチオニン(SAM)の脱メチル化産物です。
3. リガンド2
yaml
- ligand:
    id: [E, F]
    smiles: N[C@@H](Cc1ccc(O)cc1)C(=O)O
ID: [E, F] はリガンドのチェーンIDを示しています。
SMILES: N[C@@H](Cc1ccc(O)cc1)C(=O)O は化合物の化学構造を表すSMILES表記です。
具体的な物質名:

SMILES表記 N[C@@H](Cc1ccc(O)cc1)C(=O)O は、以下の化合物を表します。

L-チロシン(L-Tyrosine)
L-チロシンは、芳香族アミノ酸の一つであり、タンパク質を構成する20種類の標準的なアミノ酸の一つです。

まとめ
このデータは、以下の生体分子を記述しています。

タンパク質: 推定では、ヒトのグルタチオン-S-トランスフェラーゼP(GSTP1)
リガンド1: S-アデノシル-L-ホモシステイン(SAH)
リガンド2: L-チロシン

この内容を指定して、以下で推論を実行します

boltz predict examples/ligand.yaml

モデルのダウンロードが始まった後に推論の処理がされます

結果

以下のようなファイルが生成されます

ASEを使ってモデルをプレビューします

uv pip install ase

備考

clang不足エラー

インストール時に以下のような clangが入っていないエラーが出た場合は、インストールをしていきます

エラー内容

copying ihm/util/make_mmcif.py -> build/lib.linux-x86_64-cpython-311/ihm/util
running build_ext
building 'ihm._format' extension
clang -pthread -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -fPIC -Isrc -I/home/aihub-user/.cache/uv/builds-v0/.tmpADb75S/include -I/home/aihub-user/.local/share/uv/python/cpython-3.11.10-linux-x86_64-gnu/include/python3.11 -c src/ihm_format.c -o build/temp.linux-x86_64-cpython-311/src/ihm_format.o

[stderr]
error: command 'clang' failed: No such file or directory

インストールコマンド

sudo apt-get install clang

Style-Bert-VITS2(SBV2)でAssertionError: choose a window size 400 that is [2, 251]の対応方法

初めに

以下の学習にて以下のエラーにて前処理が止まることがあります。こちらの対応をしていきます

packages/torchaudio/compliance/kaldi.py", line 142, in _get_waveform_and_window_properties
    assert 2 <= window_size <= len(waveform), "choose a window size {} that is [2, {}]".format(
AssertionError: choose a window size 400 that is [2, 251]

11-15 11:16:09 | ERROR  | train.py:246 | Step 5: style_gen failed.

github.com

開発環境

  • Python 3.10.12
  • Ubunts 22.02
  • cuda 12.1

ライブラリ ver

numpy                    1.26.4
pyannote-audio           3.3.2
pyannote-core            5.0.0
pyannote-database        5.1.0
pyannote-metrics         3.2.1
pyannote-pipeline        3.0.1
pycparser                2.22
pyopenjtalk-dict         0.3.4.dev2
pytorch-lightning        2.4.0
pytorch-metric-learning  2.7.0
torch                    2.3.0+cu121
torch-audiomentations    0.11.1
torch-pitch-shift        1.2.5
torchaudio               2.3.0+cu121
torchmetrics             1.5.1
transformers             4.39.3
triton                   2.3.0

# 原因

原因としてはpyannote.audioライブラリ内での音声波形の長さと、信号処理で使用されるウィンドウサイズとの不一致から生じています

* window_sizeが400サンプルであるのに対し、波形の長さが251サンプルしかないことを示しています
* kaldi.py内のアサーションは、window_sizeが2サンプル以上で、かつ波形の長さ以下である必要があるとチェックしています

# 対応方法

以下の関数を `save_style_vector`の初めに 追加して、波形の長さが一定以下であれば処理をしないようにします

import torchaudio

def is_audio_length_valid(wav_path: str, frame_length_ms: float = 25.0) -> bool: waveform, sample_rate = torchaudio.load(wav_path) min_length_samples = int(sample_rate * frame_length_ms / 1000.0) if waveform.shape[1] < min_length_samples: logger.warning(f"Skipping {wav_path}: audio too short ({waveform.shape[1]} samples)") return False return True




def save_style_vector(wav_path: str): if not is_audio_length_valid(wav_path): raise ValueError(f"Audio too short: {wav_path}") try: style_vec = get_style_vector(wav_path) except Exception as e:

またエラーログの解析用に 以下を変更しておくと便利です

def process_line(line: str): wav_path = line.split("|")[0] try: save_style_vector(wav_path) return line, None except NaNValueError: return line, "nan_error" except ValueError as e: if "Audio too short" in str(e): return line, "short_audio" else: logger.error(f"Unexpected error for {wav_path}: {e}") return line, "other_error" except Exception as e: logger.error(f"Unexpected error for {wav_path}: {e}") return line, "other_error"

linuxのscreen環境でスクロールができない時にする対応

開発環境

現象

linuxに仮想ターミナル化するライブラリがありますが、こちらを使用時にスクロールしても上部にあるものがスクロールされないことがあります。

対応方法

  1. ホームディレクトリにある.screenrcファイルを編集

ファイルがない場合は、以下で作成をします。

touch ~/.screenrc

ファイルがある場合は、vim(等)で開きます

vi ~/.screenrc
  1. マウスサポートを有効にする設定を追加

以下でマウスのスクロールの設定を開いた設定ファイルに追加します

altscreen on
termcapinfo xterm* ti@:te@
mousescroll on
mousespeed 1
  1. screenを再起動

以下で 起動しているscreenを再起動します

screen -S mysession

XREALで掴めるオブジェクトの設定を行う

初めに

以下の画像のように左側に自分で追加したオブジェクトをXREAL SDKを通して掴めるようにしていきます

開発環境

  • Unity 2022.3.42f1
  • XREAL SDK 2.2.0

詳細

まずは既存のサンプルに用意されている Cubeの設定を見ていきます。

画像のように 以下のコンポーネントがアタッチされています。

  1. Collider(任意のもの)
  2. Rigidbody
  3. NRGrabbable Object(スクリプト)

オブジェクト側の設定

1. Collider

こちらはデフォルトのままで問題なさそうです

2. RIgidbody

以下の項目をデフォルトから設定しています

  • Drag を適切な値に設定
  • Use Gravityを offにする
  • Collision Detecitionを Continuous Dynamic にする

比較用に以下がコンポーネントを新規でつけたときの設定です

3. NRGrabbale Object

Attached Colliders に Colliderのオブジェクトを入れる必要があります。

オブジェクトの登録

以下の画像のように Items Collector にオブジェクトを登録する必要があります。