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ファイルしか選択できないようになっています。
「追加、編集、削除」のラジオボタンがあります。どの操作を行うか選択します。
追加:新しい単語を辞書に登録します。
編集:既存の単語を編集します。
削除:選択した単語を削除します。
追加操作
単語入力に追加したい単語を入力します。
自動的に単語のカタカナが「読み編集、読み(カタカナ)、発音編集、発音(カタカナ)」に入力されます。単語の読みが違えば「読み編集」から編集します。
「読み編集」を編集すると「発音編集、発音(カタカナ)」も同時に変換されます。単語の発音を変えるには「発音編集」から編集します。
「発音(カタカナ)」だけが変換されます。TTSさせるだけなら以下のものは入力されているものを使います。
「コスト、品詞、品詞細分類、活用語、アクセント結合規制」単語のアクセントをつけます。
アクセントの数字だけ指定すれば辞書で使える形に変換されます。
例えば、「VITS二(ビッツツー)」の最後のツにアクセントをつけたいとき、音素数が「5」になります。最後のツは5音素中4番目になるので4を設定。
6. 追加ボタンを押せば辞書に追加されます。
編集操作
編集のラジオボタンを選択します。
右のテーブルから単語を選択します。すると、自動的に入力に情報が記入されます。
編集したいものを書き換えます。
更新ボタンを押すと辞書が更新されます。
削除操作
テーブルから単語を選択します。
削除ボタンを押します。
辞書から単語か消え、テーブルが更新されます。
設定ファイル
設定ファイルには保存先のファイルパス、プリセットデータ、コスト、品詞類、活用型、が含まれています。
ファイルの中の情報の詳細
コスト: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)