Closed3

多言語に対応した音素化メタライブラリ「VoPho」を試す

kun432kun432

たまたま見つけた。

GitHubレポジトリ

https://github.com/ShoukanLabs/VoPho

VoPho

VoPhoは、多言語音素化を高速かつアクセスしやすく、多言語対応で正確に行うことを目的とした音素化メタライブラリです。

特徴

  • 高速: パフォーマンス最適化済み。
  • アクセス容易: 統合と使用が簡単。
  • 多言語対応: 幅広い言語をサポート。
  • 高精度: 正確な音素化を提供。

サポートされている言語

言語 サポート状況 精度の検証 備考
英語 はい はい 完全サポートかつ検証済み(集中的に開発中 - 現時点でespeakと同等)
ロシア語 はい はい 完全サポートかつ検証済み
フランス語 予定 N/A 将来的なサポートを計画中
ドイツ語 予定 N/A 将来的なサポートを計画中
スペイン語 予定 N/A 将来的なサポートを計画中
イタリア語 予定 N/A 将来的なサポートを計画中
北京語 はい はい 完全サポートかつ検証済み
日本語 はい はい 完全サポートかつ検証済み
韓国語 予定 N/A 将来的なサポートを計画中
タイ語 はい いいえ サポート済みだが精度は未検証
アラビア語 予定(難易度高) N/A 将来的なサポートを計画中
ペルシア語 予定(難易度高) N/A 将来的なサポートを計画中
ノルウェー語 予定 はい(公的機関) 将来的なサポートを計画中

ライセンス

このプロジェクトはMITライセンスで提供されています。詳細はLICENSEファイルをご覧ください。

要はg2pをいろいろな言語の違いを気にせずにまるっとやる的なものみたい。

kun432kun432

Colaboratoryで。

パッケージインストール

!pip install VoPho
!pip freeze | grep -i vopho
出力
VoPho==0.0.19

で、どうやらPyTorch-2.5じゃないと動かないみたいなので、ダウングレード(Colaboratoryは自分が確認した限り、CUDA-12.4向けPyTorch2.6.0が入っている)。ランタイムの再起動が必要になる。

!pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu124

で、色々ドキュメントが足りない・更新されていないので、アレだけども。サンプルコードを動かそうと思うと色々ハマる。

まずNTLKが必要。多分これは英語向け。

import nltk

nltk.download('averaged_perceptron_tagger_eng')
nltk.download('punkt_tab')

サンプルコードも少し違ってた。

from VoPho.engine import Phonemizer

input_text = "<phoneme>I suppose i can</phoneme>, dont take my word for it though. 音素のテストを行うことは、発音の理解を深めるために重要です。"

# 音素変換エンジン初期化
engine = Phonemizer()

# 入力テキストをエンジンに渡して音素変換。
# `output_tokens=True`で、各トークンの入力文字単位・変換後の音素記号・言語が辞書で返る
# ※ただしoutput_tokens=Trueにしないとエラーになるので実質必須だと思う・・・
output = engine.phonemize(input_text, output_tokens=True)

# outputはタプルで返る
# 0: 入力テキストを音素化した文字列
# 1: 各トークンの辞書のリスト
print(output[0])
print("----")
print(output[1])
出力
I suppose i can, dɔnt tAk mI wɜɹd fɔɹ ɪt ðˌO. onso no tesɯto o okonaɯ koto wa, hatsɯoɴ no ɽikai o fɯkamerɯ tame ni dʑɯɯjoɯ desɯ.
----
[
    Token(graphemes='I suppose i can, ', phonemes='I suppose i can, ', language='phoneme', whitespace=True, start_second=0, end_second=0),
    Token(graphemes='dont take my word for it though. ', phonemes='dɔnt tAk mI wɜɹd fɔɹ ɪt ðˌO. ', language='en', whitespace=True, start_second=0, end_second=0),
    Token(graphemes='音素のテストを行うことは、 発音の理解を深めるために重要です。', phonemes='onso no tesɯto o okonaɯ koto wa, hatsɯoɴ no ɽikai o fɯkamerɯ tame ni dʑɯɯjoɯ desɯ.', language='ja', whitespace=False, start_second=0, end_second=0)
]

各トークンの辞書は見やすいヘルパー関数が用意されている。

engine.pretty_print(output[1])
出力
[I suppose i can, ] - [I suppose i can, ] - [phoneme]
[dont take my word for it though. ] - [dɔnt tAk mI wɜɹd fɔɹ ɪt ðˌO. ] - [en]
[音素のテストを行うことは、 発音の理解を深めるために重要です。] - [onso no tesɯto o okonaɯ koto wa, hatsɯoɴ no ɽikai o fɯkamerɯ tame ni dʑɯɯjoɯ desɯ.] - [ja]

<phoneme>〜</phoneme>タグは、SSMLだと音素記号を指定するタグだけど、ここでは音素として指定するので変換されない、ということみたい。

言語は直接指定することもできる。

input_text = "音素のテストを行うことは、発音の理解を深めるために重要です。"

engine.phonemize_for_language(input_text, lang="ja")
出力
onso no tesɯto o okonaɯ koto wa, hatsɯoɴ no ɽikai o fɯkamerɯ tame ni dʑɯɯjoɯ desɯ.
input_text = "<ja>音素のテストを行うことは、発音の理解を深めるために重要です。</ja>"

output = engine.phonemize(input_text, output_tokens=True)
print(output[0])
出力
onso no tesɯto o okonaɯ koto wa, hatsɯoɴ no ɽikai o fɯkamerɯ tame ni dʑɯɯjoɯ desɯ.
このスクラップは3ヶ月前にクローズされました