Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

無音の長さを一定値にできるパラメータを用意する #1698

Open
Hiroshiba opened this issue Jan 9, 2024 · 12 comments
Open

Comments

@Hiroshiba
Copy link
Member

内容

多くのテキスト音声合成ソフトウェアでは、句読点(ボイボだとpauseMora)の長さを指定することができます。
VOICEVOXでも指定はできますが、一つ一つの無音に対して長さを設定していく必要があります。
これを1回入力すれば自動的にその長さにしてくれる仕組みがあれば、読む速度を一定化できて結構便利かもしれません。

↓のプルリクエストと似ていますが、↓は全体のポーズの長さを調整するのに対し、こちらはソフトウェアUIのパネル(パラメータ調整欄)にパラメータ調整を追加しての調整を意図しています。(そうするとプリセットに追加できる)

Pros 良くなる点

キャラクターごとに無音の長さのデフォルト値を設定できる。

Cons 悪くなる点

仕様が結構ややこしい。

実現方法

無音の長さが置き換わるタイミングはAccentPhraseのfetchごとが良い気がしています。
テキストを変更した時、読みを変更して句点を追加した時の2パターンかなと。

「長さを変えない」方法の提供ですが、スライダーの一番左の値を「長さ無変更」とするか、あるいはスライダー以外にチェックボックスを用意して「無音の長さを変更する・しない」を切り替えられるようにするとかが考えられるからと。

その他

かなり需要が高い機能だとは思うので、もしご興味あればコメントお待ちしてます。
どこをどういう方針で実装すればいいかみたいなのもご案内できると思います!

@stIprurIJu
Copy link

自分の欲しい機能の様なので発言致します。

『開始無音、終了無音』ではなく、『、』は何秒、『。』は何秒、『…』は何秒みたいな設定が欲しいです。

@Hiroshiba
Copy link
Member Author

@stIprurIJu ありがとうございます!

今のVOICEVOXの仕様上かなり難しい(読みの間隙がどの文字由来かがわからない)のでかなり難しいのですが、実装にご興味あればご案内します!!!

@stIprurIJu
Copy link

実装する力は、自分には無いです(汗)

@X-20A
Copy link
Contributor

X-20A commented May 20, 2024

より詳細な調整ができるのは文字ごとに設定する場合の長所ですが
エディタ、エンジン共に更新が複雑になることが予想されます
・エディタ
preset追加であれば、話速、音高等がある欄に追加する形で実装できるが、
文字ごとの場合、ウィンドウメニューの'設定'に新たなページ(コンポーネント)の作成が必要になる
・エンジン
現在、音声の合成は
・API:audio_queryで文字とピッチ&長さが対応したデータを取得
・それを呼び出し元で直接編集してからエンジンに渡すか、或いはpresetと共にエンジンに渡してエンジン側で処理してもらう
という流れになっています
しかし、無音文字はaudio_queryの返り値のテキストでは全て「、」に置換されていてエディタ側では識別できません(Hiroshibaさんの指摘はこのことだと思う)
よって、エンジン側に調整してもらう必要があります
preset追加であれば、おそらく既存の処理に付け足す形で実現できます

ご自身での実装は無理とのことなので、文字ごとの調整が必要である状況について具体的な例の提供(例えばそれぞれの方式でエディタに打ち込んだ比較の動画とか?)をお願いできればと思うのですが...

@stIprurIJu
Copy link

どういう例を挙げれば良いのか解らなかったのですが、今VOICEVOXでやってみた作業はこんな感じです。
句読点などの間が必要な箇所を先頭に持ってきて、開始無音で調節しています。
『、』は0.40、『。』は0.75、それより長い間は1.00を一つ一つ入力して、やっと自然な朗読の様になりました。
https://github.com/VOICEVOX/voicevox/assets/164626763/f3fa0089-3a6e-410f-a9a1-7fbe2c187547

同じ状態で作りたい文章が500ページ以上(何十時間分)あり、この作業をVOICEVOXで始めて一つ一つ入力するのか、流石にそんな時間は掛けられないと他のソフトを探すべきか、迷っています。
有料ソフトも使ったのですが、それよりもVOICEVOXの方が自然な読み上げだったので、あと一歩で使えるソフトに成るのに残念だな~という所です。

今は使えなくなったのですが、前に使っていた『SofTalk(ゆっくりボイスの奴)』にはこういう設定画面があり、今回の様な悩みは無かったので、何とかならないかと思っています。
image

@Hiroshiba
Copy link
Member Author

Hiroshiba commented May 21, 2024

難しい理由 @X-20A さんのおっしゃる通りで、エンジン側のかなり大変なところまで実装する必要があるためです。
そもそも読みとテキスト(漢字や記号)の対応が取れておらず、どのポーズがどの文字由来のものなのか分からないですよね・・・。
おそらくエンジンの中で使ってるopenjtalkの中身を書き換える必要があり、まあなかなかに大変な感じです。
(めちゃくちゃやりたいんですけどね・・・・・・)

@stIprurIJu softalkに句読点・その他記号によって長さを変えられる仕組みがある(あった?)のは存じませんでした!!
少なくとも句読点で別々のポーズというのは需要が想像できます。
句点はテキスト欄の移動により代替できるので、一旦全てのポーズを一律に制御できれば、ちょっと痒いところに手は届かないけど現状から比べて使い勝手は劇的に良くなるかな、と・・・!

@X-20A
Copy link
Contributor

X-20A commented May 22, 2024

@stIprurIJu 提供ありがとうございます
以下は推測モリモリの話です
openjtalkは内部でMeCabでテキストを分解してから処理しているようです
OpenJTalk の解析資料
辞書データ: MeCab 用の辞書 > IPA 辞書
csv群
仮にあらゆるテキストがこれらのcsvのいずれかの語句として解釈されているなら、これらのワードを片っ端からリクエストすればtext='、'(つまり無音)に置換されるものを特定できる、かも?
特定さえできればopenjtalkを編集しなくてもVOICEVOXの任意の処理段階で例えば
「遠心力の乗った外側よりも、より敵の懐近くで斬撃をいなすべし!だがキャバリアーのケリ・キックが接近を阻止すべく再び襲いかかる。ニンジャスレイヤーはこの反応を想定済みだ!」
このようなテキストに対し、
{ 0: '、', 1: '!', 2: '・', 3: '。' }
のようなデータを作成し、処理後のデータと突き合せれば無音がどの文字に由来するか分かるかもしれません

但し、可能であったとしても私はAPIによる一律調整の実装を第一目標として取り組むことは断っておきます

@stIprurIJu
Copy link

お疲れ様です。
複雑な事は解りませんが、ご協力できる事があれば仰って下さい。

@Hiroshiba
Copy link
Member Author

Hiroshiba commented May 23, 2024

@X-20A こちらはできないと踏んでます。
なぜかというと、VOICEVOXエディタは日本語テキストと読みの対応を取れず、かつ日本語テキストは任意の読みと対応できてしまうためです。

例えのケースですが、「AA、BB」を「あ」とする辞書登録と、「CC」を「い」とする辞書登録があったとき、
「AA、BB、CC」は「あ、い」という読みになりますが、この際のpau「、」がどこから由来しているかわからないはずです。

openjtalkの中にはこれらの対応関係を取っている場所が当然あるはずで、その対応関係をエンジン側に露出させることができれば色々できるはず・・・と認識しています!

@stIprurIJu
Copy link

その後、進捗はどうでしょうか?

@terapotan
Copy link
Contributor

自分の欲しい機能の様なので発言致します。

『開始無音、終了無音』ではなく、『、』は何秒、『。』は何秒、『…』は何秒みたいな設定が欲しいです。

 一連の議論を読む限り、要するに「読みのpauが、テキストのどの文字と対応しているか分からないから上記機能実装が難しい」という風に理解しました。

 私も一応OpenJTalkの内部実装を見てみましたが……ろくなドキュメントが存在しない上、コードを読み解くのに音声処理に関する高度な知識が必要そうでした(C/C++自体は読めるし、VueやTypeScriptに比べればそっちの方が慣れてるんですがそれでもむずい)。OpenJTalkを書き換える道を行くなら、OpenJTalkの開発者巻き込んでやるか、それか莫大な時間をかけてやるか……という感じになると思います。ちょっと現実的じゃなさそうという考えです。

 読みのpauをテキストの文字に対応させる方法として、「テキストの文字の順序は、読みに変換されても保たれる」という性質を使うのはどうでしょうか。
 例えば

私は、四国めたんです。そうです。苗字は、四国地方の、四国、です。

という文章があったとき、読みに変換すると

わたしは、しこくめたんです、そうです、みょうじは、しこくちほうの、しこく、です

となります。読みに変換された影響で、pauが挿入される位置は変わっていますが、前後の文字との位置関係は変わっていません。読みでpauに変換される文字は決まっていますから、テキストからpauに変換され得る文字リストを抽出し、それを読みのpauと一対一対応させれば、読みのpauがどのテキストに対応しているか分かるのではないかという案です。

テキスト:、。。、、、
読み:、、、、、、

ただ、次のような場合は、テキストと読みの対応が取れません。他にもあるかも?

  1. AudioQuery作成に使用している辞書で「単語に読点、句点等読みでpauに変換され得る文字が含まれているが、読みにその文字が含まれていない」場合。逆も同様。
  2. 読点、句点等pauに変換され得る文字が連続している場合。
    1. 例:私は、四国めたんです。「やったー!」 。と「が連続している。読みでは、これらの文字は一つのpauに変換されてしまう。

 本質的にテキストの読みとの対応をしているわけではないので、どうしても漏れが生じます。そこで、後からユーザーが、読みでpauに指定されている文字種別を変更できるようにします。イメージとしては、下記画像赤丸の文字を書き換えるイメージです(あくまでもイメージなので、実際のUIでそこから書き換えられるようにする必要があるかどうかは別途要検討)。

image

 もっとも、そんなトリッキーな辞書登録をする人はあんまりいないんじゃないかなあ、と勝手に考えているので、ある程度正確性は担保されるのではないかと思っています。
 本案でも、設計やUI等考慮すべき項目は多くありますが、少なくともOpenJTalk実装を書き換えるよりはかなり現実的な案だと思います。

 ちなみに……句読点とか、文字別の無音間隔設定ってどれくらい需要あるものなんだろう……? というのは、今のVOICEVOXだと句読点含む文書をコピペすると勝手に句点で分割してくれるので、だったら終了無音の調整でいいじゃんと思ってしまい……

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Dec 15, 2024

@terapotan
ご提案ありがとうございます!!

確かに後処理的にテキストを解析してpauだった部分の文字を見つける手もありますね!
ただおっしゃる通り需要がそこまで無いかもしれず、結構特殊な処理なのでメンテコストもかかるかもですね。
うーん・・・やはり需要がほんとに若干足りない気がするので、実装は見送ったほうが良い・・・かも・・・?

ちなみにopenjtalkを改造するのはおっしゃる通りなかなかに大変だと思います!
(たぶんopenjtalkではなくpyopenjtalkを変える形実現でき、そこまで難しくはないはずだけどVOICEVOXからすると工数が多い感じ。)
ただ文字と音素の対応関係を取るのは他にも恩恵があり、例えば今は読みの部分がカタカナのみで書かれているので元のテキストとの対応が取りにくいのですが、そこに元のテキストも対応をつけて表示できるようになるとか!
そこも合わせると工数に見合うんじゃないかな~と思ったりもしました 🙏

コメントありがとうございました! 考えを進めるのは進捗なので、考えたことをまとめてくださるの助かります!!
もしまた何か思いついたらぜひコメントいただければ!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants
@Hiroshiba @terapotan @X-20A @stIprurIJu and others