Skip to main content

pyopenjtalk-plus

PyPI Python package License

pyopenjtalk-plus は、各フォークでの改善を一つのコードベースにまとめ、さらなる改善を加えることを目的とした、pyopenjtalk の派生ライブラリです。

Changes in this fork

  • パッケージ名を pyopenjtalk-plus に変更
    • ライブラリ名は pyopenjtalk から変更されておらず、pyopenjtalk 本家同様に import pyopenjtalk でインポートできる
    • pyopenjtalk 本家のドロップイン代替として利用できる
  • Python 3.10 以降をサポート(3.10 / 3.11 / 3.12 / 3.13 / 3.14)
    • v0.4.1-post9 以降、Python 3.9 のサポートを終了した
    • CI 対象の Python バージョンは 3.11 以降をメインとしている
  • Windows・macOS (x64 / arm64)・Linux すべての事前ビルド済み wheels を PyPI に公開
    • pyopenjtalk は hts_engine_API・OpenJTalk・Cython に依存しており、ビルド環境の構築難易度が比較的高い
      • 特に Windows においては MSVC のインストールが必要となる
    • 事前ビルド済みの wheels を PyPI に公開することで、ビルド環境のない PC でも簡単にインストール可能にすることを意図している
  • Python 側と Cython 側の両方に型ヒント (Type Hints) を追加
  • Cython を 3.0 系に更新 (v0.3.4-post6 以降)
    • https://github.com/cython/cython/issues/5982 の通り、Python 3.13 では一部の非推奨 C API が削除されている
    • Cython 0.x 系では Python 3.13 以降のビルドに失敗するため、Cython 3.0 系に更新した
  • numpy 2.x 系に対応 (v0.3.4-post6 以降)
    • numpy 2.x 系では互換性のない変更が多数行われているが、公式ドキュメント によると「numpy 2.x 系でビルドした wheel であれば numpy 1.x 系でも動作する」らしい
      • pyopenjtalk-plus では、numpy 2.x 系でビルドした wheel を公開することで対応した
    • marine-plus の最新版でも numpy 2.x 系へ対応済みのため、numpy 1.x 縛りから解放されている
  • pyopenjtalk.run_frontend() 関数に CLI インターフェイスを追加 (v0.3.4-post6 以降)
    • コマンドライン引数としてテキストを受け取り、そのテキストを処理した結果を標準出力に出力する
    • 実行例: python -m pyopenjtalk "あらゆる現実を、すべて自分の方へねじ曲げたのだ。"
  • OpenJTalk 向けシステム辞書を、pyopenjtalk では初回実行時に自動ダウンロードされる open_jtalk_dic_utf_8-1.11.tar.gz から、独自にカスタマイズした pyopenjtalk-plus 向け辞書 (wheel に同梱) に変更
    • この辞書は n5-suzuki/pyopenjtalk にかつて含まれていた mecab-naist-jdic のカスタム版をベースに、jpreprocess/naist-jdic での改良点を取り込み、さらに独自に改良したもの
    • jpreprocess/naist-jdic では mecab-naist-jdic に jpreprocess 向けの改良が施されており、辞書データのミスの修正など有用な変更が多かったことから、修正内容をほぼすべて適用した
    • 辞書 CSV を用途別に分割し、大規模なコスト監査・同形異音語整理・neologd 由来パッチ取り込みを継続している
      • naist-jdic.csv: naist-jdic (を魔改造した何か)
        • 数十万行あり管理が大変なため、v0.4.1-post8 以降の変更内容は scripts/modify_dictionary.py にコード化して管理している
      • unidic-csj.csv: UniDic-CSJ v2.2.0 のうち、naist-jdic に不足していた語彙を品詞体系の変換・コスト調整の上で追加したと思われる何か
      • fillers.csv / symbols.csv / rare_syllables.csv: メンテナンス性の観点から、フィラー・記号・稀な音節を上記から切り出したもの
      • heteronyms.csv: tsqyomi 向けの同形異音語候補辞書(手動編集)
    • pyopenjtalk 本家で実装されていた _lazy_init() 関数内での辞書ダウンロード処理は pyopenjtalk-plus での辞書同梱に伴い削除している
      • 辞書データがなければ pyopenjtalk は動作しないため (つまり辞書をダウンロードしない選択肢はなく必須) 、毎回追加でダウンロードするよりも wheel に直接含めた方が安定性の面でよりベターだと考えた
      • pyopenjtalk-plus の辞書データは 100MB 以上あるが (wheel 自体は圧縮が効いて 25MB 程度) 、せいぜい数十 MB のサイズ節約よりもアクセント・読み推定精度の向上を優先した
    • カスタム辞書は pyproject.toml のあるディレクトリで uv run task build-dictionary を実行するとビルドできる
      • 管理の簡便化のため、ビルド済みの辞書データ (*.bin / *.dic) はこの Git リポジトリに含めている
  • pyopenjtalk.run_frontend()pyopenjtalk.g2p() でも run_marine=True を指定し marine によるアクセント推定を行えるようにした
    • 以前から pyopenjtalk.extract_fullcontext() では marine による AI アクセント推定が可能だったが、pyopenjtalk.run_frontend()pyopenjtalk.g2p() にも実装した
      • 「デフォルトの学習済みモデルは JSUT コーパスのみから学習されており、論文に記載されている性能とは異なる」(≒ marine 開発元の LINE 社内では独自の音声コーパスを用いてより高性能な学習済みモデルを作成・運用している) 旨が marine の README に記載されている
      • このためデフォルトの学習済みモデルを使う限り、現状 OpenJTalk のアクセント推定の方が精度が高い傾向にある
    • pyopenjtalk-plus では PyTorch への依存が発生することからデフォルトの依存関係には含めていないが、別途 marine / marine-plus をインストールすれば利用可能
    • marine 本家は Windows や Python 3.12 以降に非対応な上、非推奨警告が多数出力される問題があるため、これらの問題に対処した marine-plus の利用を推奨します
      • pip install pyopenjtalk-plus[marine] で pyopenjtalk-plus と同時に marine-plus をインストールできる
  • litagin02/pyopenjtalk での変更を取り込み、pyopenjtalk.unset_user_dict() 関数を追加
    • VOICEVOX で利用されている VOICEVOX/pyopenjtalk には、VOICEVOX ENGINE で利用するためのユーザー辞書機能が独自に実装されている
    • その後、pyopenjtalk v0.3.4 で VOICEVOX/pyopenjtalk と同等のユーザー辞書機能が実装された
      • VOICEVOX/pyopenjtalk の set_user_dict() 関数が update_global_jtalk_with_user_dict() 関数になるなど、同等の機能ながら関数名は変更されている
      • …が、どういう訳か VOICEVOX/pyopenjtalk には存在した「設定したユーザー辞書をリセットする」関数が実装されていない
    • このため litagin02/pyopenjtalk では VOICEVOX/pyopenjtalk から pyopenjtalk.unset_user_dict() 関数が移植されており、pyopenjtalk-plus でもこの実装を継承した
    • v0.4.1-post9 以降、tsqyomi 利用時向けの読み保護指定機能を追加した
      • update_global_jtalk_with_user_dict() には .dic パス文字列のほか、UserDictionaryEntry (dic_path + is_reading_protected) のリストも渡せる
      • is_reading_protected=True にしたユーザー辞書エントリは、tsqyomi による MeCab feature 差し替えから保護される
    • このほか、クロスプラットフォームで wheel をビルドするための GitHub Actions ワークフローもこのフォークから取り込んだもの
  • VOICEVOX/pyopenjtalk での変更を取り込み、多数の改良点を反映
    • OpenJTalk の VOICEVOX 向けフォーク (VOICEVOX/open_jtalk) での変更内容を前提とした変更が多数含まれる
    • 取り込んだ変更点 (一部):
      • text2mecab() 関数を安全に改良し、エラー発生時に適切な RuntimeError を送出する
      • ARM 版 Windows でビルド可能にする
      • Windows で辞書の保存先パスに日本語を含むマルチバイト文字が含まれるとエラーが発生する問題を修正
      • 各環境でのビルドに関連する諸問題を修正
      • (OpenJTalk 側のみ) OpenJTalk 本体だけでユーザー辞書を読み込める Mecab_load_with_userdic() 関数を追加
      • (OpenJTalk 側のみ) 辞書のコンパイルに利用される mecab-dict-index モジュールにログ出力を抑制する --quiet オプションを追加
      • (OpenJTalk 側のみ) mecab-dict-index モジュールの main() 関数 (元は CLI コマンド用) をコメントアウト
        • OpenJTalk は MeCab のソースコードがベース、その MeCab 自体も非常にレガシーなソフトウェアで、お世辞にも綺麗なコードではない
        • このためか pyopenjtalk の辞書コンパイル機能は「CLI コマンド mecab-dict-index の argv と argc に相当する値を、ライブラリ側から OpenJTalk の mecab_dict_index() 関数 (mecab-dict-index コマンドのエントリーポイント) の引数として注入する」という非常にトリッキーかつ強引な手法で実装されている
        • どのみち pyopenjtalk 向け OpenJTalk では mecab-dict-index コマンドをビルドする必要がない
  • n5-suzuki/pyopenjtalk での変更を取り込み、多数の改良点を反映
    • 複数の読み方をする漢字の読みに対し SudachiPy で形態素解析を行い、得られた結果を使い OpenJTalk から返された list[NJDFeature] 内の値を補正する実装がユニーク
    • 「何」を「なん」と読むか「なに」と読むかを判定するための scikit-learn で実装された機械学習モデルによるロジック に関して、学習済みモデルを ONNX に変換し、scikit-learn 0.24.2 への依存なしに動かせるよう改良した
      • 当該モデルは scikit-learn 0.24.2 でしか動作しないが、3年以上前にリリースされた極めて古いバージョンにつき Python 3.11 以降では動作せず、依存関係の問題もありインストール自体が困難になってきている
      • 学習用コードは含まれていなかったため推測するしかないが、モデルのバイナリに含まれる文字列から、RandomForestClassifier を用いた比較的単純な機械学習モデルだと推測される
      • ONNX 変換ツール を自作した上で ONNX に変換し、推論コード も ONNX Runtime を用いて推論するよう変更した
        • ONNX 推論には pip install pyopenjtalk-plus[onnxruntime] が必要
          • ONNX Runtime には onnxruntime-gpu など複数の排他的なバリエーションがあり、依存関係側で導入パッケージを固定すると CPU 版しかインストールできなくなってしまうため、敢えて必須依存関係には設定していない
        • ONNX Runtime 1.26 以降で推論結果が壊れる問題があったため、v0.4.1-post9 以降ではモデルを明示的に二クラス確率で出力する形へ移行している
          • v0.4.1-post9 以降では、フェイルセーフとして「何を」「何が」など文脈から「ナニ」と確定できる場合は、モデルより先に決定論的ガードが適用される
  • korguchi/pyopenjtalk での変更を取り込み、多数の改良点を反映
    • このフォークで利用されている korguchi/open_jtalk では、「クァ」「グヮ」「デェ」「フュ」「シィ」などの比較的珍しい音素のサポートが追加されている
    • ほかにも「!」(感嘆符)を「記号/一般」として正しく推定するための改良など、概ね副作用なしに精度向上が見込めることから、有用性を鑑みほぼそのままマージした
    • この関係で、pyopenjtalk 本家とは一部音素での挙動が異なる
  • sabonerune/pyopenjtalk での変更を取り込み、スレッドセーフ化と一部 Cython コードの nogil 化を達成 (v0.3.4-post6 以降)
    • スレッドセーフ化により、複数スレッドから安全に pyopenjtalk を呼び出せるようになった
    • 一部 Cython コードの nogil 化により、若干のパフォーマンス向上も見込める
    • https://github.com/r9y9/pyopenjtalk/pull/87https://github.com/r9y9/pyopenjtalk/pull/88 の内容を一部改変の上で取り込んだ
    • グローバルインスタンスは内部ロックで直列化されるため、高並列用途ではスレッドごとに OpenJTalk() を生成し jtalk= 引数で渡すことを推奨する
    • v0.4.1-post9 以降、ユーザー辞書の差し替え (update_global_jtalk_with_user_dict() / unset_user_dict()) は、進行中の処理を待ってからグローバルインスタンスを交換するように改良した
  • stellanomia/haqumei での優れた実装・ロジック・テストを移植・バックポートし、複数の機能追加とパフォーマンスの大幅改善を達成 (v0.4.1-post8 以降)
    • Haqumei は pyopenjtalk-plus の Rust 再実装であり、その実装過程で発見・整備された設計・ロジック・テストを多数バックポートした
    • 形態素-音素マッピング API を移植・追加 (Haqumei の g2p_mapping_detailed() に相当):
      • run_frontend_detailed(): MeCab 解析 1 回で NJD features と MeCab 形態素 (MecabMorph) を同時に取得
      • make_phoneme_mapping(): 音素と形態素の対応マッピングを生成
      • g2p_mapping(): 上記をまとめて呼び出す便利ラッパー
      • types.pyMecabMorph / SurfacePhonemeMapping TypedDict を追加
      • SurfacePhonemeMappingNJDFeature のスーパーセットに拡張し、HTS ラベルを解析せずにアクセント句境界・核位置・品詞・読みなどをまとめて取得可能にした
      • g2p_mapping() / make_phoneme_mapping() の返却値 char_span(入力テキスト上の半開区間)を追加 (v0.4.1-post9 以降)
    • 発音復元オプションを移植 (Haqumei の revert_pron_to_read() に相当)
      • use_read_as_pron: 全ての発音 (pron) を強制的に読み (read) で上書きする
      • revert_long_vowels: 辞書が自動的に長音化した発音のみ元の読みに戻す
      • revert_yotsugana: 四つ仮名 (ヅ・ヂ) の発音統合を復元する
    • g2p() 実行時、Haqumei と同様に Cython 側で JPCommonLabel から直接音素列を取得するよう変更し、パフォーマンスを改善
    • use_sudachi_kanji_yomi / predict_nani / normalize_mode フラグを追加し、速度と精度のトレードオフがある機能を個別にオンオフ可能にした
    • Mecab_analysis() 内の lattice->clear()Mecab_refresh() に移動し、Cython 側からの MeCab Lattice ノード走査を実現
    • Haqumei の充実したテストスイートを移植・追加し、テストカバレッジを大幅に向上
  • フロントエンド API を段階実行可能に分割
    • MeCab 解析・NJD 処理・後処理を個別に呼び出し、カスタムパイプラインや候補読みの比較が可能になった
    • run_mecab() / run_njd_from_mecab(): v0.4.1-post4 以降
    • run_mecab_detailed() / run_mecab_nbest_features(): v0.4.1-post9 以降
  • tsqyomi (Text-to-Speech Quick Yomi Optimized Minimal Inferencer) による文脈を考慮した読み選択機能を統合 (v0.4.1-post9 以降)
    • 同形異音語の読みを、専用モデルを用いて文脈を考慮して選択できる
      • tsqyomi を併用する場合、事前に任意のタイミングで pyopenjtalk.tsqyomi.load_model() を呼び出したあと、use_tsqyomi=Trueg2p() / run_frontend() / g2p_mapping() / extract_fullcontext() / tts() 等に指定して有効化する
    • 追加の依存関係を含むため、別途 pip install pyopenjtalk-plus[tsqyomi]
      • 初回利用時に Hugging Face から ONNX モデルがダウンロードされる
    • tsqyomi を有効にした場合は、Sudachi による読み補正と「何」推定用 AI モデルは自動的に無効化され、tsqyomi による選択結果が優先される
  • フロントエンド共通オプションを整理
    • 主要 API (g2p() / run_frontend() / g2p_mapping() 等) で共通利用できる主なフラグ:
      • run_marine: marine を用いたアクセント推定を行うか
      • use_vanilla: pyopenjtalk-plus 独自の後処理を省略し、OpenJTalk の素の NJDFeature をそのまま後段に流す
      • use_tsqyomi: ロード済みの tsqyomi で文脈に合う読み候補を選ぶ (v0.4.1-post9 以降)
      • use_sudachi_kanji_yomi: Sudachi による同形異音語の読み補正を行う (v0.4.1-post8 以降 / use_tsqyomi=True 時は無効)
      • predict_nani: ONNX モデルで単独形態素として出現した「何」の読みを推定する (v0.4.1-post8 以降 / use_tsqyomi=True 時は無効)
      • normalize_mode: 入力テキストに適用する Unicode 正規化方式 (v0.4.1-post8 以降 / "None" / "NFC" / "NFKC")
      • use_read_as_pron / revert_long_vowels / revert_yotsugana: 発音形の復元オプション (v0.4.1-post8 以降)
  • submodule の OpenJTalk を tsukumijima/open_jtalk に変更
  • submodule の hts_engine_API を syoyo/hts_engine_API に変更
  • ライブラリの開発環境構築・ビルド・コード整形・テストを taskipy によるタスクランナーでの管理に変更
  • 利用予定のない Travis CI 向けファイルを削除
  • 不要な依存関係の削除、依存バージョンの整理
  • その他精度の改善・コードのクリーンアップ、非推奨警告の解消など

Installation

下記コマンドを実行して、ライブラリをインストールできます。

pip install pyopenjtalk-plus[onnxruntime]

# 「ONNX モデルで単独形態素として出現した「何」の読みを推定する」機能を使わない場合
pip install pyopenjtalk-plus

# marine によるアクセント推定を使う場合
pip install pyopenjtalk-plus[marine]

# tsqyomi による同形異音語の文脈読み選択を使う場合
pip install pyopenjtalk-plus[tsqyomi]

# 複数の extras を同時にインストール
pip install "pyopenjtalk-plus[onnxruntime,marine,tsqyomi]"

Development

開発環境は macOS / Linux 、Python バージョンは 3.10 以上が前提です (Python 3.11 以降を推奨) 。

# submodule ごとリポジトリを clone
git clone --recursive https://github.com/tsukumijima/pyopenjtalk-plus.git
cd pyopenjtalk-plus

# uv をインストールし、.venv/ 以下の仮想環境を作成
pip install uv
uv venv

# ライブラリ自身とその依存関係を .venv/ 以下の仮想環境にインストールし、開発環境を構築
uv sync --group dev

# コード整形
uv run task lint
uv run task format

# テストの実行
uv run task test

# Pyright による型チェック
uv run task typecheck

# pyopenjtalk/dictionary/ 以下にある MeCab / OpenJTalk 辞書をビルド
## ビルド成果物は同ディレクトリに *.bin / *.dic として出力される
## ビルド後の辞書データは数百 MB あるバイナリファイルだが、取り回しやすいよう敢えて Git 管理下に含めている
uv run task build-dictionary

# ライブラリの wheel と sdist をビルドし、dist/ に出力
uv run task build

# ビルド成果物をクリーンアップ
uv run task clean

下記ならびに docs/ 以下のドキュメントは、pyopenjtalk 本家のドキュメントを改変なしでそのまま引き継いでいます。
これらのドキュメントの内容が pyopenjtalk-plus にも通用するかは保証されません。


pyopenjtalk

PyPI Python package Build Status License DOI

A python wrapper for OpenJTalk.

The package consists of two core components:

  • Text processing frontend based on OpenJTalk
  • Speech synthesis backend using HTSEngine

Notice

  • The package is built with the modified version of OpenJTalk. The modified version provides the same functionality with some improvements (e.g., cmake support) but is technically different from the one from HTS working group.
  • The package also uses the modified version of hts_engine_API. The same applies as above.

Before using the pyopenjtalk package, please have a look at the LICENSE for the two software.

Build requirements

The python package relies on cython to make python bindings for open_jtalk and hts_engine_API. You must need the following tools to build and install pyopenjtalk:

  • C/C++ compilers (to build C/C++ extentions)
  • cmake
  • cython

Supported platforms

  • Linux
  • Mac OSX
  • Windows (MSVC) (see this PR)

Installation

pip install pyopenjtalk

Development

To build the package locally, you will need to make sure to clone open_jtalk and hts_engine_API.

git submodule update --recursive --init

and then run

pip install -e .

Quick demo

Please check the notebook version here (nbviewer).

TTS

In [1]: import pyopenjtalk

In [2]: from scipy.io import wavfile

In [3]: x, sr = pyopenjtalk.tts("おめでとうございます")

In [4]: wavfile.write("test.wav", sr, x.astype(np.int16))

Run text processing frontend only

In [1]: import pyopenjtalk

In [2]: pyopenjtalk.extract_fullcontext("こんにちは")
Out[2]:
['xx^xx-sil+k=o/A:xx+xx+xx/B:xx-xx_xx/C:xx_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:xx_xx#xx_xx@xx_xx|xx_xx/G:5_5%0_xx_xx/H:xx_xx/I:xx-xx@xx+xx&xx-xx|xx+xx/J:1_5/K:1+1-5',
'xx^sil-k+o=N/A:-4+1+5/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'sil^k-o+N=n/A:-4+1+5/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'k^o-N+n=i/A:-3+2+4/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'o^N-n+i=ch/A:-2+3+3/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'N^n-i+ch=i/A:-2+3+3/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'n^i-ch+i=w/A:-1+4+2/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'i^ch-i+w=a/A:-1+4+2/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'ch^i-w+a=sil/A:0+5+1/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'i^w-a+sil=xx/A:0+5+1/B:xx-xx_xx/C:09_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:5_5#0_xx@1_1|1_5/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-5@1+1&1-1|1+5/J:xx_xx/K:1+1-5',
'w^a-sil+xx=xx/A:xx+xx+xx/B:xx-xx_xx/C:xx_xx+xx/D:xx+xx_xx/E:5_5!0_xx-xx/F:xx_xx#xx_xx@xx_xx|xx_xx/G:xx_xx%xx_xx_xx/H:1_5/I:xx-xx@xx+xx&xx-xx|xx+xx/J:xx_xx/K:1+1-5']

Please check lab_format.pdf in HTS-demo_NIT-ATR503-M001.tar.bz2 for more details about full-context labels.

Grapheme-to-phoeneme (G2P)

In [1]: import pyopenjtalk

In [2]: pyopenjtalk.g2p("こんにちは")
Out[2]: 'k o N n i ch i w a'

In [3]: pyopenjtalk.g2p("こんにちは", kana=True)
Out[3]: 'コンニチワ'

Create/Apply user dictionary

  1. Create a CSV file (e.g. user.csv) and write custom words like below:
GNU,,,1,名詞,一般,*,*,*,*,GNU,グヌー,グヌー,2/3,*
  1. Call mecab_dict_index to compile the CSV file.
In [1]: import pyopenjtalk

In [2]: pyopenjtalk.mecab_dict_index("user.csv", "user.dic")
reading user.csv ... 1
emitting double-array: 100% |###########################################|

done!
  1. Call update_global_jtalk_with_user_dict to apply the user dictionary.
In [3]: pyopenjtalk.g2p("GNU")
Out[3]: 'j i i e n u y u u'

In [4]: pyopenjtalk.update_global_jtalk_with_user_dict("user.dic")

In [5]: pyopenjtalk.g2p("GNU")
Out[5]: 'g u n u u'

About run_marine option

After v0.3.0, the run_marine option has been available for estimating the Japanese accent with the DNN-based method (see marine). If you want to use the feature, please install pyopenjtalk as below;

pip install pyopenjtalk[marine]

And then, you can use the option as the following examples;

In [1]: import pyopenjtalk

In [2]: x, sr = pyopenjtalk.tts("おめでとうございます", run_marine=True) # for TTS

In [3]: label = pyopenjtalk.extract_fullcontext("こんにちは", run_marine=True) # for text processing frontend only

LICENSE

Acknowledgements

HTS Working Group for their dedicated efforts to develop and maintain Open JTalk.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyopenjtalk_plus-0.4.1.post9.tar.gz (25.0 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pyopenjtalk_plus-0.4.1.post9-cp314-cp314-win_amd64.whl (25.7 MB view details)

Uploaded CPython 3.14Windows x86-64

pyopenjtalk_plus-0.4.1.post9-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (31.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

pyopenjtalk_plus-0.4.1.post9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (31.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyopenjtalk_plus-0.4.1.post9-cp314-cp314-macosx_10_15_universal2.whl (25.7 MB view details)

Uploaded CPython 3.14macOS 10.15+ universal2 (ARM64, x86-64)

pyopenjtalk_plus-0.4.1.post9-cp313-cp313-win_amd64.whl (25.1 MB view details)

Uploaded CPython 3.13Windows x86-64

pyopenjtalk_plus-0.4.1.post9-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

pyopenjtalk_plus-0.4.1.post9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (31.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyopenjtalk_plus-0.4.1.post9-cp313-cp313-macosx_10_13_universal2.whl (25.7 MB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

pyopenjtalk_plus-0.4.1.post9-cp312-cp312-win_amd64.whl (25.1 MB view details)

Uploaded CPython 3.12Windows x86-64

pyopenjtalk_plus-0.4.1.post9-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

pyopenjtalk_plus-0.4.1.post9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (31.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyopenjtalk_plus-0.4.1.post9-cp312-cp312-macosx_10_13_universal2.whl (25.7 MB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

pyopenjtalk_plus-0.4.1.post9-cp311-cp311-win_amd64.whl (25.1 MB view details)

Uploaded CPython 3.11Windows x86-64

pyopenjtalk_plus-0.4.1.post9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

pyopenjtalk_plus-0.4.1.post9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (31.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyopenjtalk_plus-0.4.1.post9-cp311-cp311-macosx_10_9_universal2.whl (25.7 MB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

pyopenjtalk_plus-0.4.1.post9-cp310-cp310-win_amd64.whl (25.1 MB view details)

Uploaded CPython 3.10Windows x86-64

pyopenjtalk_plus-0.4.1.post9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (31.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

pyopenjtalk_plus-0.4.1.post9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (31.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyopenjtalk_plus-0.4.1.post9-cp310-cp310-macosx_10_9_universal2.whl (25.7 MB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file pyopenjtalk_plus-0.4.1.post9.tar.gz.

File metadata

  • Download URL: pyopenjtalk_plus-0.4.1.post9.tar.gz
  • Upload date:
  • Size: 25.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9.tar.gz
Algorithm Hash digest
SHA256 cdcb0746659857554c6dad23956cad77e21f76c9f3dfa000ea2f8d4f0ba11d99
MD5 050f713b116a05122935a8fa0fc9ac6a
BLAKE2b-256 1ae703cc1d971260ae90cc35370965d6d8e612cc8b8588d2f81db7cd2accf9ad

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 273a7829ebbc4ddfa94c11bdf47d0aac89b418a144afb6b9d80c745416e47578
MD5 2a2e0609546042a048f1a300ae1e3482
BLAKE2b-256 0f0da8542f269f7e912fb2920fa7d1eaf8e88c36bd1ea915c63c350fc5378f45

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 71d06f9318d6fcdf63ba61549ea22765d674a8cfb8a29984b73915cd7cf40486
MD5 6abe3141b64e6597d123dad1f9347f8d
BLAKE2b-256 ecde2cb80918d0a7b7f0260a97203f383ed79cc222b28e5b1cd95eed10b17f84

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d669b461203e453698da8f3a1772d15802e64cc4f0d0278d65223d30339d0302
MD5 3881f3047d62af67589b4ffc1297ad5c
BLAKE2b-256 81e58d555862f0f7f929aab041fb51d1afc6240552bbcbd2d6cf4af0a1e3ed9d

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp314-cp314-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp314-cp314-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 75d1a93e97fe627ee88a5cc9c03af48cef440a957e66aab801e4be0bc1972384
MD5 2d3680ae059e869ae340601da11f8ed0
BLAKE2b-256 ded104c4a08db318048ca632994bcae2b46a5401dd25b1ea53effd19aacf642d

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f3699de7491d958685ffd2656cb0f3ac1d5c1ca469f3da7caf2e5aa4617ef3b1
MD5 8913d5714fe981f4e79c9141d57422a8
BLAKE2b-256 a5eaf5f4c9d1dd9f1788e9bf22a05ed28e6aa15698decda247bf1563610a5538

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f7c1048013e8ce100f4f9d489d2acfc603756fb1a62ca0a2310475bc7e4fa365
MD5 47798c7065ff3329b333829d339eb2b8
BLAKE2b-256 22d919994eae3451aafdff7d24ef73d06c259d310c8fe5b091725d42b291e234

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 10d3b80ac91f193861909f08b945b11e037965f6eadb767529b975465382282c
MD5 d530d2e99a5166a422d7eb5ff02687ea
BLAKE2b-256 1327ebf087640df43f6f319cde946a69dba082b1ecb82f56b8106e62e09c4c05

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 7122013811e02ac7c2676c4bd7e5c2d37eb6f02b11944ff1fdf3fa4667d4cd5c
MD5 a08fb7d531096907494427a06ba95bf8
BLAKE2b-256 282b3b77d3b18808f719106988df846956762026150447f6bc4e37372a195294

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7c13d8370d82e625c3ac0712d813da498c8f145f6ff246aec482753db952a5a9
MD5 e3bb035b1c703e34db96ef03ae95550d
BLAKE2b-256 9cf3bf7c62d0c0e8543a6b93d18df4527a0f060b5a21dd7e64408fa16e98ebad

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 856b1ee7be326015490c23fc55046688492e2d99554852e476a24a10c8e77ba0
MD5 778dbd078f74e7d3cf61544ae2da97e0
BLAKE2b-256 8137aa7b83620b5aadd7f47c42d0f04a2cad535e7fece52cc0c2387b97db3e85

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f98993e1e943d4313e4113992b137714c0ac8f6a383d1fd89747a592222bdddf
MD5 cf9d896df590794945dd81c3150fde53
BLAKE2b-256 e1ced1d01cbdc4b2ba9b01919f6f017856997d8fe4fac035e8e0fd08923384b5

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 3a0c9e3d7a61e72be10c6e2dc37449037e72b2b6c7a97633eb03e393836936a2
MD5 7d3f012118d2fca54cf589512d395006
BLAKE2b-256 4946f509711876c6997842586bd7a55f8803dc0d37d8aa2ab65485d36b844507

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 58cda3998e1c8f4d820e07757803e8cd9ad324c359af59f398c30ba38fb88865
MD5 8492e190ef50468ec14b3220642f6825
BLAKE2b-256 18df50e8185a5a5d441e404af7c0407491bc92ca76d44ceaf8cd086066365184

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b3a991396d641cf5983bf3c49e932d6f878c8a12215cad64871c82354d22cd78
MD5 6b52f9f8cb4972a7110d8da76a0d8160
BLAKE2b-256 fa71e6937ce16f4d1c35a161e463e0176220a3147ee214f9f56ebc0b1632cc60

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f35a6b1f977347c8b6b233728bc971fa6561cbcb1a23f6c94a79a8c763d64401
MD5 aa4e12fb15201e62ab677c029a2fc0f0
BLAKE2b-256 a129e55ccaeffb6746aa5c5d9f5365472c8899e21e788f33a7e4d8156045aa73

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 5e91f4d43740e550bc8a1fb8923fd5a490f06f5fbcac0fba9280e3b7d7b954e9
MD5 3232d32432505b3468e609e457ace3c6
BLAKE2b-256 022c8dacb54db5148d65802d2932fae702227e7ebbc4e8578ba417da872cc61d

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c2624815bef0528628bbdc52dec298b0eb577df261f19088b7bb5018c5ca0b51
MD5 a272b1134a8896b29a0e05f72778dd07
BLAKE2b-256 4002939abaa07066337ce1a9e405159f186b2b383fd4ab89754c68af6af29026

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5acf59e7a0750a5a35e1a76a724f257e995a71f8c06ff945f8436b8f9b62b5b9
MD5 2cf020052652894f85e5c7c043349bb6
BLAKE2b-256 0b4da95e20214716b07ba89260c24bab157ff3f3b91a0a41c5e04ff103a2d844

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5b0e6ddebf2cf60ef480e1a9861ff2f08e6b04e70fe3ca62f349f601af6adb5b
MD5 9e5606ca1e021f1d4c7c5848b540fc14
BLAKE2b-256 e732ebfe5a5153ec7fb468142ed674418ba1381afcb2f50d5fb3f6f2e64e569e

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post9-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post9-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 1f0de887a624b86109464d9ec819e705d7412ebeda87a6abc0f828fc48091932
MD5 e1951d26f5cc6e7f71b407837d353996
BLAKE2b-256 fcb6faca99e7015b81706f819fb7239e1e1d73d941ba6c9b420e63d6a245a911

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page