diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b20c1d9b60..602d058227 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ on: env: VOICEVOX_ENGINE_REPO_URL: "https://github.com/Hiroshiba/voicevox_engine" - VOICEVOX_ENGINE_VERSION: 0.7.5 + VOICEVOX_ENGINE_VERSION: 0.8.0 # FIXME: implement build with production resources in Hiroshiba/voicevox # Temporarily, skip uploading to GitHub Release (use Artifact instead) diff --git a/openapi.json b/openapi.json index e5fd2cf5a4..8547e10c25 100644 --- a/openapi.json +++ b/openapi.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"VOICEVOX ENGINE","description":"VOICEVOXの音声合成エンジンです。","version":"0.7.0"},"paths":{"/audio_query":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリを作成する","description":"クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_audio_query_post","parameters":[{"required":true,"schema":{"title":"Text","type":"string"},"name":"text","in":"query"},{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accent_phrases":{"post":{"tags":["クエリ編集"],"summary":"テキストからアクセント句を得る","description":"テキストからアクセント句を得ます。\nis_kanaが`true`のとき、テキストは次のようなAquesTalkライクな記法に従う読み仮名として処理されます。デフォルトは`false`です。\n* 全てのカナはカタカナで記述される\n* アクセント句は`/`または`、`で区切る。`、`で区切った場合に限り無音区間が挿入される。\n* カナの手前に`_`を入れるとそのカナは無声化される\n* アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。","operationId":"accent_phrases_accent_phrases_post","parameters":[{"required":true,"schema":{"title":"Text","type":"string"},"name":"text","in":"query"},{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"},{"required":false,"schema":{"title":"Is Kana","type":"boolean","default":false},"name":"is_kana","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Accent Phrases Accent Phrases Post","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}}},"400":{"description":"読み仮名のパースに失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_data":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高・音素長を得る","operationId":"mora_data_mora_data_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"title":"Accent Phrases","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mora Data Mora Data Post","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_length":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音素長を得る","operationId":"mora_length_mora_length_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"title":"Accent Phrases","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mora Length Mora Length Post","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_pitch":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高を得る","operationId":"mora_pitch_mora_pitch_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"title":"Accent Phrases","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mora Pitch Mora Pitch Post","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する","operationId":"synthesis_synthesis_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/multi_synthesis":{"post":{"tags":["音声合成"],"summary":"複数まとめて音声合成する","operationId":"multi_synthesis_multi_synthesis_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"title":"Queries","type":"array","items":{"$ref":"#/components/schemas/AudioQuery"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connect_waves":{"post":{"tags":["その他"],"summary":"base64エンコードされた複数のwavデータを一つに結合する","description":"base64エンコードされたwavデータを一纏めにし、wavファイルで返します。","operationId":"connect_waves_connect_waves_post","requestBody":{"content":{"application/json":{"schema":{"title":"Waves","type":"array","items":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/version":{"get":{"tags":["その他"],"summary":"Version","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/speakers":{"get":{"tags":["その他"],"summary":"Speakers","operationId":"speakers_speakers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Speakers Speakers Get","type":"array","items":{"$ref":"#/components/schemas/Speaker"}}}}}}}}},"components":{"schemas":{"AccentPhrase":{"title":"AccentPhrase","required":["moras","accent"],"type":"object","properties":{"moras":{"title":"モーラのリスト","type":"array","items":{"$ref":"#/components/schemas/Mora"}},"accent":{"title":"アクセント箇所","type":"integer"},"pause_mora":{"title":"後ろに無音を付けるかどうか","allOf":[{"$ref":"#/components/schemas/Mora"}]}},"description":"アクセント句ごとの情報"},"AudioQuery":{"title":"AudioQuery","required":["accent_phrases","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength","outputSamplingRate","outputStereo"],"type":"object","properties":{"accent_phrases":{"title":"アクセント句のリスト","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}},"speedScale":{"title":"全体の話速","type":"number"},"pitchScale":{"title":"全体の音高","type":"number"},"intonationScale":{"title":"全体の抑揚","type":"number"},"volumeScale":{"title":"全体の音量","type":"number"},"prePhonemeLength":{"title":"音声の前の無音時間","type":"number"},"postPhonemeLength":{"title":"音声の後の無音時間","type":"number"},"outputSamplingRate":{"title":"音声データの出力サンプリングレート","type":"integer"},"outputStereo":{"title":"音声データをステレオ出力するか否か","type":"boolean"},"kana":{"title":"[読み取り専用]AquesTalkライクな読み仮名。音声合成クエリとしては無視される","type":"string"}},"description":"音声合成用のクエリ"},"HTTPValidationError":{"title":"HTTPValidationError","type":"object","properties":{"detail":{"title":"Detail","type":"array","items":{"$ref":"#/components/schemas/ValidationError"}}}},"Mora":{"title":"Mora","required":["text","vowel","vowel_length","pitch"],"type":"object","properties":{"text":{"title":"文字","type":"string"},"consonant":{"title":"子音の音素","type":"string"},"consonant_length":{"title":"子音の音長","type":"number"},"vowel":{"title":"母音の音素","type":"string"},"vowel_length":{"title":"母音の音長","type":"number"},"pitch":{"title":"音高","type":"number"}},"description":"モーラ(子音+母音)ごとの情報"},"ParseKanaBadRequest":{"title":"ParseKanaBadRequest","required":["text","error_name","error_args"],"type":"object","properties":{"text":{"title":"エラーメッセージ","type":"string"},"error_name":{"title":"エラー名","type":"string","description":"|name|description|\n|---|---|\n| UNKNOWN_TEXT | 判別できない読み仮名があります: {text} |\n| ACCENT_TOP | 句頭にアクセントは置けません: {text} |\n| ACCENT_TWICE | 1つのアクセント句に二つ以上のアクセントは置けません: {text} |\n| ACCENT_NOTFOUND | アクセントを指定していないアクセント句があります: {text} |\n| EMPTY_PHRASE | {position}番目のアクセント句が空白です |\n| INFINITE_LOOP | 処理時に無限ループになってしまいました...バグ報告をお願いします。 |"},"error_args":{"title":"エラーを起こした箇所","type":"object","additionalProperties":{"type":"string"}}}},"Speaker":{"title":"Speaker","required":["name","speaker_uuid","styles"],"type":"object","properties":{"name":{"title":"名前","type":"string"},"speaker_uuid":{"title":"スピーカーのUUID","type":"string"},"styles":{"title":"スピーカースタイルの一覧","type":"array","items":{"$ref":"#/components/schemas/SpeakerStyle"}},"version":{"title":"Version","type":"string","default":"スピーカーのバージョン"}},"description":"スピーカー情報"},"SpeakerStyle":{"title":"SpeakerStyle","required":["name","id"],"type":"object","properties":{"name":{"title":"スタイル名","type":"string"},"id":{"title":"スタイルID","type":"integer"}},"description":"スピーカーのスタイル情報"},"ValidationError":{"title":"ValidationError","required":["loc","msg","type"],"type":"object","properties":{"loc":{"title":"Location","type":"array","items":{"type":"string"}},"msg":{"title":"Message","type":"string"},"type":{"title":"Error Type","type":"string"}}}}}} \ No newline at end of file +{"openapi":"3.0.2","info":{"title":"VOICEVOX ENGINE","description":"VOICEVOXの音声合成エンジンです。","version":"0.8.0"},"paths":{"/audio_query":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリを作成する","description":"クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_audio_query_post","parameters":[{"required":true,"schema":{"title":"Text","type":"string"},"name":"text","in":"query"},{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audio_query_from_preset":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリをプリセットを用いて作成する","description":"クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_from_preset_audio_query_from_preset_post","parameters":[{"required":true,"schema":{"title":"Text","type":"string"},"name":"text","in":"query"},{"required":true,"schema":{"title":"Preset Id","type":"integer"},"name":"preset_id","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accent_phrases":{"post":{"tags":["クエリ編集"],"summary":"テキストからアクセント句を得る","description":"テキストからアクセント句を得ます。\nis_kanaが`true`のとき、テキストは次のようなAquesTalkライクな記法に従う読み仮名として処理されます。デフォルトは`false`です。\n* 全てのカナはカタカナで記述される\n* アクセント句は`/`または`、`で区切る。`、`で区切った場合に限り無音区間が挿入される。\n* カナの手前に`_`を入れるとそのカナは無声化される\n* アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。","operationId":"accent_phrases_accent_phrases_post","parameters":[{"required":true,"schema":{"title":"Text","type":"string"},"name":"text","in":"query"},{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"},{"required":false,"schema":{"title":"Is Kana","type":"boolean","default":false},"name":"is_kana","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Accent Phrases Accent Phrases Post","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}}},"400":{"description":"読み仮名のパースに失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_data":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高・音素長を得る","operationId":"mora_data_mora_data_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"title":"Accent Phrases","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mora Data Mora Data Post","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_length":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音素長を得る","operationId":"mora_length_mora_length_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"title":"Accent Phrases","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mora Length Mora Length Post","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_pitch":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高を得る","operationId":"mora_pitch_mora_pitch_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"title":"Accent Phrases","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mora Pitch Mora Pitch Post","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する","operationId":"synthesis_synthesis_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/multi_synthesis":{"post":{"tags":["音声合成"],"summary":"複数まとめて音声合成する","operationId":"multi_synthesis_multi_synthesis_post","parameters":[{"required":true,"schema":{"title":"Speaker","type":"integer"},"name":"speaker","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"title":"Queries","type":"array","items":{"$ref":"#/components/schemas/AudioQuery"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis_morphing":{"post":{"tags":["音声合成"],"summary":"2人の話者でモーフィングした音声を合成する","description":"指定された2人の話者で音声を合成、指定した割合でモーフィングした音声を得ます。\nモーフィングの割合は`morph_rate`で指定でき、0.0でベースの話者、1.0でターゲットの話者に近づきます。","operationId":"synthesis_morphing_synthesis_morphing_post","parameters":[{"required":true,"schema":{"title":"Base Speaker","type":"integer"},"name":"base_speaker","in":"query"},{"required":true,"schema":{"title":"Target Speaker","type":"integer"},"name":"target_speaker","in":"query"},{"required":true,"schema":{"title":"Morph Rate","type":"number"},"name":"morph_rate","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connect_waves":{"post":{"tags":["その他"],"summary":"base64エンコードされた複数のwavデータを一つに結合する","description":"base64エンコードされたwavデータを一纏めにし、wavファイルで返します。","operationId":"connect_waves_connect_waves_post","requestBody":{"content":{"application/json":{"schema":{"title":"Waves","type":"array","items":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/presets":{"get":{"tags":["その他"],"summary":"Get Presets","description":"エンジンが保持しているプリセットの設定を返します\n\nReturns\n-------\npresets: List[Preset]\n プリセットのリスト","operationId":"get_presets_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Presets Presets Get","type":"array","items":{"$ref":"#/components/schemas/Preset"}}}}}}}},"/version":{"get":{"tags":["その他"],"summary":"Version","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/speakers":{"get":{"tags":["その他"],"summary":"Speakers","operationId":"speakers_speakers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Speakers Speakers Get","type":"array","items":{"$ref":"#/components/schemas/Speaker"}}}}}}}},"/speaker_info":{"get":{"tags":["その他"],"summary":"Speaker Info","description":"指定されたspeaker_uuidに関する情報をjson形式で返します。\n画像や音声はbase64エンコードされたものが返されます。\nicon、voice_samplesのdictのキーは拡張子無しのファイル名です。\n\nReturns\n-------\nret_data: SpeakerInfo","operationId":"speaker_info_speaker_info_get","parameters":[{"required":true,"schema":{"title":"Speaker Uuid","type":"string"},"name":"speaker_uuid","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccentPhrase":{"title":"AccentPhrase","required":["moras","accent"],"type":"object","properties":{"moras":{"title":"モーラのリスト","type":"array","items":{"$ref":"#/components/schemas/Mora"}},"accent":{"title":"アクセント箇所","type":"integer"},"pause_mora":{"title":"後ろに無音を付けるかどうか","allOf":[{"$ref":"#/components/schemas/Mora"}]}},"description":"アクセント句ごとの情報"},"AudioQuery":{"title":"AudioQuery","required":["accent_phrases","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength","outputSamplingRate","outputStereo"],"type":"object","properties":{"accent_phrases":{"title":"アクセント句のリスト","type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"}},"speedScale":{"title":"全体の話速","type":"number"},"pitchScale":{"title":"全体の音高","type":"number"},"intonationScale":{"title":"全体の抑揚","type":"number"},"volumeScale":{"title":"全体の音量","type":"number"},"prePhonemeLength":{"title":"音声の前の無音時間","type":"number"},"postPhonemeLength":{"title":"音声の後の無音時間","type":"number"},"outputSamplingRate":{"title":"音声データの出力サンプリングレート","type":"integer"},"outputStereo":{"title":"音声データをステレオ出力するか否か","type":"boolean"},"kana":{"title":"[読み取り専用]AquesTalkライクな読み仮名。音声合成クエリとしては無視される","type":"string"}},"description":"音声合成用のクエリ"},"HTTPValidationError":{"title":"HTTPValidationError","type":"object","properties":{"detail":{"title":"Detail","type":"array","items":{"$ref":"#/components/schemas/ValidationError"}}}},"Mora":{"title":"Mora","required":["text","vowel","vowel_length","pitch"],"type":"object","properties":{"text":{"title":"文字","type":"string"},"consonant":{"title":"子音の音素","type":"string"},"consonant_length":{"title":"子音の音長","type":"number"},"vowel":{"title":"母音の音素","type":"string"},"vowel_length":{"title":"母音の音長","type":"number"},"pitch":{"title":"音高","type":"number"}},"description":"モーラ(子音+母音)ごとの情報"},"ParseKanaBadRequest":{"title":"ParseKanaBadRequest","required":["text","error_name","error_args"],"type":"object","properties":{"text":{"title":"エラーメッセージ","type":"string"},"error_name":{"title":"エラー名","type":"string","description":"|name|description|\n|---|---|\n| UNKNOWN_TEXT | 判別できない読み仮名があります: {text} |\n| ACCENT_TOP | 句頭にアクセントは置けません: {text} |\n| ACCENT_TWICE | 1つのアクセント句に二つ以上のアクセントは置けません: {text} |\n| ACCENT_NOTFOUND | アクセントを指定していないアクセント句があります: {text} |\n| EMPTY_PHRASE | {position}番目のアクセント句が空白です |\n| INFINITE_LOOP | 処理時に無限ループになってしまいました...バグ報告をお願いします。 |"},"error_args":{"title":"エラーを起こした箇所","type":"object","additionalProperties":{"type":"string"}}}},"Preset":{"title":"Preset","required":["id","name","speaker_uuid","style_id","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength"],"type":"object","properties":{"id":{"title":"プリセットID","type":"integer"},"name":{"title":"プリセット名","type":"string"},"speaker_uuid":{"title":"スピーカーのUUID","type":"string"},"style_id":{"title":"スタイルID","type":"integer"},"speedScale":{"title":"全体の話速","type":"number"},"pitchScale":{"title":"全体の音高","type":"number"},"intonationScale":{"title":"全体の抑揚","type":"number"},"volumeScale":{"title":"全体の音量","type":"number"},"prePhonemeLength":{"title":"音声の前の無音時間","type":"number"},"postPhonemeLength":{"title":"音声の後の無音時間","type":"number"}},"description":"プリセット情報"},"Speaker":{"title":"Speaker","required":["name","speaker_uuid","styles"],"type":"object","properties":{"name":{"title":"名前","type":"string"},"speaker_uuid":{"title":"スピーカーのUUID","type":"string"},"styles":{"title":"スピーカースタイルの一覧","type":"array","items":{"$ref":"#/components/schemas/SpeakerStyle"}},"version":{"title":"Version","type":"string","default":"スピーカーのバージョン"}},"description":"スピーカー情報"},"SpeakerInfo":{"title":"SpeakerInfo","required":["policy","portrait","icons","voice_samples"],"type":"object","properties":{"policy":{"title":"policy.md","type":"string"},"portrait":{"title":"portrait.pngをbase64エンコードしたもの","type":"string"},"icons":{"title":"icons/*.pngをbase64エンコードしたもの","type":"object","additionalProperties":{"type":"string"}},"voice_samples":{"title":"voice_samples/*.wavをbase64エンコードしたもの","type":"object","additionalProperties":{"type":"string"}}},"description":"話者の追加情報"},"SpeakerStyle":{"title":"SpeakerStyle","required":["name","id"],"type":"object","properties":{"name":{"title":"スタイル名","type":"string"},"id":{"title":"スタイルID","type":"integer"}},"description":"スピーカーのスタイル情報"},"ValidationError":{"title":"ValidationError","required":["loc","msg","type"],"type":"object","properties":{"loc":{"title":"Location","type":"array","items":{"type":"string"}},"msg":{"title":"Message","type":"string"},"type":{"title":"Error Type","type":"string"}}}}}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ce283d4102..73c9696deb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "voicevox", - "version": "0.7.5", + "version": "0.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 59f60159f5..f0fceddad0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "voicevox", - "version": "0.7.5", + "version": "0.8.0", "author": "Hiroshiba Kazuyuki", "private": true, "engines": { diff --git a/public/characters/dummy1/voice_samples/dummy1_0_001.wav b/public/characters/dummy1/voice_samples/dummy1_0_001.wav index ac83689ca8..10c8b4e739 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_0_001.wav and b/public/characters/dummy1/voice_samples/dummy1_0_001.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_0_002.wav b/public/characters/dummy1/voice_samples/dummy1_0_002.wav index 85069f834e..5366ba11f5 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_0_002.wav and b/public/characters/dummy1/voice_samples/dummy1_0_002.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_0_003.wav b/public/characters/dummy1/voice_samples/dummy1_0_003.wav index d052174cd2..94d658e6e0 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_0_003.wav and b/public/characters/dummy1/voice_samples/dummy1_0_003.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_2_001.wav b/public/characters/dummy1/voice_samples/dummy1_2_001.wav index 2051995d4a..08ec5c455e 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_2_001.wav and b/public/characters/dummy1/voice_samples/dummy1_2_001.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_2_002.wav b/public/characters/dummy1/voice_samples/dummy1_2_002.wav index 3b9b8a842d..2bf4786356 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_2_002.wav and b/public/characters/dummy1/voice_samples/dummy1_2_002.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_2_003.wav b/public/characters/dummy1/voice_samples/dummy1_2_003.wav index cc30278ba7..3e80e941cc 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_2_003.wav and b/public/characters/dummy1/voice_samples/dummy1_2_003.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_4_001.wav b/public/characters/dummy1/voice_samples/dummy1_4_001.wav index 06a048df4b..02b6ee4978 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_4_001.wav and b/public/characters/dummy1/voice_samples/dummy1_4_001.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_4_002.wav b/public/characters/dummy1/voice_samples/dummy1_4_002.wav index 4430e6bcc7..b6283936d6 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_4_002.wav and b/public/characters/dummy1/voice_samples/dummy1_4_002.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_4_003.wav b/public/characters/dummy1/voice_samples/dummy1_4_003.wav index 83bb44af0f..1f6f846501 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_4_003.wav and b/public/characters/dummy1/voice_samples/dummy1_4_003.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_6_001.wav b/public/characters/dummy1/voice_samples/dummy1_6_001.wav index 2385a1b188..2a88c96de3 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_6_001.wav and b/public/characters/dummy1/voice_samples/dummy1_6_001.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_6_002.wav b/public/characters/dummy1/voice_samples/dummy1_6_002.wav index ff8c6c6b3d..107eb3dfb1 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_6_002.wav and b/public/characters/dummy1/voice_samples/dummy1_6_002.wav differ diff --git a/public/characters/dummy1/voice_samples/dummy1_6_003.wav b/public/characters/dummy1/voice_samples/dummy1_6_003.wav index a671ac7403..104c03aeeb 100644 Binary files a/public/characters/dummy1/voice_samples/dummy1_6_003.wav and b/public/characters/dummy1/voice_samples/dummy1_6_003.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_1_001.wav b/public/characters/dummy2/voice_samples/dummy2_1_001.wav index 9b5bfa40f6..4abbd5d90e 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_1_001.wav and b/public/characters/dummy2/voice_samples/dummy2_1_001.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_1_002.wav b/public/characters/dummy2/voice_samples/dummy2_1_002.wav index 8736022ccc..9303f11c42 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_1_002.wav and b/public/characters/dummy2/voice_samples/dummy2_1_002.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_1_003.wav b/public/characters/dummy2/voice_samples/dummy2_1_003.wav index 3730464dae..52da8e90cc 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_1_003.wav and b/public/characters/dummy2/voice_samples/dummy2_1_003.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_3_001.wav b/public/characters/dummy2/voice_samples/dummy2_3_001.wav index 507acbaa6f..b399c12c84 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_3_001.wav and b/public/characters/dummy2/voice_samples/dummy2_3_001.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_3_002.wav b/public/characters/dummy2/voice_samples/dummy2_3_002.wav index e14d80bcbc..d061f9f49c 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_3_002.wav and b/public/characters/dummy2/voice_samples/dummy2_3_002.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_3_003.wav b/public/characters/dummy2/voice_samples/dummy2_3_003.wav index 8d42657c68..79bef49dd3 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_3_003.wav and b/public/characters/dummy2/voice_samples/dummy2_3_003.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_5_001.wav b/public/characters/dummy2/voice_samples/dummy2_5_001.wav index c616d692a6..4df51f0db3 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_5_001.wav and b/public/characters/dummy2/voice_samples/dummy2_5_001.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_5_002.wav b/public/characters/dummy2/voice_samples/dummy2_5_002.wav index 4086db4809..4a55fced63 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_5_002.wav and b/public/characters/dummy2/voice_samples/dummy2_5_002.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_5_003.wav b/public/characters/dummy2/voice_samples/dummy2_5_003.wav index d3823d9fd2..09aa9a35c2 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_5_003.wav and b/public/characters/dummy2/voice_samples/dummy2_5_003.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_7_001.wav b/public/characters/dummy2/voice_samples/dummy2_7_001.wav index 88194d7e26..e5b6658c01 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_7_001.wav and b/public/characters/dummy2/voice_samples/dummy2_7_001.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_7_002.wav b/public/characters/dummy2/voice_samples/dummy2_7_002.wav index 61d5a7eae8..0a1a808853 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_7_002.wav and b/public/characters/dummy2/voice_samples/dummy2_7_002.wav differ diff --git a/public/characters/dummy2/voice_samples/dummy2_7_003.wav b/public/characters/dummy2/voice_samples/dummy2_7_003.wav index 71fcdbeaa2..43c0b6e552 100644 Binary files a/public/characters/dummy2/voice_samples/dummy2_7_003.wav and b/public/characters/dummy2/voice_samples/dummy2_7_003.wav differ diff --git a/public/howtouse.md b/public/howtouse.md index c841061ad0..93598ce798 100644 --- a/public/howtouse.md +++ b/public/howtouse.md @@ -79,7 +79,7 @@ ## イントネーションの変更 -アクセントを変更してもうまく行かなかったときや、抑揚をより拘りたいときに、文字ごとのイントネーションを直接変更することができます。 +アクセントを変更してもうまく行かなかったときや、抑揚をより拘りたいときに、文字ごとの音の高さ(イントネーション)を直接変更することができます。 「イントネーション」をクリックして現れる縦線のバーを上下させることで抑揚を表現できます。 @@ -103,6 +103,23 @@ +## スタイルの変更 + +キャラクターによっては複数のスタイル(喋り方)を変えることができます。キャラクターの変更と同様に、テキスト欄左のアイコンから選択できます。 + + + +キャラクターを選択したときに適用されるスタイルは、設定の「デフォルトスタイル」で変更できます。 + +## 音の長さの変更 + +文字ごとに、音の長さを変えることが可能です。語尾を少し伸ばしたい、無音の長さを調整したいときなどに便利です。 + +「長さ」をクリックして現れる縦線のバーを上げるとその音を長く、下げると短くできます。 +右のバーが母音、左のバーが子音に対応しています。 + + + ## 音声ファイル・テキストファイルの書き出し 書き出しボタンを押すと、全テキスト欄の音声が WAV ファイルとして書き出されます。 @@ -144,12 +161,18 @@ - プロジェクトの保存 - Ctrl + E - 音声を書き出し +- Ctrl + Z + - 元に戻す +- Ctrl + Y + - やり直す - Esc - テキスト欄からカーソルを外す - 1 - アクセント欄を表示 - 2 - イントネーション欄を表示 +- 3 + - 長さ欄を表示 - スライダーの上でマウスホイール - スライダーの値を変更します(スライダー →) diff --git a/public/ossCommunityInfos.md b/public/ossCommunityInfos.md index ae7e1f8c08..1fbf35cfb0 100644 --- a/public/ossCommunityInfos.md +++ b/public/ossCommunityInfos.md @@ -1,11 +1,24 @@ ### オープンソース -VOICEVOXは OSS (オープンソース・ソフトウェア)です。 -誰でも機能追加や改善に参加できます。 -一緒にVOICEVOXを作ってみませんか? +本ソフトウェアはオープンソース版の VOICEVOX をもとに構築されており、誰でも機能追加や改善に参加できます。 -#### [VOICEVOX ソフトウェア](https://github.com/Hiroshiba/voicevox) +一緒に VOICEVOX を作ってみませんか? + +#### [VOICEVOX エディター](https://github.com/Hiroshiba/voicevox) + +GUI を表示するためのモジュールで、アプリケーションの形で提供しています。 +TypeScript や Electron や Vue で構成されています。 #### [VOICEVOX エンジン](https://github.com/Hiroshiba/voicevox_engine) +テキスト音声合成 API を公開するためのモジュールで、Web サーバーの形で提供しています。 +Python や FastAPI や OpenJTalk で構成されています。 + #### [VOICEVOX コア](https://github.com/Hiroshiba/voicevox_core) + +音声合成に必要な計算を実行するためのモジュールで、動的ライブラリの形で提供しています。 +C++ や libtorch で構成されています。 + +--- + +VOICEVOX の全体構成は [こちら](https://github.com/Hiroshiba/voicevox/blob/main/docs/%E5%85%A8%E4%BD%93%E6%A7%8B%E6%88%90.md) に詳細があります。 diff --git a/public/res/image20.png b/public/res/image20.png index f388299a2f..117ee32c5b 100644 Binary files a/public/res/image20.png and b/public/res/image20.png differ diff --git a/public/res/image21.png b/public/res/image21.png new file mode 100644 index 0000000000..e028a2b8e8 Binary files /dev/null and b/public/res/image21.png differ diff --git a/public/res/image22.png b/public/res/image22.png new file mode 100644 index 0000000000..6cf408eeae Binary files /dev/null and b/public/res/image22.png differ diff --git a/public/updateInfos.json b/public/updateInfos.json index ebb76247ba..47cac89f1c 100644 --- a/public/updateInfos.json +++ b/public/updateInfos.json @@ -1,4 +1,39 @@ [ + { + "version": "0.8.0", + "descriptions": [ + "ショートカットキーの変更機能を追加", + "デフォルトスタイルの選択機能を追加", + "音素の長さ変更機能を追加", + "無声化の切り替え機能を追加", + "パラメータの継承機能を追加", + "元に戻す/やり直す機能を追加", + "音声合成エンジンの機能追加", + "UXの向上", + "開発環境の向上", + "バグ修正" + ], + "contributors": [ + "aoirint", + "arigayas", + "buckw6eat", + "eggplants", + "Hiroshiba", + "HyodaKazuaki", + "madosuki", + "mes51", + "MT224244", + "noronoro56", + "oov", + "Patchethium", + "PickledChair", + "Segu-g", + "takana-v", + "yamachu", + "y-chan", + "Yosshi999" + ] + }, { "version": "0.7.5", "descriptions": ["Linux版がビルドできない問題の修正"], diff --git a/src/background.ts b/src/background.ts index b56ec8afd7..0c22cf7343 100644 --- a/src/background.ts +++ b/src/background.ts @@ -156,7 +156,7 @@ const store = new Store<{ }, { action: "テキスト欄にフォーカスを戻す", - combination: "Backspace", + combination: "Enter", }, { action: "元に戻す", diff --git a/src/components/AudioDetail.vue b/src/components/AudioDetail.vue index 4861212c1e..274ff8c392 100644 --- a/src/components/AudioDetail.vue +++ b/src/components/AudioDetail.vue @@ -10,7 +10,7 @@ v-model="selectedDetail" > - + @@ -32,14 +32,6 @@ icon="stop" @click="stop" > - diff --git a/src/components/DefaultStyleSelectDialog.vue b/src/components/DefaultStyleSelectDialog.vue index 6d4be7756b..5943db4864 100644 --- a/src/components/DefaultStyleSelectDialog.vue +++ b/src/components/DefaultStyleSelectDialog.vue @@ -11,8 +11,10 @@
- デフォルトのスタイルを選択してください「{{ + characterInfos[pageIndex].metas.speakerName + }}」のデフォルトのスタイル(喋り方)を選んでください 設定 / デフォルトスタイル
-
- {{ pageIndex + 1 }} / {{ characterInfos.length }} -
- +
+ {{ pageIndex + 1 }} / {{ characterInfos.length }} +
+ props.modelValue, - (newValue, oldValue) => { + async (newValue, oldValue) => { if (!oldValue && newValue) { - store - .dispatch("IS_UNSET_DEFAULT_STYLE_IDS") - .then((isUnsetDefaultStyleIds) => { - isFirstTime.value = isUnsetDefaultStyleIds; - }); + const isUnsetDefaultStyleIds = await store.dispatch( + "IS_UNSET_DEFAULT_STYLE_IDS" + ); + isFirstTime.value = isUnsetDefaultStyleIds; selectedStyleIndexes.value = props.characterInfos.map((info) => { // FIXME: キャラクターごとにデフォルスタイル選択済みか保存できるようになるべき diff --git a/src/components/HelpDialog.vue b/src/components/HelpDialog.vue index 7f30a6c599..3c724940fe 100644 --- a/src/components/HelpDialog.vue +++ b/src/components/HelpDialog.vue @@ -53,6 +53,7 @@ round flat icon="close" + color="secondary" @click="modelValueComputed = false" /> @@ -111,17 +112,17 @@ export default defineComponent({ component: HowToUse, }, { - name: "OSSライセンス情報", + name: "開発コミュニティ", + component: OssCommunityInfo, + }, + { + name: "ライセンス情報", component: OssLicense, }, { name: "アップデート情報", component: UpdateInfo, }, - { - name: "OSSコミュニティ", - component: OssCommunityInfo, - }, ]; const selectedPage = ref(pagedata[0].name); diff --git a/src/components/HotkeySettingDialog.vue b/src/components/HotkeySettingDialog.vue index fc3aa7ca87..0599ad6804 100644 --- a/src/components/HotkeySettingDialog.vue +++ b/src/components/HotkeySettingDialog.vue @@ -11,7 +11,7 @@ 設定 / ショートカットキー設定 / キー割り当て 高度な設定
-
音声をステレオ化して再生・保存する
+
音声をステレオ化
- + + diff --git a/src/openapi/.openapi-generator/FILES b/src/openapi/.openapi-generator/FILES index 5ebbc8c9f8..ebbbb6a693 100644 --- a/src/openapi/.openapi-generator/FILES +++ b/src/openapi/.openapi-generator/FILES @@ -6,7 +6,9 @@ models/AudioQuery.ts models/HTTPValidationError.ts models/Mora.ts models/ParseKanaBadRequest.ts +models/Preset.ts models/Speaker.ts +models/SpeakerInfo.ts models/SpeakerStyle.ts models/ValidationError.ts models/index.ts diff --git a/src/openapi/apis/DefaultApi.ts b/src/openapi/apis/DefaultApi.ts index d60fc486c6..41f1b45947 100644 --- a/src/openapi/apis/DefaultApi.ts +++ b/src/openapi/apis/DefaultApi.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -27,9 +27,15 @@ import { ParseKanaBadRequest, ParseKanaBadRequestFromJSON, ParseKanaBadRequestToJSON, + Preset, + PresetFromJSON, + PresetToJSON, Speaker, SpeakerFromJSON, SpeakerToJSON, + SpeakerInfo, + SpeakerInfoFromJSON, + SpeakerInfoToJSON, } from '../models'; export interface AccentPhrasesAccentPhrasesPostRequest { @@ -43,6 +49,11 @@ export interface AudioQueryAudioQueryPostRequest { speaker: number; } +export interface AudioQueryFromPresetAudioQueryFromPresetPostRequest { + text: string; + presetId: number; +} + export interface ConnectWavesConnectWavesPostRequest { requestBody: Array; } @@ -67,6 +78,17 @@ export interface MultiSynthesisMultiSynthesisPostRequest { audioQuery: Array; } +export interface SpeakerInfoSpeakerInfoGetRequest { + speakerUuid: string; +} + +export interface SynthesisMorphingSynthesisMorphingPostRequest { + baseSpeaker: number; + targetSpeaker: number; + morphRate: number; + audioQuery: AudioQuery; +} + export interface SynthesisSynthesisPostRequest { speaker: number; audioQuery: AudioQuery; @@ -114,6 +136,23 @@ export interface DefaultApiInterface { */ audioQueryAudioQueryPost(requestParameters: AudioQueryAudioQueryPostRequest): Promise; + /** + * クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 + * @summary 音声合成用のクエリをプリセットを用いて作成する + * @param {string} text + * @param {number} presetId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof DefaultApiInterface + */ + audioQueryFromPresetAudioQueryFromPresetPostRaw(requestParameters: AudioQueryFromPresetAudioQueryFromPresetPostRequest): Promise>; + + /** + * クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 + * 音声合成用のクエリをプリセットを用いて作成する + */ + audioQueryFromPresetAudioQueryFromPresetPost(requestParameters: AudioQueryFromPresetAudioQueryFromPresetPostRequest): Promise; + /** * base64エンコードされたwavデータを一纏めにし、wavファイルで返します。 * @summary base64エンコードされた複数のwavデータを一つに結合する @@ -130,6 +169,21 @@ export interface DefaultApiInterface { */ connectWavesConnectWavesPost(requestParameters: ConnectWavesConnectWavesPostRequest): Promise; + /** + * エンジンが保持しているプリセットの設定を返します Returns ------- presets: List[Preset] プリセットのリスト + * @summary Get Presets + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof DefaultApiInterface + */ + getPresetsPresetsGetRaw(): Promise>>; + + /** + * エンジンが保持しているプリセットの設定を返します Returns ------- presets: List[Preset] プリセットのリスト + * Get Presets + */ + getPresetsPresetsGet(): Promise>; + /** * * @summary アクセント句から音高・音素長を得る @@ -194,6 +248,22 @@ export interface DefaultApiInterface { */ multiSynthesisMultiSynthesisPost(requestParameters: MultiSynthesisMultiSynthesisPostRequest): Promise; + /** + * 指定されたspeaker_uuidに関する情報をjson形式で返します。 画像や音声はbase64エンコードされたものが返されます。 icon、voice_samplesのdictのキーは拡張子無しのファイル名です。 Returns ------- ret_data: SpeakerInfo + * @summary Speaker Info + * @param {string} speakerUuid + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof DefaultApiInterface + */ + speakerInfoSpeakerInfoGetRaw(requestParameters: SpeakerInfoSpeakerInfoGetRequest): Promise>; + + /** + * 指定されたspeaker_uuidに関する情報をjson形式で返します。 画像や音声はbase64エンコードされたものが返されます。 icon、voice_samplesのdictのキーは拡張子無しのファイル名です。 Returns ------- ret_data: SpeakerInfo + * Speaker Info + */ + speakerInfoSpeakerInfoGet(requestParameters: SpeakerInfoSpeakerInfoGetRequest): Promise; + /** * * @summary Speakers @@ -208,6 +278,25 @@ export interface DefaultApiInterface { */ speakersSpeakersGet(): Promise>; + /** + * 指定された2人の話者で音声を合成、指定した割合でモーフィングした音声を得ます。 モーフィングの割合は`morph_rate`で指定でき、0.0でベースの話者、1.0でターゲットの話者に近づきます。 + * @summary 2人の話者でモーフィングした音声を合成する + * @param {number} baseSpeaker + * @param {number} targetSpeaker + * @param {number} morphRate + * @param {AudioQuery} audioQuery + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof DefaultApiInterface + */ + synthesisMorphingSynthesisMorphingPostRaw(requestParameters: SynthesisMorphingSynthesisMorphingPostRequest): Promise>; + + /** + * 指定された2人の話者で音声を合成、指定した割合でモーフィングした音声を得ます。 モーフィングの割合は`morph_rate`で指定でき、0.0でベースの話者、1.0でターゲットの話者に近づきます。 + * 2人の話者でモーフィングした音声を合成する + */ + synthesisMorphingSynthesisMorphingPost(requestParameters: SynthesisMorphingSynthesisMorphingPostRequest): Promise; + /** * * @summary 音声合成する @@ -337,6 +426,50 @@ export class DefaultApi extends runtime.BaseAPI implements DefaultApiInterface { return await response.value(); } + /** + * クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 + * 音声合成用のクエリをプリセットを用いて作成する + */ + async audioQueryFromPresetAudioQueryFromPresetPostRaw(requestParameters: AudioQueryFromPresetAudioQueryFromPresetPostRequest): Promise> { + if (requestParameters.text === null || requestParameters.text === undefined) { + throw new runtime.RequiredError('text','Required parameter requestParameters.text was null or undefined when calling audioQueryFromPresetAudioQueryFromPresetPost.'); + } + + if (requestParameters.presetId === null || requestParameters.presetId === undefined) { + throw new runtime.RequiredError('presetId','Required parameter requestParameters.presetId was null or undefined when calling audioQueryFromPresetAudioQueryFromPresetPost.'); + } + + const queryParameters: any = {}; + + if (requestParameters.text !== undefined) { + queryParameters['text'] = requestParameters.text; + } + + if (requestParameters.presetId !== undefined) { + queryParameters['preset_id'] = requestParameters.presetId; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/audio_query_from_preset`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + }); + + return new runtime.JSONApiResponse(response, (jsonValue) => AudioQueryFromJSON(jsonValue)); + } + + /** + * クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 + * 音声合成用のクエリをプリセットを用いて作成する + */ + async audioQueryFromPresetAudioQueryFromPresetPost(requestParameters: AudioQueryFromPresetAudioQueryFromPresetPostRequest): Promise { + const response = await this.audioQueryFromPresetAudioQueryFromPresetPostRaw(requestParameters); + return await response.value(); + } + /** * base64エンコードされたwavデータを一纏めにし、wavファイルで返します。 * base64エンコードされた複数のwavデータを一つに結合する @@ -372,6 +505,34 @@ export class DefaultApi extends runtime.BaseAPI implements DefaultApiInterface { return await response.value(); } + /** + * エンジンが保持しているプリセットの設定を返します Returns ------- presets: List[Preset] プリセットのリスト + * Get Presets + */ + async getPresetsPresetsGetRaw(): Promise>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/presets`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }); + + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(PresetFromJSON)); + } + + /** + * エンジンが保持しているプリセットの設定を返します Returns ------- presets: List[Preset] プリセットのリスト + * Get Presets + */ + async getPresetsPresetsGet(): Promise> { + const response = await this.getPresetsPresetsGetRaw(); + return await response.value(); + } + /** * アクセント句から音高・音素長を得る */ @@ -536,6 +697,42 @@ export class DefaultApi extends runtime.BaseAPI implements DefaultApiInterface { return await response.value(); } + /** + * 指定されたspeaker_uuidに関する情報をjson形式で返します。 画像や音声はbase64エンコードされたものが返されます。 icon、voice_samplesのdictのキーは拡張子無しのファイル名です。 Returns ------- ret_data: SpeakerInfo + * Speaker Info + */ + async speakerInfoSpeakerInfoGetRaw(requestParameters: SpeakerInfoSpeakerInfoGetRequest): Promise> { + if (requestParameters.speakerUuid === null || requestParameters.speakerUuid === undefined) { + throw new runtime.RequiredError('speakerUuid','Required parameter requestParameters.speakerUuid was null or undefined when calling speakerInfoSpeakerInfoGet.'); + } + + const queryParameters: any = {}; + + if (requestParameters.speakerUuid !== undefined) { + queryParameters['speaker_uuid'] = requestParameters.speakerUuid; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/speaker_info`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }); + + return new runtime.JSONApiResponse(response, (jsonValue) => SpeakerInfoFromJSON(jsonValue)); + } + + /** + * 指定されたspeaker_uuidに関する情報をjson形式で返します。 画像や音声はbase64エンコードされたものが返されます。 icon、voice_samplesのdictのキーは拡張子無しのファイル名です。 Returns ------- ret_data: SpeakerInfo + * Speaker Info + */ + async speakerInfoSpeakerInfoGet(requestParameters: SpeakerInfoSpeakerInfoGetRequest): Promise { + const response = await this.speakerInfoSpeakerInfoGetRaw(requestParameters); + return await response.value(); + } + /** * Speakers */ @@ -562,6 +759,65 @@ export class DefaultApi extends runtime.BaseAPI implements DefaultApiInterface { return await response.value(); } + /** + * 指定された2人の話者で音声を合成、指定した割合でモーフィングした音声を得ます。 モーフィングの割合は`morph_rate`で指定でき、0.0でベースの話者、1.0でターゲットの話者に近づきます。 + * 2人の話者でモーフィングした音声を合成する + */ + async synthesisMorphingSynthesisMorphingPostRaw(requestParameters: SynthesisMorphingSynthesisMorphingPostRequest): Promise> { + if (requestParameters.baseSpeaker === null || requestParameters.baseSpeaker === undefined) { + throw new runtime.RequiredError('baseSpeaker','Required parameter requestParameters.baseSpeaker was null or undefined when calling synthesisMorphingSynthesisMorphingPost.'); + } + + if (requestParameters.targetSpeaker === null || requestParameters.targetSpeaker === undefined) { + throw new runtime.RequiredError('targetSpeaker','Required parameter requestParameters.targetSpeaker was null or undefined when calling synthesisMorphingSynthesisMorphingPost.'); + } + + if (requestParameters.morphRate === null || requestParameters.morphRate === undefined) { + throw new runtime.RequiredError('morphRate','Required parameter requestParameters.morphRate was null or undefined when calling synthesisMorphingSynthesisMorphingPost.'); + } + + if (requestParameters.audioQuery === null || requestParameters.audioQuery === undefined) { + throw new runtime.RequiredError('audioQuery','Required parameter requestParameters.audioQuery was null or undefined when calling synthesisMorphingSynthesisMorphingPost.'); + } + + const queryParameters: any = {}; + + if (requestParameters.baseSpeaker !== undefined) { + queryParameters['base_speaker'] = requestParameters.baseSpeaker; + } + + if (requestParameters.targetSpeaker !== undefined) { + queryParameters['target_speaker'] = requestParameters.targetSpeaker; + } + + if (requestParameters.morphRate !== undefined) { + queryParameters['morph_rate'] = requestParameters.morphRate; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/synthesis_morphing`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: AudioQueryToJSON(requestParameters.audioQuery), + }); + + return new runtime.BlobApiResponse(response); + } + + /** + * 指定された2人の話者で音声を合成、指定した割合でモーフィングした音声を得ます。 モーフィングの割合は`morph_rate`で指定でき、0.0でベースの話者、1.0でターゲットの話者に近づきます。 + * 2人の話者でモーフィングした音声を合成する + */ + async synthesisMorphingSynthesisMorphingPost(requestParameters: SynthesisMorphingSynthesisMorphingPostRequest): Promise { + const response = await this.synthesisMorphingSynthesisMorphingPostRaw(requestParameters); + return await response.value(); + } + /** * 音声合成する */ diff --git a/src/openapi/models/AccentPhrase.ts b/src/openapi/models/AccentPhrase.ts index e73fcbb8f8..751f3f7f43 100644 --- a/src/openapi/models/AccentPhrase.ts +++ b/src/openapi/models/AccentPhrase.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/src/openapi/models/AudioQuery.ts b/src/openapi/models/AudioQuery.ts index 542c389731..a52fd31b89 100644 --- a/src/openapi/models/AudioQuery.ts +++ b/src/openapi/models/AudioQuery.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/src/openapi/models/HTTPValidationError.ts b/src/openapi/models/HTTPValidationError.ts index f6f9aa5e97..9174c1d04e 100644 --- a/src/openapi/models/HTTPValidationError.ts +++ b/src/openapi/models/HTTPValidationError.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/src/openapi/models/Mora.ts b/src/openapi/models/Mora.ts index e911e72399..a80f894766 100644 --- a/src/openapi/models/Mora.ts +++ b/src/openapi/models/Mora.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/src/openapi/models/ParseKanaBadRequest.ts b/src/openapi/models/ParseKanaBadRequest.ts index 12c5dce063..dc1f7fe716 100644 --- a/src/openapi/models/ParseKanaBadRequest.ts +++ b/src/openapi/models/ParseKanaBadRequest.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/src/openapi/models/Preset.ts b/src/openapi/models/Preset.ts new file mode 100644 index 0000000000..9a73c89315 --- /dev/null +++ b/src/openapi/models/Preset.ts @@ -0,0 +1,129 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * VOICEVOX ENGINE + * VOICEVOXの音声合成エンジンです。 + * + * The version of the OpenAPI document: 0.8.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; +/** + * プリセット情報 + * @export + * @interface Preset + */ +export interface Preset { + /** + * + * @type {number} + * @memberof Preset + */ + id: number; + /** + * + * @type {string} + * @memberof Preset + */ + name: string; + /** + * + * @type {string} + * @memberof Preset + */ + speakerUuid: string; + /** + * + * @type {number} + * @memberof Preset + */ + styleId: number; + /** + * + * @type {number} + * @memberof Preset + */ + speedScale: number; + /** + * + * @type {number} + * @memberof Preset + */ + pitchScale: number; + /** + * + * @type {number} + * @memberof Preset + */ + intonationScale: number; + /** + * + * @type {number} + * @memberof Preset + */ + volumeScale: number; + /** + * + * @type {number} + * @memberof Preset + */ + prePhonemeLength: number; + /** + * + * @type {number} + * @memberof Preset + */ + postPhonemeLength: number; +} + +export function PresetFromJSON(json: any): Preset { + return PresetFromJSONTyped(json, false); +} + +export function PresetFromJSONTyped(json: any, ignoreDiscriminator: boolean): Preset { + if ((json === undefined) || (json === null)) { + return json; + } + return { + + 'id': json['id'], + 'name': json['name'], + 'speakerUuid': json['speaker_uuid'], + 'styleId': json['style_id'], + 'speedScale': json['speedScale'], + 'pitchScale': json['pitchScale'], + 'intonationScale': json['intonationScale'], + 'volumeScale': json['volumeScale'], + 'prePhonemeLength': json['prePhonemeLength'], + 'postPhonemeLength': json['postPhonemeLength'], + }; +} + +export function PresetToJSON(value?: Preset | null): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + + 'id': value.id, + 'name': value.name, + 'speaker_uuid': value.speakerUuid, + 'style_id': value.styleId, + 'speedScale': value.speedScale, + 'pitchScale': value.pitchScale, + 'intonationScale': value.intonationScale, + 'volumeScale': value.volumeScale, + 'prePhonemeLength': value.prePhonemeLength, + 'postPhonemeLength': value.postPhonemeLength, + }; +} + + diff --git a/src/openapi/models/Speaker.ts b/src/openapi/models/Speaker.ts index a256f77952..1b73cda5ec 100644 --- a/src/openapi/models/Speaker.ts +++ b/src/openapi/models/Speaker.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/src/openapi/models/SpeakerInfo.ts b/src/openapi/models/SpeakerInfo.ts new file mode 100644 index 0000000000..b5dc04ccc2 --- /dev/null +++ b/src/openapi/models/SpeakerInfo.ts @@ -0,0 +1,81 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * VOICEVOX ENGINE + * VOICEVOXの音声合成エンジンです。 + * + * The version of the OpenAPI document: 0.8.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; +/** + * 話者の追加情報 + * @export + * @interface SpeakerInfo + */ +export interface SpeakerInfo { + /** + * + * @type {string} + * @memberof SpeakerInfo + */ + policy: string; + /** + * + * @type {string} + * @memberof SpeakerInfo + */ + portrait: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof SpeakerInfo + */ + icons: { [key: string]: string; }; + /** + * + * @type {{ [key: string]: string; }} + * @memberof SpeakerInfo + */ + voiceSamples: { [key: string]: string; }; +} + +export function SpeakerInfoFromJSON(json: any): SpeakerInfo { + return SpeakerInfoFromJSONTyped(json, false); +} + +export function SpeakerInfoFromJSONTyped(json: any, ignoreDiscriminator: boolean): SpeakerInfo { + if ((json === undefined) || (json === null)) { + return json; + } + return { + + 'policy': json['policy'], + 'portrait': json['portrait'], + 'icons': json['icons'], + 'voiceSamples': json['voice_samples'], + }; +} + +export function SpeakerInfoToJSON(value?: SpeakerInfo | null): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + + 'policy': value.policy, + 'portrait': value.portrait, + 'icons': value.icons, + 'voice_samples': value.voiceSamples, + }; +} + + diff --git a/src/openapi/models/SpeakerStyle.ts b/src/openapi/models/SpeakerStyle.ts index fe34a10d4d..b305e2451a 100644 --- a/src/openapi/models/SpeakerStyle.ts +++ b/src/openapi/models/SpeakerStyle.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/src/openapi/models/ValidationError.ts b/src/openapi/models/ValidationError.ts index df297b2f82..7e6ebfd74f 100644 --- a/src/openapi/models/ValidationError.ts +++ b/src/openapi/models/ValidationError.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/src/openapi/models/index.ts b/src/openapi/models/index.ts index 52af599ee2..d268c731c2 100644 --- a/src/openapi/models/index.ts +++ b/src/openapi/models/index.ts @@ -3,6 +3,8 @@ export * from "./AudioQuery"; export * from "./HTTPValidationError"; export * from "./Mora"; export * from "./ParseKanaBadRequest"; +export * from "./Preset"; export * from "./Speaker"; +export * from "./SpeakerInfo"; export * from "./SpeakerStyle"; export * from "./ValidationError"; diff --git a/src/openapi/runtime.ts b/src/openapi/runtime.ts index 52990c993e..dd50da0f67 100644 --- a/src/openapi/runtime.ts +++ b/src/openapi/runtime.ts @@ -4,7 +4,7 @@ * VOICEVOX ENGINE * VOICEVOXの音声合成エンジンです。 * - * The version of the OpenAPI document: 0.7.0 + * The version of the OpenAPI document: 0.8.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).