見出し画像

OpenJTalk ユーザ辞書の単語追加アプリ


インストール

楽にアプリを使う

GitHubのリリースからこのadd-dictionary.zipをダウンロードします。
add-dictionary.zipを解凍し、add_dict.exeをダブルクリックすることで使えます。

GitとPythonを使う

GitHubからコードのダウンロードをします。
クローンを作成でもZipファイルのダウンロードどちらでも構いません。

最終以下のディレクトリ構造になる様にしてください。

add-dictionary
├─ .venv
├─ add_dict.py
├─ config.yaml
├─ requirements.txt
└─ user_dict.csv

リポジトリを任意の場所にクローンし、ディレクトリを移動します。

git clone https://github.com/massao000/add-dictionary.git
cd add-dictionary

移動したディレクトリ内でvenvモジュールを使用して仮想環境を作成します。
.venvは仮想環境のディレクトリ名です。

python -m venv .venv

作成した仮想環境を有効化

.venv\Scripts\activate

環境が有効かされると、コマンドプロンプトが以下の様に変更されます。(.venvの部分が仮想環境名を表しています)

(.venv) $

仮想環境に入った状態で必要なライブラリのインストール

pip freeze > requirements.txt


ツールの使い方

ユーザ辞書に user_dict.csv を用意しています。
別の辞書に単語を追加する場合は、左上の設定から「保存/読み込み」を選択します。
csvファイルの辞書を選択します。
※csvファイルしか選択できないようになっています。

「追加、編集、削除」のラジオボタンがあります。どの操作を行うか選択します。

  • 追加:新しい単語を辞書に登録します。

  • 編集:既存の単語を編集します。

  • 削除:選択した単語を削除します。

「左文脈ID、右文脈ID」は確率の計算が必要なので入力はありません。
「品詞細分類系、活用系、アクセント結合規則」はわからなければ「*」で問題ないです。

追加操作

  1. 単語入力に追加したい単語を入力します。
    自動的に単語のカタカナが「読み編集、読み(カタカナ)、発音編集、発音(カタカナ)」に入力されます。

  2. 単語の読みが違えば「読み編集」から編集します。
    読み編集」を編集すると「発音編集、発音(カタカナ)」も同時に変換されます。

  3. 単語の発音を変えるには「発音編集」から編集します。
    発音(カタカナ)」だけが変換されます。

  4. TTSさせるだけなら以下のものは入力されているものを使います。
    「コスト、品詞、品詞細分類、活用語、アクセント結合規制」

  5. 単語のアクセントをつけます。
    アクセントの数字だけ指定すれば辞書で使える形に変換されます。
    例えば、「VITS二(ビッツツー)」の最後のツにアクセントをつけたいとき、音素数が「5」になります。最後のツは5音素中4番目になるので4を設定。

イメージ

6. 追加ボタンを押せば辞書に追加されます。

編集操作

  1. 編集のラジオボタンを選択します。

  2. 右のテーブルから単語を選択します。すると、自動的に入力に情報が記入されます。

  3. 編集したいものを書き換えます。

編集中でもカナ変換の有効化」について
編集の選択をしているときは単語を書き換えても「読み編集、読み(カタカナ)、発音編集、発音(カタカナ)」に変化が起こらないようになっています。
編集中でもカナ変換の有効化」にチェックを入れれば、追加の様に単語を編集したときに「読み編集、読み(カタカナ)、発音編集、発音(カタカナ)」に自動的にカタカナが入力されます。

更新ボタンを押すと辞書が更新されます。

削除操作

  1. テーブルから単語を選択します。

  2. 削除ボタンを押します。

  3. 辞書から単語か消え、テーブルが更新されます。

設定ファイル

設定ファイルには保存先のファイルパス、プリセットデータ、コスト、品詞類、活用型、が含まれています。

  • ファイルの中の情報の詳細

    • コスト:cost_choices

    • 品詞:pos_choices

    • 品詞細分類:pos_type_choices

    • 品詞細分類:pos_type_choices2

    • 品詞細分類:pos_type_choices3

    • 活用型:conjugation1

    • 活用形:conjugation2

    • プリセットデータ:preset

    • システムに関するデータ:system

辞書の説明

  • 表層形(単語)

    • 実際の文章に出てくる形の単語や語句です。

    • 「食べる」や「京都」など

  • 左文脈ID

    • 単語の左側(前の単語)との関係を示すIDです。文脈に基づいて、どの単語がどのように続くかの確率を計算するために使用されます。

  • 右文脈ID

    • 単語の右側(後の単語)との関係を示すIDです。左文脈IDと同様に、文脈に基づいて形態素がどのように続くかを判断します。

  • コスト

    • 形態素解析でこの単語を採用する際のコスト(スコア)を示す値です。

    • コストが低いほどその形態素が採用されやすくなります。

  • 品詞

    • 単語の文法的な役割を示す項目です。

    • 「名詞」「動詞」「形容詞」など。

  • 品詞細分類1

    • 品詞のより詳細な分類です。

    • 例えば、動詞が「一般動詞」や「サ変動詞」など。

  • 品詞細分類2

    • 品詞細分類1をさらに細かく分類したものです。

    • 「数詞」「地域」「人名」など。

  • 品詞細分類3

    • 品詞細分類2のさらに詳細な分類です。

  • 活用型

    • 動詞や形容詞などの単語がどのように変化するかを示す項目です。

    • 例えば、動詞の活用型として「五段活用」や「一段活用」があります。

  • 活用形

    • 単語がどの活用形を取っているかを示す項目です。

    • 例えば、動詞の形が「連用形」や「終止形」などの活用形に分類されます。

  • 原形

    • 単語の基本形、もしくは辞書に登録されている元の形です。

  • 読み

    • 単語の読みです。その形態素がどのように発音されるかが記録されます。

    • 例: 「京都」の読みは「キョウト」。

  • 発音

    • 単語の発音を表します。

    • 場合によっては読みと同じこともありますが、異なることもあります。

    • 例えば、読みが「キョウト」でも、発音が「キョート」のように表される場合もあります。

  • アクセント

    • 発音の際のアクセント位置を示します。

    • アクセント/音素数 でアクセントを表しています。

    • 例えば、京都のアクセントが「キョウト」なのか「キョウ」かといった情報。

  • アクセント結合規則

    • 単語同士がどのようにアクセントを結合するかを示す規則です。

    • 複数の単語が並んだ時に、アクセントの結合による変化を指定します。

    • 「C1」や「C2」など


ユーザ辞書を使う例

仮想環境の作成

venvモジュールを使用して仮想環境を作成します。
.venvは仮想環境のディレクトリ名です。

python -m venv .venv

作成した仮想環境を有効化

.venv\Scripts\activate

環境が有効かされると、コマンドプロンプトが以下の様に変更されます。(.venvの部分が仮想環境名を表しています)

(.venv) $


pyopenjtalk

ライブラリのインストール

pip install pyopenjtalk simpleaudio

ユーザ辞書を追加し、TTSを行っています。

import pyopenjtalk
import simpleaudio
import numpy as np

# 辞書のアップデート
pyopenjtalk.mecab_dict_index("user_dict.csv", "user.dic")
pyopenjtalk.update_global_jtalk_with_user_dict("user.dic")

# TTS
x, sr = pyopenjtalk.tts("とある科学の超電磁砲")

# 音声の再生
wave_obj = simpleaudio.WaveObject(x.astype(np.int16), num_channels=1, sample_rate=sr)
play_obj = wave_obj.play()
play_obj.wait_done()


Style-Bert-VITS2

Style-Bert-VITS2(以下、SBV2等という。)ライブラリを使ってユーザ辞書を使います。
詳しいSBV2のライブラリの使い方については以下のnoteを見てください。

ライブラリのインストール
SBV2と必要なライブラリをインストール

CPUのみを使用する場合、以下のコマンド

pip3 install torch torchvision torchaudio

CUDAを使用する場合、以下のコマンド

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install style-bert-vits2 soundfile simpleaudio


SBV2にある「Style-Bert-VITS2\dict_data」をコピーしてワークスペースに置きます。
user_dict.csv に単語を追加しているなら dict_data に入れてください

workspace
├─ .venv
├─ dict_data
│    └─ default.csv
│    └─ user.dic
└─ main.py

基本コード
このコードを使えばしゃべらすことができます。
まだ、ユーザ辞書は追加していません。

from style_bert_vits2.nlp import bert_models
from style_bert_vits2.constants import Languages
from style_bert_vits2.tts_model import TTSModel
from style_bert_vits2.nlp.japanese.user_dict import update_dict
from huggingface_hub import hf_hub_download
from pathlib import Path
import simpleaudio
import soundfile as sf

# BERTモデルをロード
# 自動でモデルがダウンロードされます
bert_models.load_model(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_models.load_tokenizer(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")


# Hugging Faceから試し用にデフォルトモデルをダウンロード
# model_assetsディレクトリが作成され、そこにモデルが保存されます
model_file = "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors"
config_file = "jvnv-F1-jp/config.json"
style_file = "jvnv-F1-jp/style_vectors.npy"

# モデルがある場合コメントアウト
for file in [model_file, config_file, style_file]:
    print(file)
    hf_hub_download("litagin/style_bert_vits2_jvnv", file, local_dir="model_assets")


assets_root = Path("model_assets")

model = TTSModel(
    model_path=assets_root / model_file,
    config_path=assets_root / config_file,
    style_vec_path=assets_root / style_file,
    device="cpu",
)


text = 'これはテスト音声です'
sr, audio = model.infer(text=text)

# 音声の再生
wave_obj = simpleaudio.WaveObject(audio, num_channels=1, sample_rate=sr)
play_obj = wave_obj.play()
play_obj.wait_done()

# 音声ファイルに保存
sf.write(f'test.wav', audio, samplerate=sr)

基本コードに辞書を追加するコードを追記します。

update_dict(
    default_dict_path = Path("dict_data/default.csv"),
    compiled_dict_path = Path("dict_data/user.dic")
)

default.csv もしくは user_dict.csv を読み込むことでユーザ辞書が反映されます。

全体のコード

from style_bert_vits2.nlp import bert_models
from style_bert_vits2.constants import Languages
from style_bert_vits2.tts_model import TTSModel
from style_bert_vits2.nlp.japanese.user_dict import update_dict
from huggingface_hub import hf_hub_download
from pathlib import Path
import simpleaudio
import soundfile as sf

# 辞書の追加
update_dict(
    default_dict_path = Path("dict_data/default.csv"),
    compiled_dict_path = Path("dict_data/user.dic")
)


# BERTモデルをロード
# 自動でモデルがダウンロードされます
bert_models.load_model(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_models.load_tokenizer(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")


# Hugging Faceから試し用にデフォルトモデルをダウンロード
# model_assetsディレクトリが作成され、そこにモデルが保存されます
model_file = "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors"
config_file = "jvnv-F1-jp/config.json"
style_file = "jvnv-F1-jp/style_vectors.npy"

# モデルがある場合コメントアウト
for file in [model_file, config_file, style_file]:
    print(file)
    hf_hub_download("litagin/style_bert_vits2_jvnv", file, local_dir="model_assets")


assets_root = Path("model_assets")

model = TTSModel(
    model_path=assets_root / model_file,
    config_path=assets_root / config_file,
    style_vec_path=assets_root / style_file,
    device="cpu",
)


text = 'これはテスト音声です'
sr, audio = model.infer(text=text)

# 音声の再生
wave_obj = simpleaudio.WaveObject(audio, num_channels=1, sample_rate=sr)
play_obj = wave_obj.play()
play_obj.wait_done()

# 音声ファイルに保存
sf.write(f'test.wav', audio, samplerate=sr)


いいなと思ったら応援しよう!