Skip to main content

A Python wrapper for OpenJTalk with additional improvements

Project description

pyopenjtalk-plus

PyPI Python package License

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

Changes in this fork

  • パッケージ名を pyopenjtalk-plus に変更
    • ライブラリ名は pyopenjtalk から変更されておらず、pyopenjtalk 本家同様に import pyopenjtalk でインポートできる
    • pyopenjtalk 本家のドロップイン代替として利用できる
  • 明示的に Python 3.11 / 3.12 / 3.13 / 3.14 をサポート対象に追加
    • 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 系に更新
    • https://github.com/cython/cython/issues/5982 の通り、Python 3.13 では一部の非推奨 C API が削除されている
    • Cython 0.x 系では Python 3.13 以降のビルドに失敗するため、Cython 3.0 系に更新した
  • numpy 2.x 系に対応
    • numpy 2.x 系では互換性のない変更が多数行われているが、公式ドキュメント によると「numpy 2.x 系でビルドした wheel であれば numpy 1.x 系でも動作する」らしい
      • pyopenjtalk-plus では、numpy 2.x 系でビルドした wheel を公開することで対応した
    • ただし、marine (marine-plus) のコードは numpy 2.x 系との互換性がないため (OverflowError が発生する) 、marine と併用する際は引き続き numpy 1.x 系が必要となる
  • pyopenjtalk.run_frontend() 関数に CLI インターフェイスを追加
    • コマンドライン引数としてテキストを受け取り、そのテキストを処理した結果を標準出力に出力する
    • 実行例: 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 向けの改良が施されており、辞書データのミスの修正など有用な変更が多かったことから、修正内容をほぼすべて適用した
    • pyopenjtalk 本家で実装されていた _lazy_init() 関数内での辞書ダウンロード処理は pyopenjtalk-plus での辞書同梱に伴い削除している
      • 辞書データがなければ pyopenjtalk は動作しないため (つまり辞書をダウンロードしない選択肢はなく必須) 、毎回追加でダウンロードするよりも wheel に直接含めた方が安定性の面でよりベターだと考えた
      • pyopenjtalk-plus の辞書データは 100MB 以上あるが (wheel 自体は圧縮が効いて 25MB 程度) 、せいぜい数十 MB のサイズ節約よりもアクセント・読み推定精度の向上を優先した
    • カスタム辞書は pyproject.toml のあるディレクトリで 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 marine-plus で marine 本家の代わりに 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 でもこの実装を継承した
    • このほか、クロスプラットフォームで 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 に変換し、推論コード も ONNXRuntime を用いて推論するよう変更した
        • この変更により依存関係に ONNXRuntime が追加されるが、すでに機械学習関連の他ライブラリの依存関係に含まれていることも多く、実用上問題ないと判断した
  • korguchi/pyopenjtalk での変更を取り込み、多数の改良点を反映
    • このフォークで利用されている korguchi/open_jtalk では、「クァ」「グヮ」「デェ」「フュ」「シィ」などの比較的珍しい音素のサポートが追加されている
    • ほかにも「!」(感嘆符)を「記号/一般」として正しく推定するための改良など、概ね副作用なしに精度向上が見込めることから、有用性を鑑みほぼそのままマージした
    • この関係で、pyopenjtalk 本家とは一部音素での挙動が異なる
  • sabonerune/pyopenjtalk での変更を取り込み、スレッドセーフ化と一部 Cython コードの nogil 化を達成
  • submodule の OpenJTalk を tsukumijima/open_jtalk に変更
  • submodule の hts_engine_API を syoyo/hts_engine_API に変更
  • ライブラリの開発環境構築・ビルド・コード整形・テストを taskipy によるタスクランナーでの管理に変更
  • 利用予定のない Travis CI 向けファイルを削除
  • 不要な依存関係の削除、依存バージョンの整理
  • その他精度の改善・コードのクリーンアップ、非推奨警告の解消など

Installation

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

pip install pyopenjtalk-plus

Development

開発環境は macOS / Linux 、Python バージョンは 3.11 が前提です。

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

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

# コード整形
task lint
task format

# テストの実行
task test

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

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

# ビルド成果物をクリーンアップ
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.

Project details


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.post5.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.post5-cp314-cp314-win_amd64.whl (25.5 MB view details)

Uploaded CPython 3.14Windows x86-64

pyopenjtalk_plus-0.4.1.post5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.7 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp314-cp314-macosx_10_15_universal2.whl (25.5 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp313-cp313-win_amd64.whl (24.8 MB view details)

Uploaded CPython 3.13Windows x86-64

pyopenjtalk_plus-0.4.1.post5-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.7 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp313-cp313-macosx_10_13_universal2.whl (25.5 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp312-cp312-win_amd64.whl (24.8 MB view details)

Uploaded CPython 3.12Windows x86-64

pyopenjtalk_plus-0.4.1.post5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.7 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp312-cp312-macosx_10_13_universal2.whl (25.5 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp311-cp311-win_amd64.whl (24.8 MB view details)

Uploaded CPython 3.11Windows x86-64

pyopenjtalk_plus-0.4.1.post5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp311-cp311-macosx_10_9_universal2.whl (25.5 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp310-cp310-win_amd64.whl (24.8 MB view details)

Uploaded CPython 3.10Windows x86-64

pyopenjtalk_plus-0.4.1.post5-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.7 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp310-cp310-macosx_10_9_universal2.whl (25.5 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp39-cp39-win_amd64.whl (24.8 MB view details)

Uploaded CPython 3.9Windows x86-64

pyopenjtalk_plus-0.4.1.post5-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.7 MB view details)

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

pyopenjtalk_plus-0.4.1.post5-cp39-cp39-macosx_10_9_universal2.whl (25.5 MB view details)

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

File details

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

File metadata

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

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5.tar.gz
Algorithm Hash digest
SHA256 67903b933f9fbb6f761b3222bb9608a1f6e14db57eedd69cfd4e75bd7acc66cb
MD5 0db8abf27307e487733a8ddd80915c07
BLAKE2b-256 67a00c1ce3ae8ccf29f3eb4bb40ace13a5d3b84e2c859d7b35c0a6e23de8fd87

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f84afe7411e628c48fc5df2a764b1a464e2424c83c5f9da9447d0fb48dd215a6
MD5 e2b739ac3b2a1a010127c606d02fb885
BLAKE2b-256 c2fa32960034d67f9479ec6aa4ed3204b3edbdfddec509884ebfe80d41cd6dab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ff42cf3678a340cb9d1d36e982ae37dd5fa0922b945e402c306ea2da42f56587
MD5 5c751a79c2600698e1cbdadf7bdacaa2
BLAKE2b-256 a1f4d80694f2cfc18133aff5fe9f94eb8eba6197348b342c44306c8a2e294939

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4cd7319d2fbfb8d5ca9b7b265fec8f99a0804cdf58632e7075a466dda758a803
MD5 6648dd20b897e91e44745e46e5412144
BLAKE2b-256 f2f406b41d249ddba78495dfc06d1bcff94f9f3d4e3182497f1d23546309a5ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp314-cp314-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 444efb5f0c69aefc6425eb847c095759cfa2b39bb55cf483f7f55d14f54acae9
MD5 92a12da3218047ec58a87a9d392f4d59
BLAKE2b-256 d408d017827a15bcde2d1f6b3267dd99d62ceafdaf1025ea8e04013c3c28e831

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5b678486c5b9536c658d9a62631d67a1caef79896544bb559a6e5898c77da4be
MD5 bf557c7c2a4dada768eb0bdde978a71e
BLAKE2b-256 e6d7d3ce6a8e93025b7e9a65cd66751b8f7f1e21827cabbec3374368030b373f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d91bbe6c790d8ec73ce981f9ab7f9c3dab4781fa6034f23fd53d5f4940894cf0
MD5 e78c5876143a8f3043e99f98bfd07a58
BLAKE2b-256 69745295d798e20c2b47cea372297d66c26440474d56b90af983f0dba33f95a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a4337e3954e7016c534790fe070d5520877e5def3138939ae17877d784639cc3
MD5 c7eccf04b1ffab56b2fdbc19472443be
BLAKE2b-256 4db5a9ff33f02a7dc08f2d4be674c9ad7d2efcdbaa2ea2673d56699fdc8e4c51

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 64d10c7046bd06497b7f84992c32b1f9ed16da9be47e8f03288e7fd4ae881913
MD5 18e40e410bebe9fbbfe6f1b2310eca85
BLAKE2b-256 0fd3d21f23db40fa59e2bbd78b43043d9478a74ee98b98bf52a1868d679d10b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 29e3b5fbb7fad8e3e63a8bc03e9e82dda24f890c1435577d40f0460d9234804f
MD5 8c2d37dadc9109e9b950fb3eac8bf174
BLAKE2b-256 39b29149b5b8acecae8be01dd76dfab75bccd3d03e9ff6fa3d79a972da68bbbe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 69b145a611261ac0b68d7843be29ecb0cb92135ce1a716123f146d065c68b9fb
MD5 6a3b95104ddeb0582a2907e0d99cb80d
BLAKE2b-256 8148a0221ad928f4344de5fb9fe257b76040af82e65fbf86aebec025b6f93364

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 99ab0a2c261a68e18f222b92310b5fa9731fc937797df41c116d76abf5452e26
MD5 f5ad43fa8c397df31f022f7154d47f50
BLAKE2b-256 30ff7553312251b31db8d899c0dc952ec00ac32bb54e4f35d4e0eb54956627cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 f07f4603c883a39e7ac46592f81f8b236b092f731866110021bb65fe39c73a99
MD5 b6fff3dade24e3038ff082a98b125538
BLAKE2b-256 99ce70aff9f53404c314d351296ea7abb07138c0e4770431d959662691ad653e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f091bd8273cea5b8784530fb75182ebb3c2e7600242d5eccf2fe20bd3e835c1a
MD5 1527fe6b46ae6837046ec0432f2c4c04
BLAKE2b-256 64a8dd09593713ad79a6f0519f0f7982b994081272f39b9026dab71e16ffcebc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f51bb5470b85cf5a2966b5a007340d3afe80c774d6cfd5f797b6d5a69f54f76c
MD5 8fea1e542e6fc5e69f0bd035c48e58dd
BLAKE2b-256 632b20baac089a3d53a20e55bb731edc22a42d3b5227ecdada0eae8f0e06378c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0344d1727a9474fcd0037b1d1741e23f238ffebb39ae75c631c1880ac1179abe
MD5 6ab4d62e2446082e266749089f913a16
BLAKE2b-256 b3a27b147e76b24e04ccaee9ef75e5a9578ee8be783ed34c68bbd482a29eea03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ec30ea26007dfd3606af7e391c40955ec1dfbc78832e160176000996f623056c
MD5 a21681061fc28a38ce1d2b08f914fa7a
BLAKE2b-256 4842c791a454dea339be60bb46dbfc45420dd0de2c4cc15adb0ab987add690e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 543ee3ebab3bd450a44396988dcdb8ad9a0505ba411f6789cf39058405c93681
MD5 454237d65290ed68f4b497fb53d580e0
BLAKE2b-256 f9b979dbeab9de2ca2b80017d5a0f51a957408197dc55de61e55a2d99cac075e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d2e9b0e466476a73d2b54fb03667fa552184095c412222fd63f20b279f46ecfb
MD5 78ba63f2b5a0e6261166d6c3cc167405
BLAKE2b-256 53263146ba198e80f5ffb57936bd1f5da7f3a4f02756e99ab152417090c9186f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 119290306235b71cece58242522bba08b1280d7d4780e86156b9a1dfca52858e
MD5 f8893901bb51dd3b8e641b34ee23b362
BLAKE2b-256 060b4d697ca800e99269d005f1390e3814e4a9f75cda1babc89758b464a79ff8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 2aabb6b112eb44fc7cc5f9310d0e6835a967b7a228db26c5e1fdc46bf1389412
MD5 53b111885dceacf469a820f4b0dca256
BLAKE2b-256 e99d29312aa480caa105e857fc7653fa082cc90908f42adcaebeebb90bb7e8ab

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post5-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 2feff915e0c385cf0b5061f1c306a7dae79215bd31aaf8bf806014303f2f18f8
MD5 645b5b388115e167e349f727498faef0
BLAKE2b-256 75ff1540aaa02754580a3b385ff0fc2ab533cebb14bd35bd303eab8f3e92e9be

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post5-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3cb1ff64a9e063157fd83f66bfbfca9163e89b179b63503f01b3baae1bd5bf8d
MD5 0a8b0cae433983e9c60891cb472f2c3d
BLAKE2b-256 baf44df6300e42ccd0b82e546dcfc17c4a6dd32d53df2081044c2704c736f2cd

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post5-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1e8b039307e5e2d996ea96e09373c41ea8b5e8d4b8b0648ba1849a8284e51ed9
MD5 cce93d96097e9621e9e5aa4e1f4b47ed
BLAKE2b-256 b6eef7f91b99e4d1d448ae29aabcfdf44f9de9246c32a1b67c3a4a9cb24bdbbb

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post5-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post5-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 8c5b65b4a4e641143d88b50fad7e70022d542ebd42fc1c0a348fd9c83b9c9a02
MD5 656552f5c76a685818ab59015643cb12
BLAKE2b-256 ae299ab5b0ad8165a8b63319c064f9e619ff08c2aca973cb360ff5147d33beb5

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 Pingdom Monitoring Sentry Error logging StatusPage Status page