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 に含まれていた bnken_jdic という謎の名前のカスタム辞書をベースに jpreprocess/naist-jdic での改良点を取り込み、さらに独自に改良したもの
    • この bnken_jdic は、恐らくは OpenJTalk 標準システム辞書の mecab-naist-jdic に対し、アクセント・読みの推定精度向上のために大幅にカスタマイズを加えた辞書データと推察される
    • 自然言語処理の専門家ではないため bnken_jdic でどれだけ改善されているかは分からないが、「見るからに相当な手間を掛け、仕様が極めて難解な OpenJTalk 辞書を継続的にカスタマイズできている」時点で少なくとも open_jtalk_dic_utf_8-1.11.tar.gz よりは改善されているだろうと踏み、pyopenjtalk-plus に取り込んだ
    • 一方 jpreprocess/naist-jdic では open_jtalk_dic_utf_8-1.11.tar.gz (のベースである mecab-naist-jdic) に jpreprocess 向けの改良が施されており、(恐らく手動作成されたと思われる) 辞書データのミスの修正など有用な変更が多かったことから、上記 bnken_jdic 内の naist-jdic.csv に追加反映している
    • 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 による AI アクセント推定を行えるようにした
    • 以前から pyopenjtalk.extract_fullcontext() では marine による AI アクセント推定が可能だったが、pyopenjtalk.run_frontend()pyopenjtalk.g2p() にも実装した
    • 具体的にどれだけ良いかは検証できていないが、OpenJTalk のデフォルトのアクセント推定処理のみを使用した場合と比較して、(PyTorch モデルによる推論が入るため若干遅くなるものの) 文章によってはより自然なアクセントを推定できることが期待される
      • ただし必ずしも marine 利用時の方が自然なアクセントにはなるとは限らないようで、軽く試した限りでは固有名詞の多い文章が棒読みになりがちな印象もある
        • もっとも、独自に marine 向けの学習済みモデルを作成した場合はこの限りではない
        • 実際、「デフォルトの学習済みモデルは JSUT コーパスのみから学習されており、論文に記載されている性能とは異なる」(≒ marine 開発元の LINE 社内では独自の音声コーパスを用いてより高性能な学習済みモデルを作成・運用している) 旨が marine の README に記載されている
      • n5-suzuki/pyopenjtalk では marine がデフォルトの依存関係に追加されており、専ら marine による AI アクセント推定を併用していることが伺える
      • pyopenjtalk-plus では PyTorch への依存が発生することからデフォルトの依存関係には含めていないが、別途 marine / marine-plus をインストールすれば利用可能
    • ⚠️ marine 本家は Windows や Python 3.12 以降に非対応な上、非推奨警告が多数出力される問題があるため、これらの問題に対処した marine-plus の利用を強く推奨します
  • litagin02/pyopenjtalk での変更を取り込み、pyopenjtalk.unset_user_dict() 関数を追加
    • VOICEVOX で利用されている VOICEVOX/pyopenjtalk には、VOICEVOX ENGINE で利用するためのユーザー辞書機能が独自に追加されている
    • その後 pyopenjtalk v0.3.4 で同等のユーザー辞書機能が実装された
      • 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 での変更を取り込み、日本語アクセント・読み推定精度を改善
    • n5-suzuki/pyopenjtalk では、カスタム辞書 (bnken_jdic) の追加に加え pyopenjtalk・OpenJTalk 本体もより自然な日本語アクセント・読みを推定できるよう大幅に改良されている
    • 特に複数の読み方をする漢字の読みに対し sudachipy で形態素解析を行い、得られた結果を使い OpenJTalk から返された list[NJDFeature] 内の値を補正している点がユニーク
    • 他にも日本語アクセント・読みの推定精度向上のための涙ぐましい努力の結晶が多く反映されており、有用性を鑑みほぼそのままマージした
      • n5-suzuki 氏、a-ejiri 氏に深く感謝いたします🙏
    • このほか「何」を「なん」と読むか「なに」と読むかを判定するための 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.post2.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.post2-cp313-cp313-win_amd64.whl (24.8 MB view details)

Uploaded CPython 3.13Windows x86-64

pyopenjtalk_plus-0.4.1.post2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.9 MB view details)

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

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

pyopenjtalk_plus-0.4.1.post2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (30.9 MB view details)

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

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

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

File metadata

  • Download URL: pyopenjtalk_plus-0.4.1.post2.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.post2.tar.gz
Algorithm Hash digest
SHA256 efea040167f0182441997348bdc634f64691f06ca419eaf47873fb278c0d82bc
MD5 45edab2cc06c45f161758d02b71e8f13
BLAKE2b-256 5d44815e4fe090f2e3e2ff07f3f76ac4294db452b8b73778edad6f960aab39ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cc9e13fb55a4c6cffb769e5f87b82261ea4d595f30ff35e7dd6c6f06cbd72e9e
MD5 ddce0b61d20209c0d4f10787d0856780
BLAKE2b-256 e6104bbe7b872a13c7cb2d79df037e16b4b1f888ca09e22fe34089cf8a6a1042

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ed6592247c6f42bf2e916d19014b5753544e53229394b49af5ba7245cf842aa7
MD5 6cfec64c27c4e30ae7158dbf65f87e44
BLAKE2b-256 7629c8825de83ee855fb2294815245aff7c10e12ec46084463769df9d09a1480

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e6a7485b85ff9929e002ec8de1565d1cceb57b3ac0770598f954ec0403fe13ea
MD5 92ed0440cb04b9432976dd5409acfd9c
BLAKE2b-256 14ae919c983fde71b52130b9384d9a65eba0dcd7fbee06cd95e31b3f6c331ea5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 968a90900c688c1fb4001ba78e89b434a3ca11c5480ef81678d241da77ed272f
MD5 599b8f444c0cbe55a9a3a5570fdef4a4
BLAKE2b-256 ee70a1ed3536c5219e718119513b30ac9a2cc9613fadfd6494e9c4d9017cccc4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 bde22316a4b5af9f015fe89c106d01b60f7bb6a8ce779df0c51a4f0d602fb61b
MD5 c916e77c613363b468db75f7d799ef36
BLAKE2b-256 a6269566a173200fa6f0ce19390b103ad9146896b1a9f40cd62a58c7ad419000

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4607b1c1bc282c3e53ea4f63ff543f0ed10ed787c68037550bf587a780c54faa
MD5 5c700aeccf7871bfa528eacd8212505b
BLAKE2b-256 a7defcb96cb827a31dbd9c286ed848321add4116e61aab0fed7ab0f41646c4d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a9746135edafd125d6c5368d4be6931c08ee8ded0fc7f453b5f2f7546e9d0618
MD5 3190e115cd46b372ae88970782e0ca7a
BLAKE2b-256 e77c91838de6b2407fb2a4346f835798f6e0e4e3ffc08d3131b0c58c497739f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 abb50a26ab519bbd036ad5ef12ea43e4f17d990372e5bfa80ddcb82d20e9c6e4
MD5 b79acd201ee824592c4d2e2c8a6e294d
BLAKE2b-256 d6ae7f77f6960f06d4bd1371aa47e7bfa1ac6baa3a3831c965ced8d16c0fb5f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd9f719978c93573d05c4346deca8f331c56c7537ccfe44d59fdc485fdfe5157
MD5 a4ec3c9a5c27e2bc916ee650af3a0a82
BLAKE2b-256 b6bfc006195022b4632fc9aedec1644058ab0968d22ff8ffbeca12354df6997c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 24ed2aaa718583657b4f65dc57465b5da0133ce0a1204d8a506860e4c449673a
MD5 89b007827630604fb128b4ef96d5eea7
BLAKE2b-256 3055a105819e361d10136c31487cf3dd9a1ebcb7b39820dc7de89931d98eded0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fa8471ac9a421be5a8fe3b5ce330b814c9b2052e3bd8087c8f896c2ebd8a980e
MD5 6bd0fb94847acb1b5f6aa29381b83ed2
BLAKE2b-256 89631787d976fe9fde9e9ed4787395ddbcb981bf65c87a7712dd1f9601494564

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 342636ce0c86d33d57b74de8b54c8ee6634f8f990328ecc989cae25e14c5b914
MD5 42093685c3a5b7d862686e26fb5b930c
BLAKE2b-256 334f45d995e2d28e337fc5ae7c7093ce3c5aff133cb6c24a949224125b58cba2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 832552a2a0764f44b51b8014f8ad8cc3647bd561ba188d98c7f575f375a5eb3c
MD5 87020d2e0ba386cca2524367e937f9d0
BLAKE2b-256 84809c7d60adb95c5481dd137e8cb4efdcaceb09ecee5ba27f89db9778f50e02

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 650841747850e109640e70bb37904b9707a63676f82df6e24eebff4c1783c991
MD5 1b1109f19fc83332ce630da0b5455eda
BLAKE2b-256 b4dcc0489e99fcea997712cdaeee910279223e813293cb2e15cc31776ec9a27b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1fe482ef21e4b805a7ddeb9da24b38a6150f0594806bf4cb5cae3bfda05abeda
MD5 5b8b62a3badc51fce6963f5f8d29c16f
BLAKE2b-256 81ecccd137a504ecfd3293fd814fca529d1d83d0b0af99ddf7a591198dec72a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2b49ec73193055549bd5cd86b2cf2dd204fce8b15820de86d9386c488b0655d6
MD5 3670707fd45f9c4a762186a9e3d390f8
BLAKE2b-256 7aa61eaaea58922ee6d22d9ff5d8ae55f926f80395b0a9ee5085ceb34bc0c8b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2c1ead7ab3c96e90cc1a96f0146238a936236a246228b4dabe439cd73d7fbfb8
MD5 20de65f13e6488682aae4c2f4702cf89
BLAKE2b-256 47dca64621379bc7ad4cac5c2711c5e88155ade6a46c48b384f90c7c6af6cc72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5c474c7e210040f9e0ebebd1f586709b5ed65a7eb5f9daf4fa3621b5376a143c
MD5 f73ecbd07abe80493e34a62339c31953
BLAKE2b-256 8d88c4fbdae0b5fe0beecec76df2a05f3c34be4983a4cb624159d9d2dea810a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a6a2f496913ed605b70a2b7ac9e0b5ab9ee6d1a80a3acbadbd26dd3e9c25d86
MD5 e7a90d5ea17cccb7123ab533f1c2bd1e
BLAKE2b-256 de2d31eb2ec208cb25c60cdf0b53f9ccb3138fb35980b38d78b9f327683037c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 57ab894bdba76efb3131e4b3a9513131fa8216fb0d8af2fd35227bfd80708c97
MD5 d95dc2d328713969ef56de3cfea86a2b
BLAKE2b-256 2e33c15e21a47a49d1fbf4d2f847a105afd1986224ce6365c7426b795caff391

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 84724c274c594c2ffa9bb2879c377b753730be47ecbc1d20c3c26009c947a0db
MD5 ec32608626967515449c89b01de8557c
BLAKE2b-256 bc3aae542913123f24e321938037c04968c41d0af4581e56838f313fe656cff9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5e506c157aba5769232ab22c9e084d503f9cf5c7a354c3d6d82a4ad5bfb763ba
MD5 8b725d48049f981ba82172781cf5cd9d
BLAKE2b-256 9ad15b483ec4a3128d96fd4ee44c5b63f9e0a509dcbee5347bc640358c19f95b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2415aa17e3ed02a7c83b478a24422cf70beaf9119fc085f04d6262d5cdb0bb75
MD5 c268ce9a4f85e51b85cf237aa335c38b
BLAKE2b-256 53397385cd99cc4d8fd5a3ffb94be491c5b544b26d80ef5463974af793a28e52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7c43a3ebd16cbb08e0b5b3f6d8aa3e5c4551999937401ae0589a4f0764c56149
MD5 f0df9306d490ee936bf458a1f21569d5
BLAKE2b-256 32900483b187e2ab5d129dbf7a037eb10efa3636d3630e9dd3290797c6c3ec86

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 77d697f41b804d9e39eec1e06afdefec86ca5ca2225b7f85bdc46bc64439ae07
MD5 7e356869d273fbc9dd5110844ad6cb75
BLAKE2b-256 af3233d407a53c587636ee6db76d04754e38b8638a9db1d871a7890a7869d286

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