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

audio_query_from_presetにて、synthesisした際、設定と異なる音声データが出力される。 #1321

Closed
2 tasks
Mega-Gorilla opened this issue May 21, 2023 · 4 comments
Labels

Comments

@Mega-Gorilla
Copy link

不具合の内容

不具合概要

audio_queryにて作成したクエリと、audio_query_from_presetで作成したクエリで作成される音声が異なる。

具体的な再現手法

  1. Get_presetにて、「audio_query_from_preset」必要な値を取得
    "supported_features": {
      "permitted_synthesis_morphing": "ALL"
    },
    "name": "ナースロボ_タイプT",
    "speaker_uuid": "882a636f-3bac-431a-966d-c5e6bba9f949",
    "styles": [
      {
        "name": "ノーマル",
        "id": 47
      },
      {
        "name": "楽々",
        "id": 48
      },
      {
        "name": "恐怖",
        "id": 49
      },
      {
        "name": "内緒話",
        "id": 50
      }
    ],
    "version": "0.14.2"
  },
  1. add_presetにて、プリセットを作成
preset_payload = {
    "id": 0,
    "name": "ナースロボ-ノーマル",
    "speaker_uuid": "882a636f-3bac-431a-966d-c5e6bba9f949", 
    "style_id": 47, 
    "speedScale": 1.0, 
    "pitchScale": 0.0,
    "intonationScale": 1.0,
    "volumeScale": 1.0,
    "prePhonemeLength": 0.0, 
    "postPhonemeLength": 0.0
    }
  1. Get_presetsにて、プリセットが作成されていることを確認する
[{'id': 0,
  'intonationScale': 1.0,
  'name': 'ナースロボ-ノーマル',
  'pitchScale': 0.0,
  'postPhonemeLength': 0.0,
  'prePhonemeLength': 0.0,
  'speaker_uuid': '882a636f-3bac-431a-966d-c5e6bba9f949',
  'speedScale': 1.0,
  'style_id': 47,
  'volumeScale': 1.0}]
  1. audio_query_from_presetにて、クエリデータを作成
  2. synthesisにて音声データを作成

現象・ログ

◯audio_query ナースロボ→audio_query 春日部つむぎ→audio_query_from_preset ナースロボ→audio_query_from_preset 春日部つむぎの順で再生
https://twitter.com/Mega_Gorilla_/status/1660293569951989760

再現手順

ソースコード
https://drive.google.com/file/d/1yOynhQsallhKuIEAFs5LX4R82nKRQ9HK/view?usp=share_link
上記コードを実行することにより、現象の動画を再現可能です。

期待動作

VOICEVOXのバージョン

0.14.5

OSの種類/ディストリ/バージョン

  • [x ] Windows
  • macOS
  • Linux
  • Windows 11 Pro
  • 22H2

その他

取り急ぎ作成した、issueのため不明点等については、質問いただければ幸いです。

@Hiroshiba
Copy link
Member

@Mega-Gorilla audio_queryには話者情報が含まれていないため、audio_query_from_presetを使う場合にsynthesisにspeakerが初期値(8)のまま渡されているためだと思います!

具体的に言うとこちらです。

        # audio_query
        if preset_id is not None:
            query_data = audio_query_from_preset(text=text, preset_id=preset_id)
            ##### ここでspeakerを入れ替える必要がある #####
        else:
            query_data = audio_query(text, speaker, max_retry)
        print(query_data)
        # synthesis
        voice_data = synthesis(speaker, query_data, max_retry)
        audio = AudioSegment.from_wav(io.BytesIO(voice_data))
        play(audio)

@Hiroshiba
Copy link
Member

Hiroshiba commented May 21, 2023

preset側でspeakerを指定できるのに、synthesisでもう一回speakerを指定しないといけないのはかなりややこしいかもですね・・・。
audio_query_from_presetのドキュメントにこの注意点を書くとこのトラップに気づけるかもと思いましたが、どうでしょう 👀

@Mega-Gorilla
Copy link
Author

大変ありがとうございます!
指示いただいた通り、
audio_query_from_preset後に、synthesisを行う際、speaker情報を含めることで改善いたしました。

具体的には、

synth_payload = {"speaker": speaker,"enable_interrogative_upspeak": "true"}speakerが指定されていなかったため、正しい値が代入されておらず、speakerについて、正しい値を代入したところ。目的の音声が得られました。

原因としては、

私の方で、audio_querysynthesisの関係性を十分に理解しておらず、synthesisの確認を怠ったことが原因と考えられます。
(audio_queryにて、引数を作成してsynthesisは、音声データに変換のみ行うと勘違いしており、デバッグの際、synthesisの関数が正しくせっていされていなくことを見逃してしまった。)

こちらの認識不足で、ご迷惑をおかけしてしまって申し訳ないです!
対応としては、ドキュメントにて、audio_queryを用いる際synthesisspeakerを一致させることで、十分に対応可能と思います。この度は迅速な対応ありがとうございます!

@Hiroshiba
Copy link
Member

Hiroshiba commented May 22, 2023

解決してよかったです!

ドキュメントについては検討したいと思います。
そもそも仕様としてaudio_queryの中にspeaker情報があると紛らわしさが減るなぁと思いました。もしかしたら破壊的変更をするタイミングで改修するかもです。

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

No branches or pull requests

2 participants