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

Uploaded CPython 3.14Windows x86-64

pyopenjtalk_plus-0.4.1.post4-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.post4-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post4-cp314-cp314-macosx_11_0_arm64.whl (24.9 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pyopenjtalk_plus-0.4.1.post4-cp314-cp314-macosx_10_13_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.14macOS 10.13+ x86-64

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

Uploaded CPython 3.13Windows x86-64

pyopenjtalk_plus-0.4.1.post4-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.post4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post4-cp313-cp313-macosx_11_0_arm64.whl (24.9 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

pyopenjtalk_plus-0.4.1.post4-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.post4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (30.8 MB view details)

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

pyopenjtalk_plus-0.4.1.post4-cp312-cp312-macosx_11_0_arm64.whl (24.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

pyopenjtalk_plus-0.4.1.post4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.9 MB view details)

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

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

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

File metadata

  • Download URL: pyopenjtalk_plus-0.4.1.post4.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.post4.tar.gz
Algorithm Hash digest
SHA256 b9b289b85a15a806d1e083384e351924465500b0b3d3389e7e5cacc74b0cc9a3
MD5 3736ebee688d7fc98ec60775542590d1
BLAKE2b-256 698bf33d8bcddb0f7bf31962c89ef30dd2dad56a620240ea9d1872f425f71901

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ebe392322f30ef36dfebb1eafb7ca996580b0344bece51e83d69f53c183c1bc1
MD5 168321b210a81498b7854006eb0831dc
BLAKE2b-256 766edb0894730f36ac4f8856f1b1ab2f58b6b9bfc472b834312f4cd776d637ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 92ed77eeaf495bc2eef35ca5cb8349d7e4204c540ba0c7b66c7661603ad819bc
MD5 58d84759fad2cb7ba178dfdc97d09196
BLAKE2b-256 edea7901b1607b2318d022aba791076c72c5e642d3f2faffb2eca2032f105ca0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6782724d7a0317f5f005c6f6ea1d78402358577afd81ef01b20e8b1482f570b9
MD5 392a59337f8a46fed321284577721bde
BLAKE2b-256 d46030cc3d6947160b988f56680ba607dfdfd9d8301bd7c329795a052099bc96

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post4-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8542bf3cfbee3dc46eee3db1c50dd5dd730ec7fcce644964a4bc4d379e2bc412
MD5 17b497c7d773cd8bc626494569a0b42e
BLAKE2b-256 0e430c5a0cde5157af60be28dcd70649afdb38ae439b84654f7b230d62641ffe

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.4.1.post4-cp314-cp314-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp314-cp314-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0d3f9e874e78de34b716427195442bc0d1a886f420cbc0be92aa9b8667063b07
MD5 e3bdc2ede0f7c19dc044500630cc5758
BLAKE2b-256 b93f6de77e6c27f10b6bf3222f0e206bfa986c73ad589e0466a7e03132607e79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 983472278f209d7f6d0756b002ddd06e80c1c878b3dbb1bd640f8fa1e174ba11
MD5 65f9ae3731e320ba598a97f7f0bbdbf3
BLAKE2b-256 7a17aaed4d3207198d744e723bfd0e847b5695b053253e3d4120cf3083081a21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cbc491287c15c017ee0f8772784670d3b9a9cd0efe9f365525411295297ab82d
MD5 48e97826772fefc2508f4a376eccdde0
BLAKE2b-256 b741b0f39b5e14f7d0079ba07d463343a8b96379cf712e523d656f7a28877d19

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7b8f70474d9f0648358ca2d25dd78a3c76e9164f606dd8e7be836cfc6d7a0aa6
MD5 f2c0660900051c76f01e2af0d9ea25c0
BLAKE2b-256 ff10e82ec88687121674e006735cc74f6e8c3c72487cca86cc00dde31502a4e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 399e9336c02c6bdbe00f27a05cf183c2bedba8fda455e7b2e23abb7fe58c8736
MD5 e9e25ccabae02aab4ac7832f1f12100a
BLAKE2b-256 3b5612317af24ed1b62721456704c7cfc0fee74eca2fd38e2a0231c4c8832655

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 183035f007c49071ace8f013ea0961af7f91be4b02aa31549065bc8512327c40
MD5 e308313416be2ea65f30e4c39570a09d
BLAKE2b-256 51707a44b1cf40ae07864854f1cf79dd8eafd5cc966ec14ae14a05f0c0dcb111

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d75d9e08b7ade3b7cfff6409e87f0c0980850cfb6ab2be99922dd0c8a3d1e95d
MD5 065937bc94f103e403d7124c6a07dc48
BLAKE2b-256 174abca8e9ad621b8fda5c88b26643a28851e7f3bacbafb5224405a0f38c5b5e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 308d79de15ac06c00b517677e152f2862e69c93950e3003560b9829e5798b2a6
MD5 403940fd85f36171fd46cf3be9c2b37e
BLAKE2b-256 f92b9fd53932855e356f38c099b6e4836eb6cbfe12ccbf8ed633ac5b119aca15

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 64ca9beed720b1958c5356af91a70b0d23f84005f3ce023a09d18ab95db5b774
MD5 b571d62b61e8ac1c4a3fb60e593e558b
BLAKE2b-256 dbe07977a5a1987c50a2eb22dc9d534900d6278f3f2d6066ea58705a49785783

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 19660e2d353a930ad79884544eb8fbce5c52aa9c43f88fc744dbcfa69654fb1a
MD5 715b9f503fd6353e70857a0a5c9eaa24
BLAKE2b-256 630e240fc4cfeba2761c6a2a9835e4570af983f2faf827fc2171817f1cb01207

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 77903f1575de37c5dfad13910775d2f0064714bcdf69f37c8d20f5d13fb257bc
MD5 9e3c6c4d6eb876ba8c3673c6b7fed713
BLAKE2b-256 533bcf87d3b029e5b57bef8731ab7a1913e1d12a89234111b0e3a876ca74b9c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ec7832d62656502cb9cf02235247bf61c2e86b67fb9433cb1d107b109d760240
MD5 5a31fcf31bbb7a5c0aedc541c730d983
BLAKE2b-256 fabc93583342fcdef775f9cb561764daf2f5621d78432ca49b7b8cdef8ced60b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 98e59afa57a960ea697c46d29a32f6748557289bc970507b21bd923a6ebdec5c
MD5 2e3adf53e5293e1a0833e76b334a94d2
BLAKE2b-256 058e0b057f024707e74cd114d9cfac710f6a6a0e82fb40670c45953c3eb7d653

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5dfaeaf21797e7ce702f375a90283c4f8658cdbb7cf7ebde3b9455a64517471d
MD5 b7e88a31cb4780a9c2653d00d17fe2c5
BLAKE2b-256 b35b2bf2e001aeb0f388db827dd4e7d756246a61b73d23dda179658cf40fb796

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5f3661094184a89555c31d365cc98d8344825b673f2090ab6cb57d4c492a433a
MD5 790a0ed55351c1e8171c47f9c70b07c9
BLAKE2b-256 dfbfa8a057ede0c25d1a16481b59026b82b5aa69d68a30bb14fe27ed92a0304d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b393df8db2a10b0b97a3528c9a8d2f94ae97a97bda02d50bf4698d2d4654dc91
MD5 5af677528b162a2b7b9a49a0fad26008
BLAKE2b-256 cf8c91c50f228a701a0651944cd302cf79a7acc4019da70d0834dd00409b69d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a5803553088f4b99c89f3169c72ded5686d17fbd519a6f1f7ec93df3b3b1b719
MD5 915e9967ce3fc7b50fcf849b61105725
BLAKE2b-256 84b37285c8a9b64ac4f0aef9998c4bf9e98cf9c04dd6dbfec37eef232677f8dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 65a412ee79375888d61068009c0878d0d8ee6f7ace3025cbe789669c35dbe9e1
MD5 8b8b39199d5463e91893624effb1979c
BLAKE2b-256 9ba43dda018c4cf921d671162551f9cbf746fa3e10f59a0f89ecbd988d07887b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a212d187fb20c365e2eb8c33c5119ed966ee9177bc3c69db4a1234bb304dcaa6
MD5 f1cf06189986d49ea2245d05835d9d14
BLAKE2b-256 05fe3fe7acc83559cca3115cf15285c0fc1d91ac413b30c2575ac0a68507005f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 faeb4848092afba93b327f5d0c25b4057213aba33b38c76a5c3d031cf65ab438
MD5 c1f4cb5536e9722d8363984c78035ad0
BLAKE2b-256 1608ee53ee8db8facae34193cf33b49cfa01d504663815bdc04cadaab4c9449c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a4ab4cacb8472c2a97b43c3bd8653c8aa51ffcffd7cc05d9eaf7810b23e40cde
MD5 c357388943dd9b1d99d304db8d451f24
BLAKE2b-256 c1a8bdbf99bb35a6338fb6fa34376bc1697e71143b02d3b1c138d9296606bfac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 e04706f3c8302e290bf4f6c692bf7bf63b33e55f7eb9a1c2323e3c443c6c66ec
MD5 33c19f0f1f1c6b187bd12379f6e60463
BLAKE2b-256 715b03050dc7cea08d709cfbd90471385d1cbf2b7881ceadec71401865cf4b49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ee7d19d61b39b2547bfa34c56d70ba83e344a6077c75496a726aa0153a06ef59
MD5 de3fe8064819101c30019c3aacdccfcb
BLAKE2b-256 543a7fbb981bd22c036f6ad39097a3d05fa3ef647bf5e8c0ee6d0023cfe680fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f8ecc20fb0bcb0d889a3b089ec14633fa6ee2365bad1564f01be3b3f199c5513
MD5 a34d184d185c7744631c9d01bc704a58
BLAKE2b-256 ac171493eb8db42f79dcdd5f054b7752fff4b2049a359e9781ee1037f2336d18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5e36e3478428bb6847fd4fad224f77bd8c127d275ff9d60398881f229026e453
MD5 764246ab0d2534de7d5921f9ac7cef56
BLAKE2b-256 f3440218af8cdbf4475eb40b30f0fd79193a569f0b05ec8bb6995efc3a251994

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post4-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ef6b919be5abf0dd4d033973b9af9b7ab0b3385a4f6a761a956880a1b3bac85f
MD5 cb182e921e25b3e96752ef7c22051d55
BLAKE2b-256 bd5ac16e1cf4e35b69ad36c77a14b5ded9df087cdc0ad273c7d864e039e1ee2f

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