-
Notifications
You must be signed in to change notification settings - Fork 298
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
テキスト書き出しで無視する単語(テキスト)を設定できるようにする #1355
Comments
この問題に取り掛かります。 |
@weweweok おお、ありがとうございます!! 不明な点があれば何でも聞いてください! |
方針としては、入力された文字列を、読む用と文字として表す用に分けます。 キャラクターが読む場合の文字列は 文字として表す用は 読み飛ばしのルールですが、まずは各audiocellにつき一回までとします。そうすれば、取り敢えず、[]と()の判定は比較的容易に済むと思います。 これまでの場合、入力した文字列は、バッファが許す条件に合っていれば、その入力文字列を、そのままvoicevox enginに渡していたと思われます。しかし、今回のこの方法では、入力テキストとvoicevoxから返された音声データが別になります。 入力テキスト -> 「出力テキスト(仮名)」 と分かれると思われます。 現在不明なこと: ・どこで文字列を操作すれば良いか(具体的には、入力される文字列がどのファイルのどのスコープで操作されるべきか) ※追記 |
方針いい感じに思いました!!
読みで無視する方は、テキストを読みに変換する直前で文字列を操作するとかどうでしょう? 文字として表す方(便宜上「字幕」とします)は、字幕を保存する直前で文字列操作とか・・・? ちなみに僕もどこにあるかはちゃんと把握してなくて、コードを毎回見直して追っかけています。 |
以下のプロトタイプにより、特定の条件で機能するようになりました。
意図しないバグが起きる条件
function resolve_brackets(text: string): boolean {
// []()がこの組で存在するかまったくないか
const front_square_brackets_cnt: number = (text.match(/[[]/g) || []).length;
const back_square_brackets_cnt: number = (text.match(/[\]]/g) || []).length;
const front_parenth: number = (text.match(/[(]/g) || []).length;
const back_parenth: number = (text.match(/[)]/g) || []).length;
if (
front_square_brackets_cnt <= 1 && //[の数
back_square_brackets_cnt <= 1 && //]の数
front_square_brackets_cnt === back_square_brackets_cnt && // "["と"]"が一致するとき
front_parenth <= 1 && //"("の数
back_parenth <= 1 && //")"の数
front_parenth === back_parenth //"("と")"が一致するとき
) {
return true;
} else {
return false;
}
}
function div_str(input: string): string | Array<string> | undefined {
// []に含まれる文字列
const replacestring: RegExpMatchArray | null = input.match(
/[[0-9a-zA-Zぁ-ん一-龠]{0,}]/g
);
// ()に含まれる文字列
const parentheses_in: RegExpMatchArray | null = input.match(
/\([0-9a-zA-Zぁ-ん一-龠]{0,}\)/g
);
if (resolve_brackets(input)) {
if (replacestring === null || parentheses_in === null) return input; // 字幕とエンジンの文字列を書き換える必要がないとき
let parenthese_str: string =
replacestring !== null ? replacestring[0].slice(1, -1) : "";
let square_brackets_str: string =
parentheses_in !== null ? parentheses_in[0].slice(1, -1) : "";
//[ が存在するイデックス
const output_as_text_index_start: number = input.indexOf(parenthese_str);
const output_as_text_index_end: number = //いらないかもしれない
output_as_text_index_start + square_brackets_str.length;
// (が存在するインデックス
const output_as_voicevox_engine_start_index: number =
input.indexOf(square_brackets_str);
const output_as_voicevox_engine_end_index: number =
output_as_text_index_start + parenthese_str.length;
//[]()の文字列を抽出("[から")"までの抽出だから間に文字があるとバグが発生する)
const replaceset = input.substring(
output_as_text_index_start - 1,
output_as_voicevox_engine_start_index + parenthese_str.length + 1
);
const for_subtitle: string = input.replace(replaceset, parenthese_str);
const for_read_engin: string = input.replace(
replaceset,
square_brackets_str
);
return [for_subtitle, for_read_engin];
} else {
console.error("次の記号は一回しか使用できません -> [ ] ( )");
}
}
console.log(div_str("[TDN](ただの)焼きそば ずんだ風味"));
console.log(div_str("[TDN](ただの)焼きそばずんだ風味"));
console.log(div_str("焼きそば ずんだ風味 [TDN](ただの)"));
console.log(div_str("焼きそば ずんだ風味[TDN](ただの)")); //意図しない挙動
console.log(div_str("焼きそば [TDN]ずんだ風味(ただの)"));
//div_str("[ooooohoooooo");動かない
div_str("[ooooohoooooo]");
div_str("ooooohoooooo()");
div_str("ooooohoooooo())"); // |
プロトタイプありがとうございます!! 参考になります。 JavaScriptはreplaceメソッドを使って正規表現にマッチするものを置き換える操作ができたりします。これを使えばうまくいくかもです。 @weweweok さんのコードをヒントにChatGPT君に聞いてみました。参考になれば!(動くか確かめてませんが・・・!) |
ありがとうございます。
test
|
おー!! 良いですね!! |
windows環境でテストしたところ しかし、下のリンクのコードにおいて Lines 1993 to 1997 in 9990a19
(textを別変数で置くとエラーが出るため)まず下記のコードを
下のリンクのようにエディタのテキストも消えてしまいます。 下記のtextのみ別変数でテキストを代入することができればよさそうですが、まだよく分かっていません。
|
なるほどです!! エンジンに投げるテキストとVOICEVOXのAudioCellを置き換えるテキストを分けると良いと思います! const resolvedText = resolveText(text); // 変更箇所
const accentPhrases: AccentPhrase[] = await dispatch(
"FETCH_ACCENT_PHRASES",
{
text: resolvedText, // 変更箇所
engineId,
styleId,
}
);
commit("COMMAND_CHANGE_AUDIO_TEXT", {
audioKey,
text,
update: "AccentPhrases",
accentPhrases,
}); |
にて実装されました! |
内容
[]
で囲われたものを読み飛ばす機能が提案されています。逆に、テキスト書き出し時に無視する気泡もあると色々便利そうです。
例えば
()
を字幕無視するとすれば、「[DB](ドラゴンボール)
」と書けば読みはドラゴンボール、字幕はDBにできます。Pros 良くなる点
読みと字幕を分けられる
Cons 悪くなる点
記法は何が正解かわからない
実現方法
テキスト書き出しする時にそのテキストを無視するようにすれば実現できそうです。
問題は基本何にするかで、類似ソフトなどで似たような記法がある場合はそれを参考にしたいです。
その他
まず記法を何にするかの議論が必要そう。
調査結果だけでもコメントしていただけると助かります。
The text was updated successfully, but these errors were encountered: