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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

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

File metadata

  • Download URL: pyopenjtalk_plus-0.4.1.post1.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.post1.tar.gz
Algorithm Hash digest
SHA256 8c1d4a0181fe5b9026ccd5dea8846045bbe2949c9384864b2bf46432374e3238
MD5 2ffccbb2c93e955e5cbda81dc6dc04ef
BLAKE2b-256 4a4eea0a7749280676afa166c9b369214908d69ca07e57a5f602543135f6501a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7bb1af9903ff10c74979654b336f86a1599f7377b841b4f1581199392da236ae
MD5 d1862b4fa5bbc9028b24b553f5fa5513
BLAKE2b-256 fd210eb2e3e42127429a003c679432c2ecc64ed026b67558d76dd5083e79eb2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6b0bad11e56030a0a8511aa642a19df433e1cdaefbd5f54e4dda26b0c2565d9a
MD5 97f88cfe19bd733fd094138c92a08a8f
BLAKE2b-256 f480dc97f27ec67636134c45c15dea74b66b3d4466b3499248976b0c4673c1c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4e8a3f510f8da0bde92a44167a8ea720e4628e7deb26bb6fe7d5e329ae1d9b78
MD5 3aed954ea6c3d42bd15effe9c84f1cea
BLAKE2b-256 25fe4083c7b0891b0d86047cca0fba03cbfc3e3572a446f86a8b4b5250490e14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 acebc471a5572a5b54732d735318f0cf05f208fe785370493d7c5899ede23b5f
MD5 377ecf42e8511a238b3f18ef016fc9fe
BLAKE2b-256 40a2abf9e8d2b780ba61063bf32546f40bd8935514007b2ff820faba4b0b2b88

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 700e38ea687759445d9bdc76c0c215a9617fe79cab9901ed0f569f4c93c5231c
MD5 f61533aa3de8938a3e53d85bf82e1614
BLAKE2b-256 7865a56840e7632b223a5d49ce82e7cc514707b6ee091a1258072c3a5a970b5d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3095bdb0ad2bf8afb79c2110be697faec8a3b3e022dc5451c7e90374ec3be3d6
MD5 5c64c7023082c35062cdf06fcc1004fa
BLAKE2b-256 50e0016a447d616f3b0b1bd4b773320c6f3d72e932d2bfc135cbc5c5616f9552

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ce714af789d96b33694f57dfce128ca74e76cf6ae2acb6d68eebc12cf9cfa88c
MD5 8907af250ac4f029a5f7295d13a79217
BLAKE2b-256 5001ba96adeeead860e700afe4898f2e6fd0100927e630e5f668f8381acc73d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0f4cd9ccb1ad32c233e0321a14c92dee68c2de429d1ba25a36536d0f25103c50
MD5 37ef63586a513668a916ff311e256377
BLAKE2b-256 8f38c5a91e9ddcb3cd1e2e3c467093bc7fb0903051e3cf5a72fd218900ef11a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 21d4f881c88afdc1b046cf4bbc8d6fd762d7da61910bd81618edc0787d1312c1
MD5 5bc0857f7ebbca06bcdd0e610ab2d36e
BLAKE2b-256 94aaf4ebd2b24ca09f337d33575449fa668b49083d99b95f199db82c13c4ea41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c1aa1e79316b5d2e2c0778e538ac1a0fb575ca1f0686b5c5cb3c4b1f7646b407
MD5 89c4c43f937fa0901fef2396787ac055
BLAKE2b-256 641409924e530eefd4c99a9a6d3be0c12c317a1f96ea99aa959a9f0f78d1adfb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fd0ced941deb00a41f012e7cbbceaa8feafed727ecf9cf6b062135b3c54c8a9c
MD5 8bf92380611bd6d01ba6ae9d3bc4c0f9
BLAKE2b-256 9c8f8e400489ee8a4bea443c7335b4ef96861338a8c4a71087b3bb0e5a1cc1e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b689276c0b151db18c76365865cf53a114b0362fbf2c6cbaecd148160fb17bc
MD5 471afde8e5fea0d674e2b4f6c724b78b
BLAKE2b-256 569611eb9dc531916c2deda78f1fcbb455323e09778cb02ea9dd5cb75fcf89c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 42e06a38b7df860c53674d13b65984c99741978fc8c662869c9c176b546758bb
MD5 b2e9c67fe9ed45160e0afb2cce57bafd
BLAKE2b-256 25f97cf85e1b5bfa23182075b2519d8576f9b9115b27b34a8e978a84f9ca8066

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7f402d0eefa5bb9d9fa1616e0fd4945001cb885a4561290fcf13263dfd14994c
MD5 4be5f95cf623e08a52e8674cc5b04cc9
BLAKE2b-256 1acce98b4103d090816904d335fc7efe96bfa727c321c563d1e3bbf57f103dee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 83b7280cedab9fb1499ef9644a2d7e948b8e9bfdae350ca8496d69f10e43ef92
MD5 0531049e8831f6bddc92142e4ed997b2
BLAKE2b-256 28c215110f3b3a5c9533ea757cb932be957b921bf45c69e60bb1d06e76bfb501

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b870d9726dcbd3e2be1137645de7bf506d59da9e67a8e75cc1b925c497e57747
MD5 2f2df90eb0a963b8fb16d61452a2ae69
BLAKE2b-256 852f733982561dde058b325320aeb0d2456aba0ab921f0ebc319d50f836ab7fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5a49703dc8e1a05959fa3660607c89df5287af8ce9fb5b19d9e2f53dd26025e4
MD5 072077ff509e1ea30ecc9769007b54c1
BLAKE2b-256 c5170ea1c92dfd81d78ed2ea0e7e053d83544d73f3c34e65173f7feef14c697b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b2351ff33762fe062bcca3376459b939a2e9f8a88bd29272943014d028f79b05
MD5 103949201c7ca2d6007f9bb608bf7adf
BLAKE2b-256 cb1711e225946006f15c1467cb5e761967034e684a4e142208bcea7a31a2a27b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad3d7348faa39426f157d609cb07bbed1de9bdee6eff3692d4967648b1124c29
MD5 7c87edd6f100b59f709165d07f51f4f0
BLAKE2b-256 6122d16c510ed3559f632c759af88888b113ecaba7fe778bfc245c3d718745ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c3e88c7c714b16ea994f0982255fafa99ae240286f1062b36bc49ac540a7e3a8
MD5 e19bec0e92ea12fdd0cba847e2a17918
BLAKE2b-256 79c353058ee5fc0d93ac9cb3ffb1022fc1d4b650783440eb92b40fafe35e6f7f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 71de4469f3dc8ac6d12fa41cca4e44520665ab03e80758cad8648e4de4dafa11
MD5 3be03cad5afbae70992b1f3fc05f270d
BLAKE2b-256 7b6b229c3f4edfcafacaa091f700e56b40fabf11f118a3b0db85c65653cc545f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3b817dd41ab1b4287e1b544549d703a9cd1f26eb77241892d39ced81ee57e3f2
MD5 a03f6273356a63c92060219dde15f759
BLAKE2b-256 c9c54b18486ba282b5c79e0e44ffe7a545209f76102cc9c2907eb4216b6622d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b7ecb963332ba1ce57275254269ca7ef5266f2bdbe137abe9605182c7090a990
MD5 c1f7390a3065bb64793a7d78e0f47651
BLAKE2b-256 2f8ac61a94991321b9a540116bfdf2307339b2b4ca9d7c424b56480f01a1cd1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ce9f49f6d02b55d4230709af3cc4cc539cfb327afd47ed1ce4fb9a018c191e0
MD5 e6ce7b14ff209a216b97cf5b355f1bf6
BLAKE2b-256 d91b75dc45287dd205d5910254669844fb564409a7cf180e857dcb85bbb0acb1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.4.1.post1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ca3fb1ee5cf09cb7c257dd8db6c67ffa3122b5ded1bfa7216c066c55c0a0bf6e
MD5 9c5bb59392a2e567cefd7cb5aa8e3571
BLAKE2b-256 b7971dd14a5ddf77860bb4e6746355643f665d5f2eb57fe47693637e4183dea4

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