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 をサポート対象に追加
    • 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.post3.tar.gz (24.9 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.post3-cp313-cp313-win_amd64.whl (24.8 MB view details)

Uploaded CPython 3.13Windows x86-64

pyopenjtalk_plus-0.4.1.post3-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.post3-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.post3-cp313-cp313-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pyopenjtalk_plus-0.4.1.post3-cp313-cp313-macosx_10_13_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

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

Uploaded CPython 3.12Windows x86-64

pyopenjtalk_plus-0.4.1.post3-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.post3-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.post3-cp312-cp312-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pyopenjtalk_plus-0.4.1.post3-cp312-cp312-macosx_10_13_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

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

Uploaded CPython 3.11Windows x86-64

pyopenjtalk_plus-0.4.1.post3-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.post3-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.post3-cp311-cp311-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pyopenjtalk_plus-0.4.1.post3-cp311-cp311-macosx_10_9_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

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

Uploaded CPython 3.10Windows x86-64

pyopenjtalk_plus-0.4.1.post3-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.post3-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.post3-cp310-cp310-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pyopenjtalk_plus-0.4.1.post3-cp310-cp310-macosx_10_9_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

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

Uploaded CPython 3.9Windows x86-64

pyopenjtalk_plus-0.4.1.post3-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.post3-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.post3-cp39-cp39-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

pyopenjtalk_plus-0.4.1.post3-cp39-cp39-macosx_10_9_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3.tar.gz
Algorithm Hash digest
SHA256 c180f885cbdf4902f5f7c9974f38eaa2343594fb568c9d6d6d7d1c5057f23ef4
MD5 54374833113a0a93db3e85de6cbeea1e
BLAKE2b-256 d25ed3a101a0bf4d35b3c4c294c8ab67ef63cda1b549002672af12387c34f922

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ca627321769a8a35b56c93ae930b24885e4ddf48e6b00408ce42cd599d9967da
MD5 3e756ae6d88d304da00e9c7dae3336df
BLAKE2b-256 99fed26aed850ba299bfd5abd9fd70d9b2b8b4f6ac679879e4c6755117e8ffc3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b5d584f6e09707b983e2eaac586ed6c2fbb834e3ee7d66507de4de2261ffe726
MD5 5312ff68cfec3ef012bd05cc1f1ed374
BLAKE2b-256 de9c6cb0251875a5b6766d056904a1da4a4508d1c524198962de1dfebdccdf2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6b5dd9e3365998757db66e707803e58cdd25f112b2b0d2a868d40e26e2630532
MD5 450878f24fcf028d642fc6a63ff96878
BLAKE2b-256 f886bd802aa821c023f94eb2ac6573eeafd84dfd11b57303ba74c2b63855824a

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 84b19985a2368a851edd7701aae53908fa4a77474635ba9b4c50ef512c116125
MD5 66a3478249ef628e06a858137af24135
BLAKE2b-256 0c3c5017f173f5e51550ebee7d79101057bb216f70d5179a2de583018084cc01

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 db8ce52696163c6421baba134c7e6a01a856ec39399a13551e8b104d9fb110f2
MD5 ba3b9dbcd9b42c5ce4df4ce043b7c697
BLAKE2b-256 96e13a865d09ee1c4deec6a58242046a2dcc353c2e2859f8f7fbba2d9c6ff644

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 536a2aea4724a90740069e09d4c35e59e6a66cbc1c2a3a157f70f591f1236149
MD5 b87bb26955da4c84d5a25cfc36ccaba4
BLAKE2b-256 447b6f180f81e52f31464b93e58cba3fee416fd9c2633e16b8438537fa316ea0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b2179d7e9f718eee3bf33b918e4979604e929e996e1e8f869f24981a79194ba
MD5 8051efd0c0a1c64581484f5e1ebb23eb
BLAKE2b-256 770b2a243481a0cd9766b6926408e32b93a1e8d90aac456468384dd8cf286a47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3e54e2eadea9c973f26937038862e14f84df0749ec729418f2208ac40f038915
MD5 f3c9bf3a95281ebea7ef2c314dd0a914
BLAKE2b-256 7b2d94fb51c5b2275ea9578cdaa59722e6fd10cd5c53e9b84dd933cb61cbc1e5

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6f2a7d58966a4d6a2c72c8ea2e5c3802d5c51ae0fc2458f42b647fe5d6d623da
MD5 1ff1a671e2d2339235ee22d3096b3d03
BLAKE2b-256 920e3313b1dde001ca6b91663397607237fd2d139c05e32d1ce4216e5126b0e1

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0742569791a74b7551c61fb7cce67ed88a6b323b68dcf6830ff2b5cd5b079b46
MD5 320cae3b42d0a39cfab7ab3a7be9148d
BLAKE2b-256 5da5e32a73c07f15b441e9db7bb9af650c004f65ae0e953feaf909ba2952721a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f9bf7e9e21fcce830561422ebcf351c4834d3afad461830afebc43cb998d1b04
MD5 967109e69d2b788390402083c6f7f8ab
BLAKE2b-256 05b4b78331d09d97cc4ef3193047257acf8bf513b13af15f69638ba9efd0b566

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d8a6877d299e583b1ee980fab038bf8d1700a842f4abb3a6d4ca177f43a760ff
MD5 d5e9869d95576abd8c640eace8717d70
BLAKE2b-256 a374be859a062cfb4ec45ebb66a9c4f4a97ea2120312706bebf2e5b17bcb60db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ce38ab26fdc0ca49c8c234e55abb5a2ef7c853163b3dec1ff88fd38b5eb2ee39
MD5 9b22b033741861e4bbddcd6531a3832b
BLAKE2b-256 0276ada72dcd5916b2607734a4f45a5828d8f46e6c5c5af9f3c0e218f40cedaf

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f20d0b1109ec01f167e7f314c935396dbff025b0e5bb3ecfc0aad6e5147e5e87
MD5 e9a3f4aca6ff601bc5863e52d8a27d73
BLAKE2b-256 064987a19ea1c204db61bf7dc87497fe5774e72a5cf29fd8ccfca9433ea3f7a7

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fd3de4e0cdc25cf325e7f34b6039bdca1d844bb285816e58f3a631911e7f2119
MD5 2f79c835bb48f0c180c4dc6af09f1679
BLAKE2b-256 5ffa2950771753b91f42509dfb9638fb6031792179147af516e1d897d78c887f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3536f0854ff51e29539a2b83ca107fe0f5f6e58cdb766a4df13a9df7f14fa54d
MD5 e4b1e162420b9f8a7efba411b5e32ed5
BLAKE2b-256 0992acf49bd5866781323e559fb5f41bcdd33608b377a5f9310a59af89c47f92

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a1d202b3496be725a0f6544a1ee638a7bb6aadedb4909088df862b6fbf6358fb
MD5 49ed640ce003cf0832fc1e0fb7638ff5
BLAKE2b-256 5cbcea784c9268d74989adafa7bf9965d19d7e498773168ef33c5ac605ea2d7f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 40960e99baff507f6320de7ec1e6030c7f7f5ab564d7c63246867172031772b5
MD5 908153f5e156fd593f0004cc0a3c5197
BLAKE2b-256 45d8c22d2877fc093d533b10960a08870771d7792463733848dcdf8db3dfea91

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9f3b4419e2018d124cbe9d2c11f45a2dbb22938d3112a9e6cff58ebe581c8c3e
MD5 5413c624fa56da1180b31935a5b83bab
BLAKE2b-256 0003d680072f1b8be66e7bfe8a83bce274b62eb16742eb0145e002ad982cf7b0

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c85fd1b1551b8aa773f7bd8fa061405c9aeebb699198b468701bd649aefd0a17
MD5 9aff80f86f452545854280789b2a059a
BLAKE2b-256 adc777acb16a721637678bc0cf6e5497a94f90c1ca061e51fa1349cce28cd705

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 31f7105ca402d4bbd5835334a65be260cb2c635ec658be176f74cacf186e45cc
MD5 86f8faf430f69e1bd99f8d4ec8a61cb6
BLAKE2b-256 fe97a1eaf2587aefbe808d4b063679415fd240226aeef752451def3b57834adc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ea23a276485e2a137a1f9cf3ed12179ea13334b30b9c2fa5e2757b7adb57273f
MD5 209bb7e7737b6baba6ca9421f965ea2e
BLAKE2b-256 f852a1310e558818cd4b2b0e0108ea76d62ed82a90c86bcfc7089f8ab8c6f559

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2c2db418bb146351676f3c20e5a0b90f74c02f30302f273b909c3a1480067f09
MD5 38be4a0e0e07f6fd61bb752be9d0502f
BLAKE2b-256 c7eb53e94d2c42bdcdaefe8ef2cc9b9d6e8eccb2713eed42b6a0f92bb9771af8

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4cbe037fe2d5088801e1340dd6809468f48d79b1ffad8cfafdd8b4ef28c937d5
MD5 4c6c76fbd9efacb8c441ba5fc16b1e03
BLAKE2b-256 58e64feead8638f79d7b87b89916d95194a53c2f07778d55e3b001a4b75c879d

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post3-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post3-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 05d895783bcc86210ddabde3d040e683f2a2b43bd7e76bfdf997a1bc8b8dcc9c
MD5 b1d7cbd422fd66a7da8f38dfb0023ffe
BLAKE2b-256 c3a143ad42be28c54ad6d1510434788dd249f1a27fcf83723733c7f14ea50e3f

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