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 では、「クァ」や「クヮ」などの比較的珍しい音素のサポートが追加されている
    • ほかにも「!」(感嘆符)を「記号/一般」として正しく推定するための改良など、概ね副作用なしに精度向上が見込めることから、有用性を鑑みほぼそのままマージした
  • 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.3.4.post10.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.3.4.post10-cp313-cp313-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.13Windows x86-64

pyopenjtalk_plus-0.3.4.post10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (30.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp313-cp313-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp313-cp313-macosx_10_13_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp312-cp312-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.12Windows x86-64

pyopenjtalk_plus-0.3.4.post10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (30.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp312-cp312-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp312-cp312-macosx_10_13_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp311-cp311-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.11Windows x86-64

pyopenjtalk_plus-0.3.4.post10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (30.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp311-cp311-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp311-cp311-macosx_10_9_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp310-cp310-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.10Windows x86-64

pyopenjtalk_plus-0.3.4.post10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (30.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp310-cp310-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp310-cp310-macosx_10_9_x86_64.whl (24.9 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp39-cp39-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.9Windows x86-64

pyopenjtalk_plus-0.3.4.post10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

pyopenjtalk_plus-0.3.4.post10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (30.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

pyopenjtalk_plus-0.3.4.post10-cp39-cp39-macosx_11_0_arm64.whl (24.8 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

pyopenjtalk_plus-0.3.4.post10-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.3.4.post10.tar.gz.

File metadata

  • Download URL: pyopenjtalk_plus-0.3.4.post10.tar.gz
  • Upload date:
  • Size: 24.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10.tar.gz
Algorithm Hash digest
SHA256 fd53f1b112c9cbafbfc7bbcd69f0ef4126e60ca943ac565181177764a74a9700
MD5 9868c4eb1ee5ca26ce98d4b9c6ef4fa3
BLAKE2b-256 2eb152dc95c1755aa67570b9d2dd90a6f66f54a060cb32335c737e1429f4a6a7

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d282820f6192f3543408f36f4b20617259da034f5ac5cb06e8844d3e3e9a5a1c
MD5 70b6e214a09c3c9ea48ea7f1a69f394b
BLAKE2b-256 ef573c6a91d7a0e186f5a1d835d9b833fabe03ebc4521fa48a303d9b0d8886ee

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a8b240f25575623b963fe67b1da015a496bf86e1ec93eb14db0d46d18933c062
MD5 b14734a36b050c48a4528e9e23018b15
BLAKE2b-256 3e7ddef45f8a3627767ea9f61fe5783be239ebf96a2aed101dea35debfee253f

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d267f8b104fbc2c09353d320af13d62b19080869385aabf88ed3a9b07b980cd7
MD5 ffc3fab47e5427b3d51e2a7d7b060308
BLAKE2b-256 8af3873df05353d48a823499ba6186aa05271d8b8f0ffdda44fbe98fc740cf11

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1425624b09d278b0ced2bfd3ebd9451795adda42f2f9d2e30b84560a6859bf53
MD5 2406bdc5e02b9cfdf3b52a22c005255f
BLAKE2b-256 85c31a32cd0fe515a9fabdbf3e44dc5521edfbcc8c3e66a7225b6730b85cabd6

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 78ec685a543541f2a4a38db48bddc55c8af426f602cd192689e7fbefbcfad733
MD5 84345ce641d8cce409ad4375763e02e4
BLAKE2b-256 a7f5108724d986e264918a4adc679046248bdde552ad74a438c259b8efbde2bd

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 eea234e018997ea308d7f8109228d92e281a019af14eb3b92d1d94e9370ccc82
MD5 3f0245b4fe10361d224c129be53f343a
BLAKE2b-256 87befe3dfac96499c48e849ef621a5f9f38d737d697e668d88f0604de77c0fe8

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 593b0e769406936929f31345d3a2aa49542048dd141a698d0f5cc1db6bd5080d
MD5 78b25658e329121d7f3732d61ac8d9d2
BLAKE2b-256 5a766a1faa014aaeb44e75a3e0f6558562d94553c9bcbf245e95ba2e641d1c39

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d83c67daa445ce25eaa1a6459cd1817b7088bbddb2163c5047c5160c7839efa5
MD5 9370506b11e083291649b6d729c823b5
BLAKE2b-256 4f82d82221147e898f5cf2fce04c5fb874f2b44879b840745659b9ee0cbc5ae2

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d29ef9f391e9aafe84f262bdc3b9316a3c7380e9b12ada7901ac241127c5c108
MD5 c5c6b8f0335c045e28db93cedd7620b7
BLAKE2b-256 9ca4a28be5164b1bdebdd669f39be0415e7c0357d281643106c71e31aa54b8bd

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6937a9b417e38b2802f00c7d1daf3c0107362a7eedb9f895de1257d041509a81
MD5 b14057e0b9c6f0af525764c6cd7be013
BLAKE2b-256 3d5ce5027cf0ed11940a728630ffc243f9b564a30598c15aa542e5d94d3fa4f0

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0de8311cae46bcab3e495e6136c994f49128fc18343fad6782dfbdd3fb77022e
MD5 ea7827d125ae9b559022019b0a1d0506
BLAKE2b-256 c2c28e02e2598905ade5412f8a4e15d09c27519f0fb52fbaf113105151dc6765

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c541f288d6ddd11ac55f314c16731e43b3f4e9b59f02fc7c8d6acf01a92a340
MD5 c3986888faa6193c3b5d28bebd0e9801
BLAKE2b-256 6f88f570d6cf208dc3596c863cc0f4b657ff1cef1be983df2dfda2ee06ca12d3

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2061191f3fcb83146372d506bc720ac8cc2c8fe0944c10b245019bb2262e31b7
MD5 7278cac19f4a951ded962823076b6b15
BLAKE2b-256 42a9b43b2c0a81e4e7f0f48d7584418b9f806a68e9bc5578b656e263d1e977a8

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8dde617c8dfa78fe7c6c2ff9a7a9afc78cf9b103f0ea9188bcf2b320756b3613
MD5 30d664e788f319789ca315f8f37337c6
BLAKE2b-256 bf89aead7ee095e03b855ed899687b5be1f84ec1fe1c221d71584569ff0a9b93

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 effccbe67203cdd0427eec87dd8c9ac1e223a509590db23788fe3fb90a72e1a2
MD5 5670ca91f187f6d71645de90314cb939
BLAKE2b-256 6c73a264accd50dc344e04b45c883e90af678545c9016166accad1dfdfdf1f99

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 259e02be4b5ee5a110caab46e820a4c70f932c7e6b67225a277f56b8a149ad7d
MD5 13a44c92dad62b03b0db4bbc9490e025
BLAKE2b-256 214e2c545ecc4726f4929394d6caecf4fc81c8168b0fd7b0726ea406359f342d

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4dce87eec54a78480e8c92188e6b18d2e2711ebd804f8b0fa76e6a59a51caad2
MD5 e4ae1bc5c43e63a6b5f8f17b9a39de6d
BLAKE2b-256 3c0915beae4f4a549eeb76621484083c3ccb2c6f5a7572b6070d9d98c6b95b6d

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fad4dce1769a278944dca5eb3156aa130423f0bfa1e2e4da0a3e36bfa3b78f64
MD5 13f752a28a2696a4663bc1c58561f0dd
BLAKE2b-256 408c221022634b8d2ec6ebb7d99fc61054f51409039eba29a4f6ba832903ee63

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 edca2b37323f5da4bd94442fdec12b32717b6a33a568710e082be52683bc6987
MD5 2ed6d1a2c74afd7543cc5960809058c9
BLAKE2b-256 d0994fd3cf851c06850f571a1b96876efcfe199637ba939fa99b238f0bd2f6ba

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9857a8e10032df2a4cd8cbfd47b9e716113f52d0d32053779f40ea37ef925398
MD5 b85b900e6ae03a96c6f17873fe6084dc
BLAKE2b-256 4af93a2f82319a43e4b0fd84de2c0b122d7dd9924d5925dd3e5d42ed5c1c9f84

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 bebc8fa63e9a4aef426b948dfd2a13ee9b3273a6ff0fb9f0e109f04e573e24db
MD5 d06e2c983ad20498bef5e2bbcbf67bc9
BLAKE2b-256 b8df5cbb6c542cbad977a9c6e7153759b677d8f89786552b309bc5b23b2425f0

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3141c13d8368e8a50ab85ac898870ffcfde14bea2f8adde6e0212e894e972500
MD5 68ed18ea4068b8f61df57c412529ae1c
BLAKE2b-256 fb3c7ad7732b3577b1120947258cba00793aa66e0ff883a89ccefdc219228948

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 44908859de05ca6b0b1fc895c9a84c24e303c3b0df86b203cbec6d1065e22cd0
MD5 101854da8bab7fa36c904b3205237886
BLAKE2b-256 e618e3fac7323740fd69066dbeb4f44ee0d5520fdd6b326343f20b42a169fd1f

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c07ff36cf1e933d29375ed32c8e124ab8539544d427147a484a5f869fb202493
MD5 11b55de48d7212329e9bc7dcb159fbfe
BLAKE2b-256 746e429c0af2bfea48da2e11a42c055fddc45209058836723b38768cc17dde60

See more details on using hashes here.

File details

Details for the file pyopenjtalk_plus-0.3.4.post10-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post10-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3514da46c84495abda60d37e96e90bd22135a7e9dda975698ede3115e162b919
MD5 6f543e2441403a9d44daff30334dd71c
BLAKE2b-256 04cedd32a1b0f616cef5737b83e7ea8d255e54b81fa848ce052749cb81d3d55b

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