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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

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

File metadata

  • Download URL: pyopenjtalk_plus-0.3.4.post11.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.3.4.post11.tar.gz
Algorithm Hash digest
SHA256 bdf46596076a2744bc493bafd22ead695efbb9190e4037ae3bf388b86bf8e803
MD5 1f6f0a78cdf2a2d7892185d4a844137d
BLAKE2b-256 fb4debe23b61e32f697495553ef46cfa3e25e664d57557fdee319a14f0005446

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 940f96bcac68291ccd9db1785cb45d46eadadb48fdcaed506c04ff589624abbf
MD5 e7b1557d73a7200b95cafd96e4ed3d3c
BLAKE2b-256 2b10e1c4ec9c9872785bf811c4f2368123ab89478365849374c6c3a903974358

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dece5d3c3385150dc309361b9773e1b74117d9b8076e24afc2c05e559ff5a158
MD5 3f5eac6ec10db5178d26d488b3c4f6e0
BLAKE2b-256 bb8983ddb593a9501dbaab4d8b06fe57eec0f6fedad70f1130f12e32a590af75

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 48e4b073427d2e7e53b11b857a2108a11383f9286a30986b912942e8b7fc935a
MD5 665fc78a426e083b5500b03bd147a935
BLAKE2b-256 8a25b48ff15cbba041995ae5ae1a8833bc3ec99a916338670f727b5aeefd0662

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dbaddea930c6f8f7dc2cea28cb8c362e1516ac01c9f3950252e7809b5df073fa
MD5 7379a610510f0117a13bc54cbc7d4ff9
BLAKE2b-256 902648e917cd577faf3861c6b0424c74a80136489b8a03a2e088c060f29f077a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 dd98638f5cfe25baf3670efb1c8473b14a29f0634f45fdf748c5defdcb5e97f3
MD5 5b7a63028e020c47c05f22d77ec8d8a5
BLAKE2b-256 f8e329b53c92440d860d3c70b2dad0d4972170c00493006ce537dfa7beae1b49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 be9cb9d7de9624fd03778a0c5c5f785ccb22eef1f6f663340b8b85aa22556730
MD5 66e09c7c7b234bbc9093bd6a10816a66
BLAKE2b-256 7947a5cddc11476a53a55ee25a9977d0c8e0888d4ebe507e8bece18f0337d6bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e92dbf4c9d2f3473244995b83410babe92728deca7bcd609ddf1d110555c4107
MD5 3bc3012d0f62b9be4e8b87396c8e483b
BLAKE2b-256 770179f537b1c85243e603a6f22e010544d238fc7746850ace8df4d4964ea9f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c7bdf71b2da71562f501b361b2812479c953c1d40471f7309778c0effa38d7d2
MD5 4a9c5ec21d072499841013301beb5695
BLAKE2b-256 975ea119a16f0887faaa662ce39f641dbeab376411743d07974363d6a73cc04f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d44237a735180b1fc930380b7d92b4eb539b82c54553689c61f65ff4d6d62341
MD5 7ed9d17499223bb90e3be97838bd7cf3
BLAKE2b-256 b02014a0af30551fbe9411bc3f61add27a3514e1315f09da565285817ec5e4a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a97fb4f2dd71eec143d7f85c41a208280e24a6b839818e44f52cc8a3c055ab37
MD5 5862f23f32c473f284b6819e1e029349
BLAKE2b-256 849856c0883b933e7d3dc687189b7905982c91ebf78e1b387b02c3fb61d06f03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c312ca0baa0f32836a21b4fad61f37386fc145d68d0472ef09bb69bc95e07b1e
MD5 631987234123a4ca10d288761b6ab65b
BLAKE2b-256 5c66a62eee085f43e94d46269e86d8ab3a6c1b6c42d1a8bbd2de0998c65ac949

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b754c1ab562e0ef2185ccae7faa7b50f20be7d89f448057d48670041e69bc601
MD5 b0366321477bb1b922abac88a860baea
BLAKE2b-256 574e0f0a6e6a24b48b98fe9b9329d50d2809c9e287bb0fdb24bc76983aa3692b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c14feef2c92cbc7c4da72afab4fef0a02fcba588561165b943c066a2aec46c25
MD5 72a759d41131b48a4d8e153f057814ce
BLAKE2b-256 86739448b1b2ffedea99aa2593012d4867f35f9f2f59b8ba7a698933cc879816

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e96806e843e7f0363c1c02ea7658141e2d1c64eb0b1e2cc4a9bbb3e8bfb2068c
MD5 15f40a6dcaa3a4c10a6ebd2226e94a20
BLAKE2b-256 0c5d85568f095825c5764a39526bc7bb75c88ea3f77ee702e6935f6decf7fd8c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 73dba2d3c92fe89a382aaf1bb87d87bd3ee1dcd95fd54e5eeb23610ac32edafe
MD5 96192d7a5970a2aedb3bb0a146078d13
BLAKE2b-256 280ae88c704cc0152e5b415cb34439009cf3da24ac592c8b053f1d76b4453616

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d5a21a56267ea58c8d6621885e68b4d050fc3c3952dd4e3fbc5791d62a27afbe
MD5 d4eed3683847b77b604eb1f26bd28302
BLAKE2b-256 7efab8bc146c84062b189170f6912cc1371bf72af0ac905969194bdc597b7d79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4ce4ed44877142e87ec7843f63ede2cee6fc2d0a28fed8eea12bc33e4b673d6d
MD5 f8b507e85d7ebdb61a530edf76ca5ae0
BLAKE2b-256 63ce9cdc49cb69213c74d00d21529309c490bee4884955e640a3683629120599

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9b6be552bd1c34fdd239ac37d2600bb68698f75d3442a8f9f003bb50c35b91a9
MD5 1293983c134b7c702bae28327bebf900
BLAKE2b-256 3430070579efe8de9529a95704f61b7b80d71eeca7eaeb9c7991e75ea760e071

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a7ff496182c0899fda7a7f4cc8464eb1602ca5c6461f80f43ebc3d85b9f85133
MD5 d107c1263ea8aa4273f9045dce3fbe4d
BLAKE2b-256 270981676883ceeb53b1fae4756fd96367225de528ede066e4da1b4f7803361b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7a65871a43860d6f448ce4cdb3c3c87afe6788e5e3fd5e55dcfed2b4a659b697
MD5 82dc6a9a4b5c52195a2470603864c4be
BLAKE2b-256 9e435a9d1a29e073b3c55bbac37294a989e4d64fa13fda1a2f9135b2ba11f118

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 be4e4c515090fec51ff129649b52bc9d8708cc9d502aa56cad31f04a9ae5f876
MD5 c8bf2ae3c9476a17c0f371e684fdb932
BLAKE2b-256 21b1f5eac322f6c0437522414a338c110c5b49b35329dd1dea1d609be5248e8d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 718c351d7743b3bdde7fc0891de1e75c0c873f52fdfad7cd09219c53f1b22a85
MD5 04e2f914781d08fa3fb927365bf948d0
BLAKE2b-256 0c6d52e6139dc47803b904e20e4a1353448792f8860b7805ee62e1ed8f30fcd7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d33fa94c19aaf870599c332c1624af22c52e922e55a814107e2544e4ee1c0bd1
MD5 9b2abe4e788adc04210c84cf2165213c
BLAKE2b-256 038fbbc5244e2a127b5af96c0d1c9e8bc70a4888fa6211b29ee717a647331627

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4c4d3f7e3076a2e41311815736cd3f5e3081099d3a3f111a42922f71382a94cc
MD5 ff4d9f21e306d3beba59f70f7e627fc9
BLAKE2b-256 102f50b1cf50101aac2b23564413e8ca89c318c28f95598ab40401fb24360bfb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyopenjtalk_plus-0.3.4.post11-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4b21ca111cba3a8aeb359c53dbe01904cced134ba5656076f828553c99cc089f
MD5 dcd9afe02a084f70647ad33b4425d519
BLAKE2b-256 285bfafc83b8195919dc09115a61b2dc1514053bc1e33113c076736905a73ebb

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