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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.9Windows x86-64

pyopenjtalk_plus-0.4.1.post7-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.post7-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.post7-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.post7.tar.gz.

File metadata

  • Download URL: pyopenjtalk_plus-0.4.1.post7.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.post7.tar.gz
Algorithm Hash digest
SHA256 555fdf86310d6d72f4a37e92beb251cdc2114aafc133d4c77b136a07a4b17119
MD5 b66cd151ca318f6a670e18acc44c4d73
BLAKE2b-256 824e1e2c165b04dd250dbcb1c270df8517681eed5c20b755c72bec2b42853851

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 5789aa2aee8da2f9a0786c2950b131e45be2ab3c99994071a481cce14e5ddab6
MD5 e4cff45a0a06877667a7a8a09d4e8bf3
BLAKE2b-256 9eb4606d1340435f91c9f79a4e1124fec7da78857e87a25d0fda8e47385c15b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1136e6515a1ceea0be4919642053c63cf0bae48c3521fc6a6ca0c120474faed0
MD5 257f8ebb480f3ae0ca16ffcf4cd6d3fe
BLAKE2b-256 02a44f55520f62cc781a4ac01b887f18e51969c59ac3aad2982d7658b752f818

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b2f1ed0a103c5888231ac93d81f8ecdb9f911c1e95b25e426ce532f1e9dcb093
MD5 992dfd9efb344bf783ebf019361bc17c
BLAKE2b-256 28da6b2a36f3eb486cb67e285078a239ad07934d7c3dda855bec6e4bdfb46cf4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp314-cp314-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 2fa27037794048022853acd27176544600493d1853bd42e6201511473cbf9767
MD5 ec39d820007a4ef5f90d04005ff96fcf
BLAKE2b-256 60df0f914ff67785c630dd939de0db5949f98907051a0857366e002d50149d76

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 820c14e64dec75f2b55c9156858cdb06b7fcbd7524ddce54c3fadadf458f2fa9
MD5 c37698c737a9db3cfb46697c90699711
BLAKE2b-256 1912381e3a3237538cbdd72abceb062ee9e7c97971bfc31b86b3d23726a91a87

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 eff2e6d08f61de8867df5e6d3b800ec288bb930e1d48945b2d99347a0d86dbfd
MD5 e0a57fc55b105ff0b64191fae8fea1d1
BLAKE2b-256 6760b066ce8290243b291b66594387467f2e3dcc7f32a4e6e849a90b664aa968

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b35c066ca599f0d122b97e3627855b84fb51b119edc48b3f5b21de6eda65ba04
MD5 de3f792a6acf8702c1906a6f97fc977b
BLAKE2b-256 26f772bb78078f06c5ae7b9c5ed567f8d5fd5c4993c5151722f06b53dfae9376

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 61d979131cbe00cfce683b708fe6090bf59f607b872f92f62aeed4c534ec254b
MD5 0755e24da72c0c0fb2dd5948f7006962
BLAKE2b-256 30b107d3981aed23a8271d4422ecaf7796ba43b107809c57e88da56ed269f957

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 75707fcbad4bdff93e0556096507db0da1e9189e84fe91effdde5881eb2752c7
MD5 b738842d4111f7dcb050303bb9ee486f
BLAKE2b-256 c377cfed1ff244717ffd8541bcc29808ad83a6d3f1b0757692426d4d2cbc75b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a43cdb4a8c7de92571919c166a708e36ea7c887ecd127fab5a5e0a2e54b74948
MD5 7c467f73246ec04e30b82d335b93e625
BLAKE2b-256 8156fadb616098829ef1aa6f34d6ebafafea11f8cc24b251d930b2f7cf58673d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 91a04f0c5fde631ca0cf65277b42d379c52fdbf56d0eb6bccafa0847a0cabcae
MD5 3fec38dc5f2db80486f536ec149e3d0a
BLAKE2b-256 b2b04e78757630ec3546564418d67b5d53127feb6e8bf9e74cb2de022c6556b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 a579e829e279ae3fc9a8cb54349fca9a81ca416c77b3ed4f076616c09da8f22d
MD5 960eafabc444789bb968394fa054d692
BLAKE2b-256 0037c2b1158d9dee416627f73f9c4422e2c0f9882aafaa131b265b2d45311cad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e6007a19795e7b9e07cb10e7825ec90a8abad0b6af4b2baeb6808a23563f4fac
MD5 2d17bffb1fd4735f5839861ce54073f2
BLAKE2b-256 4a522cdc5381dfcd01dc1d64133a67aef6bb8801691fe679121a9be6df8210bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1592e9949abe631b6fd0552b6b5ea8e45f1ad401d296da47ede63b352bdb8d1d
MD5 c179703da1362ef28a0658d0efe14253
BLAKE2b-256 d0df3c0102c9d0b2a2fa08b9449a0b6feaa32e194244fcf70626c0aad5433616

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 03fd223c565de498afd1722796c98452e1699852939426a68796fd7c3bcd8a49
MD5 c5d752bbe1cedacf34137be77a3a7519
BLAKE2b-256 df2ac4e8fede0211950313c34007de8dcbb1e2bafce160caba04d231558da30e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 50624f033a9b14379b043a23e7b7b1006f7b6fc5e61372a9a6908dd376a19724
MD5 e7444f4385da76f76775d9ed609c56e2
BLAKE2b-256 99983278de8a32d8df113f4daa117e8b038b94ae9102a556ee032315b4c22a8f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b947025e8c351590a6ae1f7c53d479288060a6c2a7e46960fa9041370df0d17e
MD5 e5e7831a3b67085fd6a22402efdfb854
BLAKE2b-256 8e5eea29334c3e01575e367959de253aaaa7aee39b0c360966de6077f9f234ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 248e2fa3c228b1e52fb494eb6515fe793230cafe8b5ae418f990b629905d4166
MD5 14040686155df7a34cf5ab35de1470a2
BLAKE2b-256 f0bb63bb8ff44b1200fe17eb0e213ad2bc2cadb01cfe40b1a557fd5cac61d83c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a1adaad3b6cb91f430c2c9fe339e0d787418937bd96cb1efa64283cd6c8a1580
MD5 d7a12defd2186d2a86a9bc7c58834d27
BLAKE2b-256 d76b053604adca01d1ddaae2840b70b20ccb961122395abda2db8ae602cec217

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 694ef0352eaf2e3b4450d84344411b8f2a4e52f2733149f755555afcbea11995
MD5 58d7a22e5bd4a684c733e7fd5fe2f34b
BLAKE2b-256 ab7ad9d42e76f14b8e493eb7c55a85113fe714e1012b57f90c6e909068cd3405

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 728f8a343c31b69324a55e5976f1bd5ee7bcad936551ba306bef5c4c1bcdf654
MD5 65fe1c27ce9993c97c225b02b3972249
BLAKE2b-256 370b787bcceb235c51c8c7c43f973be0845b15d8315adae341d2344227ad59c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 edbd689afa3905f7302697f9de08ca40fb75e81b4692dfdc3656d23833967f7e
MD5 0a4ca144463c7dbb4d832db154be1e63
BLAKE2b-256 cfec41e9de61a6bda8c78b2333fda01f44f16ef4b30707d43761326353bf2389

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 822d0a93d7326d054b887038e11e765ac21157c522a309a9c80e9e89ad9e51f8
MD5 dbae2fc9bdae0ee7f5525c8b550f6d00
BLAKE2b-256 e41c28fc58a089bd8009c3029ef863225c6ae2f7fa0deb9bc4143b9d38a467b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post7-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 77bbb0485926d9a64d11d0791c3972dabc8405baff511704789b8366d42c93e2
MD5 39796a43f86bba60a20342477a2084c0
BLAKE2b-256 9bf19cd4aee1c28009fff71c17836f7de41ca3370a7e11ba52b6378af7771eb7

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