Skip to content

The vocal tract environment for speech generations by reinforcement learning.

Notifications You must be signed in to change notification settings

matsuo-group24-PinkTrombone/PynkTromboneGym

 
 

Repository files navigation

PynkTromboneGym

The vocal tract environment for speech generations by reinforcement learning.
See pynktrombone and Original PinkTrombone.

Installation

pip install git+https://github.com/Geson-anko/PynkTromboneGym.git@master

Or, clone this repository, and run a following command.

pip install -e .

Sample Code

See sample.py

Environment Definition

PynkTromboneEnvは人間のVocal Tractをシミュレーションし、強化学習の枠組みを用いて音声生成タスクを定義するためのEnvironmentです.
基本的にGym APIに従っています。

Construction (__init__)

環境を構築します。いくつか指定する必要のある項目(引数)が存在します。

  • target_sound_files: Iterable[str]
    模倣対象となる音声ファイル群を渡します。wav形式が望ましいですが、ffmpegをインストールしている場合はmp3などの形式も読み込む事ができます。

  • sample_rate: float
    生成する音声の解像度です。ターゲットとなる音声もこのサンプリングレートに合わせられます。

  • default_frequency: float
    基準となる声の高さです。この周波数から $\pm{1}$ オクターブが生成可能な周波数帯です。

  • generate_chunk: int
    1ステップで生成する音声波形の長さです。pynkTromboneではデフォルトで1024です。
    ちなみに generate_chunk / sample_rate [s] が1ステップで生成する波形の時間間隔です。

  • stft_window_size: int
    波形をstftする時のウィンドウサイズです。デフォルトでは1024です。

  • stft_hop_length: int
    波形をstftする時のホップ幅です。デフォルトはstft_window_size/4を使用します。

  • rendering_figure_size: tuple[float ,float]
    renderメソッドでレンダリングされる画像の大きさです。matplotlibを使用しているため(width, height)の順で、単位はInchです。

  • set_target_sound_files(file_paths: Sequence[str]) : method
    このメソッドを使用することで使用する音声ファイル群を変更する事ができます。

Reset

環境をリセットします。ランダムに音声ファイルを選択しターゲット音声とします。内部のVocal Tract モデルもリセットします。 返り値として、初期観測を返します。

Observation

音声生成を強化学習の枠組みで行うために必要な観測情報を定義します。これらはOpenAI GymのAPIを用いてDict型で返されます。これらの値名はpynktrombonegym.spaces.ObservationSpaceNamesクラスに記述されています。

  • target_sound_wave
    次のステップで生成する波形です。

  • generated_sound_wave
    そのステップで生成した波形です。

  • target_sound_spectrogram
    次のステップで生成する波形のスペクトログラムです。

  • generated_sound_spectrogram
    そのステップで生成した波形のスペクトログラムです。報酬計算に使用されます。

  • frequency, pitch_shift
    現在の声帯の周波数と、default_frequencyからピッチシフトした大きさ(指数部)を返します。

  • tenseness
    現在の声帯の掠れ具合の値です。<Env>.voc.tensenessからもアクセスする事ができます。

  • current_tract_diameters
    円筒列で近似した声道の現在の直径の値を配列で返します。

  • nose_diameters
    円筒列で近似した鼻腔の現在の直径の値を配列で返します。

Action

この環境モデルの行動を定義します。行動は全てNumpyArray形式で、行動空間はDict型で定義されます。各行動の名前はpynktrombonegym.spaces.ActionSpaceNamesクラスに記述されています。

  • Glottis
    声門を調整します。
    • pitch_shift
      Range: [-1, 1] (この値は環境をラップすることで変更できます。)
      default_frequencyからどれだけピッチシフトをする値です。周波数は次の式で与えられます。

      $$ frequency = default \ frequency \times 2^{pitch \ shift} $$

    • tenseness
      Range: [0, 1]
      声の掠れ具合です。

  • tract_diameters
    詳細はPynkTromboneのREADME.mdを参照願います。
    • trachea
      Range: [0, 3.5]
    • epiglottis
      Range: [0, 3.5]
    • velum
      Range: [0, 3.5]
    • tongue_index
      Range: [12.0, 40.0]
      Note: この値はfloat型です。詳しくはPynkTromboneの実装を参照ください
    • tongue_diameter
      Range: [0, 3.5]
    • lips
      Range: [0, 1.5]

Step

上記のアクションは、全てpynktrombone.voc.Vocの調整のみに使われます。
Voc.play_chunk()によって音声波形を生成し、観測、報酬、終了判定、デバッグ情報を返します。

About done

ターゲットとなる音声の長さに生成波形が達した場合、doneとなります。この状態で行動しようとすると例外を返します。

Reward

target_sound_spectrogramとgenerated_sound_spectrogramの平均二乗誤差の符号を反転させた値を返します。

Visualize (Render)

current_tract_diametersnose_diametersをplotした画像を返します。
次のような形でプロットされます。 sample_render

Wrappers

PynkTrombone Environmentクラスをラップするいくつかのクラスがあります。

Log1pMelSpectrogram

stftによって生成されたスペクトログラムをメル周波数スペクトログラムにした後、対数スケールに変換する派生クラスです。
Note: 実際はラッパーではなく、継承したSubclassであることに注意してください。__init__を呼び出す際の引数がいくつか追加されています。

  • mel_channels: int
    Melスケールにする時のチャネル数です。デフォルト値は80です。
  • dtype: Any
    Mel filter bankの型です。デフォルト値はnp.float32です。

次のようにして使用します。

from pynktrombonegym.wrappers.log1p_mel_spectrogram import Log1pMelSpectrogram

env = Log1pMelSpectrogram(target_sound_files=..., mel_channels=64, ...)

ActionByAcceleration

これは物理系に従い、加速度を入力に取るようにラップするActionWrapperです。
ランダム方策による生成結果がより自然な形となり、学習が用意になることが予想されます。
加速度に変換された行動の範囲は0が中心になります。

次のようにして使うことができます。

from pynktrombonegym.env import PynkTrombone
from pynktrombonegym.wrappers.action_by_acceleration import ActionByAcceleration

env = PynkTrombone(target_sound_files=...)
wrapped = ActionByAcceleration(env, action_scaler=env.generate_chunk/env.sample_rate)

このラッパーは以下の引数を持ちます。

  • env: gym.Env
    PynkTrombone環境モデルのインスタンスです。
  • action_scaler: float
    行動の値の範囲をこの値でスケールします。generate_chunk/sample_rateを基準とすると良いでしょう。
  • initial_pos: Optional[Dict]
    PynkTrombone環境モデルの初期行動です。指定されない場合はランダムにサンプルされます。
  • ignore_actions: Optional[Iterable[str]]
    ラップしない行動の種類を文字列で指定します。

References

About

The vocal tract environment for speech generations by reinforcement learning.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 99.8%
  • Makefile 0.2%