GithubHelp home page GithubHelp logo

k2kobayashi / sprocket Goto Github PK

View Code? Open in Web Editor NEW
594.0 594.0 116.0 1.79 MB

Voice Conversion Tool Kit

License: MIT License

Python 100.00%
speech-enhancement speech-synthesis sprockets voice-conversion

sprocket's People

Contributors

k2kobayashi avatar r9y9 avatar tats-u avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sprocket's Issues

CI 連携

自分のローカルでは動くけど別の人の環境では動かない、みたいな問題が起きないように、travisなどを利用して継続的にテストを行うのがよいと思います

変換音声のパワーの補正

入力メルケプのパワーを考慮して,変換メルケプにコピーしたメルケプの0次項を修正するコードを実装する.

Current ToDo

ToDo

  • Upload conversion samples
  • Create document and open at GitHub.io?
  • Register PyPI
  • Test using VCC 2018 dataset
  • Devide sprocket library and sprocket-examples into different repository
  • Add equation number into MLPG scripts #12

Function implementation

  • codeap conversion
  • Single-path training
  • Alignment with silence and 0-th order of mel-cepstrum
  • Implement EL or NAM to SP example scripts

FeatureExtractorのbandapの次元数指定

feature_extractor.pyFeatureExtractorbandapメソッドの引数dimがない.
説明欄にはdimが存在していることになっている.

    def bandap(self):
        """Return encoded aperiodicity sequence
        Parameters
        ------
        dim: int, optional
            Dimension of the band-aperiodiciy
        Returns
        -------
        bandap: array, shape (`T`, `dim`)
            Encoded aperiodicity sequence of the waveform
        """
        self._analyzed_check()

        return pyworld.code_aperiodicity(self._ap, self.fs)

まだ未実装なだけでしたらすみません・・・

ドキュメントの整備

コードに徐々にドキュメント用?のコメントを記載していっている.ドキュメント作成について何か経験的な知見があれば(例えばフレームワークの良し悪しや記載方法)教えてください.

ownershipの移行

本日中に,ownershipをk2kobayashiに移行して,publicする予定です.

pythonのクリーンな環境でのインストール

werckerの方では,minicondaにより,numpyをインストールしているため,pysptkのインストールでこけない様ですが,pythonのクリーン環境にインストールする場合,pysptkでnumpyのインストールが必要なため,依存エラーによってpip install -rが落ちる様です.対応を考える必要があります.

exampleにおけるymlの扱い

exampleをsprocketを用いるユーザ編集スペースと捉えるとそこにymlファイルを読み出すクラスを用意して,example内で利用すれば良いと考えた.それを実装する.また,下記の様なディレクトリ構造を検討

  • 話者毎の特徴量も全てdata/$org-$tar/feature/$orgなどの様に入出力話者ペアのディレクトリに生成する.(冗長ではあるが,複数の話者ペアでrun_sprocket.shを並列処理した時にoverwriteなどが発生しなくなる.)

F0の線形変換の実装

変換時に話者間の音高を補正するF0変換を実装する

  • sprocket/stats/f0statistics.pyに実装する.
  • 入力話者のF0を引数として,非ゼロ要素に対して線形変換を実施し,変換F0を返す.
  • convert.pyにF0変換機能を追加する.

分析再合成の実装

入力自然音声から分析された音響特徴量を用いて波形合成し,分析再合成が正しく動いている事を確認する.

  • F0, spc, apでworldの合成器を用いた波形合成
  • F0, mcep, apでworldの合成器を用いた波形合成
  • F0, mcepでsptkの合成器を用いた波形合成

MLPGの実装

Maximum Likelihood Parameter Generationの実装

  • 対象ファイル: sprocket/model/GMM.py
  • GMMTrainerのmlpgに条件付き分布から与えられた場合にパラメータ系列を最尤推定する
  • 高速化は後回し
    ※ GMMTrainer内で特徴量系列を推定・変換しているので,GMMConverterと分けるか,GMMというクラスに変更する必要がある.GMMでもsklearnと被らないので,問題はなさそう.

Test code for example scripts

exampleに対するテストコードがあると良いですね.

  • 入力話者,目標話者のwav(30文程度)と対応するlist, conf, yamlをラボの外部向けサーバーからダウンロードする.
  • テストコードでexampleの一連の処理(run_sprocket.pyおよび,run_f0transformation.py->run_sprocket.py)の処理を回す.
  • 事前に処理済みのcvmcepとのメルケプ歪がしきい値以下である事を確認する.

too many open file in HDF5

ARCTICの話者データ全てを使って学習 (1132発話 / 話者) を回すと,下記のエラーが出力されます.

IOError: Unable to open file (Unable to open file: name = './data/pair/slt-jmk/h5/slt/arctic_b0428.h5', errno = 24, error message = 'too many open files', flags = 0, o_flags = 0)

ulimit -n 3000

でこのエラーを回避する事が出来ましたが,この回避方法で問題ないでしょうか?
もしくは,hdfファイルを開きすぎない様に,実装を変更した方がよろしいでしょうか?
(恐らく,メモリーにmcepファイルを逐次読み込みクローズする処理に変更する)

PRからMergeまでの流れ

rebaseを用いて,コミットのコメントを一つのコミットにまとめて,masterにmergeする流れとして確認したいのですが,

  1. PRを作成し,コードレビューを実施する.
  2. レビュー完了後,以下のrebaseコマンドによりコミットメッセージを一つにまとめる.その際.コンフリクトが発生した場合は,修正して,add, continueを繰り返す.
git rebase -i HEAD~N
  1. 他のbranchとしてpushし,新たにPRを作成し,Web上でmasterにmergeする or git push -f origin branchで矯正的にリモートを更新する.
    という流れで良いでしょうか?

ファイルベースの変換コマンドの実装

SOURCE TARGET inwav outwav を引数として,outwavに学習済みのモデルを用いてinwavを変換し出力するスクリプトの実装.
なお波形のF0変換,特徴量抽出は,スクリプト内で実行する.(つまり,評価リストに記述されていない入力話者の音声を変換する.)

Python2 / python3 互換性

いまはpython3で動かないので、両方で動くようにしたいですね。私こういうの得意です

DNN-based VC

Please implement DNN-based VC system

  • implement training and conversion functions into /sprocket/sprocket/model/DNN.py
  • create test code in /sprocket/sprocket/model/tests/test_dnn.py

If you need joint feature vector, you can get by using scripts in /sprocket/example.
Before implementing, let us know the method or paper and library.
Currently, no deadline.

インターフェースの改善の提案

インターフェース改善の提案

sprocketのライブラリとしての目的として,VCシステムを再現できる事,パラレルデータを作成できる事がありましたが,新たな機能の実装時(例えば,DNNでの変換)に,音声波形から音響特徴量の抽出や,客観評価用にMel-CDをサクッと計算できる様なライブラリであると嬉しいと考えています.

現状関数が煩雑であるため,APIの計算資料を修正していく必要があると考えている.以下の様にライブラリを修正しようと考えていますがいかがでしょうか?

現状では,下記の様にsprocketのAPIを呼んでいる.importするためにpythonのファイル名まで記述する必要があり,若干冗長な記述になっている気がする.(あと,覚えにくい)

from sprocket.util.hdf5 import HDF5

現状は,sprocket以下に(feature, model, stats, util)のディレクトリが存在しており,これらの内部のpythonスクリプトに各関数が記述されている,各ディレクトリ以下の__init__.pyに存在するpythonをimportする事で,下記の様にAPIを呼び出せると考えられる.また,副産物として,ドキュメントを読みやすくなると考えられる.

from sprocket.util import HDF5

更に,sprocketの構成を次の様に変更しようと考えている.

sprocket/featureのリネーム

feature
->
speech
(音声データを介在するクラスとして扱う)

util内のshifter.py, wsola.pyをこのクラスに移動する予定

sprocket/statsのsprocket/modelへの統合

stats/f0statistics.py, gv.py
->
modelに移動

Command line parser for bash

example内のbashのスクリプトに対して,コマンドラインパーザーを入れておいた方が良いかと考えています.

jnt抽出時のMel-CDの値

少し気になる点があって,このPRをマージする前の0-th iteration のMel-CDはおおよそ8くらいで妥当だと思ってたのですが,このPRをマージすると0-th iterationのMel-CDが4くらいになってて,mel-cepstrumのスケールがおかしいような気がしています.

差分MLSAフィルタの実装

入力音声波形(raw)に対して,入力メルケプストラム[T, 24] を差分GMMで変換した差分メルケプストラム[T, 24] を用いて,パワーを保持したまま包絡情報を補正するコード.

  • sprocket/backend/synthesizer.pyのSynthesizerクラス内に関数を作りたい所
  • 通常のMLSAフィルタも欲しい所(Synthesizer.synthesisの修正)
  • ※ GMMから差分GMMのパラメータ変換処理は現状存在しない.
  • ※ 特徴量とかは,scripts/src/convert.pyで利用したりしているのでそれが多少参考になるかも.

HDF5で保存されるファイル容量が異様に大きい?

深く調べていないですが、ふと試してみたところ、hdf5のデータがwavファイルに比べて70倍以上容量を取っていたのに気づきましたので、報告しておきます。正常でしたら、closeしてください

試したコマンド:

python initialize.py -1 -2 -3 SF1 TF1 16000 
python run_sprocket.py -1 -2 -3 -4 -5 SF1 TF1

結果:

 > find wav/SF1/ -type f | wc -l                                                                                                     
216
> du -hs wav/SF1/                                                                                                                    
24M     wav/SF1/
> find pair/SF1-TF1/h5/SF1/ -type f | wc -l                                                                                          
216
> du -hs pair/SF1-TF1/h5/SF1/                                                                                                        
1.8G    pair/SF1-TF1/h5/SF1/

WORLDのpython実装のリニューアル

いままで:
https://github.com/jimsotelo/world.py

これから:
https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

理由:

  • 前者はもうメンテされていないが、後者はされている
  • 後者は最新のworldで動く
  • 後者は新しいAPI(スペクトル包絡の圧縮、デコード、frame-by-frame波形合成等)が整備されている
  • 後者はpython2/3でテストされている
  • 一行でインストールできる pip install git+https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

差分GMMモデル化のためのモデルパラメータ変換

X->Yでモデル化したGMMに対して,パラメータの変換を行いX->Dの差分GMMのモデルパラメータを得る.

  • sprocket/model/GMM.pyに実装する
  • convert.pyで学習済みGMMを読み込んだ後に,GMMTrainerクラス内のモデルパラメータ変換関数を実行し,GMMクラス内でのモデルパラメータを変更する.

run_sprocket.sh を実行したいです

どうすればいいでしょうか

 ./run_sprocket.sh                                                                                                                          master 
##############################################################
### Conversion based on the trained models                 ###
##############################################################
Traceback (most recent call last):
  File "./src/convert.py", line 110, in <module>
    main()
  File "./src/convert.py", line 48, in main
    pconf = PairYML(args.pair_ymlf)
  File "/home/ryuichi/Dropbox/vc/sprocket/sprocket/util/yml.py", line 47, in __init__
    with open(ymlf) as yf:
IOError: [Errno 2] No such file or directory: './data/pair/clb-slt/clb-slt.yml'

Faster dtw

いま結合特徴量の作成に用いているdtwパッケージは、読んでみたらpure-python実装で、距離行列の計算がforループで書かれているため、つまりとても遅いです。cythonで実装された https://github.com/slaypni/fastdtw を使うと、非常に高速化されることを確認しました。結果がどの程度変わるのかまでは調査していませんが、価値があるのではと思っています。簡単にreplaceできるのですが、今やるとconflictが発生して大変そうなので、とりあえずissueをあげておきます。

差分VCの変換に対するデバッグ

#14をmergeした際,差分VCが動作していると思ってましたが,どうやら通常VCの変換音声を差分VCのものと勘違いしていた様です.先程差分VCサンプルを確認してみた所,上手く変換されてない感じです.通常VCが正常に変換されてることより以下の点での問題が考えられます.

  • 差分GMMのパラメータ変換がおかしい
  • MLSAフィルタが正常に動作していない
    経験的なものですが,同性間の変換の場合,正常に変換された差分VCの声色は通常VCの声色と知覚的にほぼ同等に感じるはずです.

GV post-filterの実装

変換mcepの分散を補償するGVポストフィルタを実装する.

  • sprocket/stats/gv.pyのGVに実装する.
  • 変換メルケプが引数で与えられ,変換メルケプを返す.
  • 目標話者のGVの統計量はGVクラスで読み込む.
  • convert.pyに加える.
  • 変換メルケプのGV有り,無しで,GVのグラフを作成して確認出来ると良いが,後回しでもおk

公開までのToDo

機能的には,公開する要件を満たしてきましたので,公開までのステップを議論したいと思います.
何か懸念点等あれば書き込んでいってください.

exampleの処理並列化

下記のファイルベースの処理に対して,並列処理を実行するオプションをexampleに追加します.

  • 波形のF0変換 (src/f0_transformation.py)
  • 特徴量抽出 (src/extract_features.py)
  • twfの推定 (src/estimate_twf_and_jnt.py)
    F0変換,特徴量抽出は,比較的簡単に並列化出来る気がします.
    twfの推定を並列処理するためには,sprocket以下のライブラリ側をもう少し具体化して,src/estimate_twf_and_jnt.pyに展開する必要があるので,少しだけ複雑です.

データセットをリポジトリから削除する

バイナリファイルは、gitで差分を上手く管理できないので、何か変更がある度にwavファイルのサイズ分だけリポジトリが肥大化していきます。
例として、https://github.com/openframeworks/openFrameworks というツール(以前良く使ってました、音声とは全然関係ないですが)は、スタティックライブラリをgitに含めていて、かつバージョンをアップの度にアップデートされるので、結果リポジトリをクローンするだけで数GBの容量をとるまでになっています。

wavファイルが十分小さくて、今後変更はないと考えれば、よいとする考えもありますが、個人的には削除した方がよいと思います。

Register in PyPI

  • Create an account in PyPI
  • Reserve an package name (e.g. sprocket-vc)
  • Upload the first tarball that is made by python setup.py sdist
  • Automate the upload process using Travis

このリポジトリの目的

このリポジトリのコードが提供する目的を、明確にしませんか?という話です。僕は主に、研究者がコードを公開する上で、以下の2つの意義があると思っています。

再現性の保証

Code to reproduce XX paperといったように、論文の実験結果を再現するためのコード、という位置付けです。例えば深層学習の分野では、xxxNetなどという名前で、日々アップロードされています。ベースラインとして他の研究の役に立つので、とても価値があると思います。

汎用的なツールの提供

他の研究の役に立つ汎用的なツールとして、 の位置づけです。音声分野では、SPTK, HTSなどが相当します。例えばSPTKは、小さな音声処理のプログラムを(シェルのパイプによって)組み合わせることによって、音声処理における多くの問題に汎用的に使用できるように設計されています。他の研究の役に立つので、これもとても価値があると思います。

現状の整理

で、何が言いたいかと言いますと、今後コードを改善していく上で、まず、どちらにどの程度着目するのか、という点について明確にしませんか、ということです(その他の目的があれば、補足お願いします)。それによって、今度どうすべきかが変わってくると思います。

もし前者全振りならば、考えることはそんなに多くないと思うのですが、もし後者も目的に設定する場合(できればそうしたいとは思いますが)、メンテも必要になってきますし、やることも多くなってくると思うので、大きな実装を始める前に、設計について議論すべきだと思います。考えるべき点について、いくつか挙げると、

  • そもそもどういう使用方法を想定するのか?ライブラリとしての使用(import hoge のような使い方)?それともコマンドラインツールとしての使用? or 両方?
  • 現状GMMベースの方法以外では使えないような設計になっているので(GMMTrainerありきですよね)、変換モデルに対する抽象化が必要ではないか
  • 特徴量にメルケプストラム以外使えない設計になっているので(FeatureExtractorにベタ書きされています)、特徴量に対する抽象化が必要ではないか
  • 分析合成系にはWORLDしか使えないようになっているので(昔Analyzer/Syntehsizerという共通インタフェースを作ったけど、使われていないので…)、STRAIGHTなりSPTK(のF0抽出手法各種)なり、その他分析合成系が使えるよう、抽象化が必要ではないか
  • 非パラレルデータからの声質変換も視野にいれる or not?
  • 一対多、多対一、多対多声質変換、etc

などです。あまり汎用性を意識しすぎても、何も手を付けられれないので、どこかにポイントを絞るべきかなと思ったりしますが、まずは明確にしないと、特に複数人での開発が難しいように思います。

So what

上記を踏まえて、僕から言いたいことをまとめると、

  1. Code to reproduceという点に割りきって、汎用性の優先度を下げて最速でリリース可能なようにissueを片付ける?run_sprocket.sh を実行すると、xxの実験結果を再現することができます、という形にする(それがゴール)。現実的です
  2. or ライブラリとしての設計を考えた上ですすめる?現状は、自分も関わっていて申し訳ないですが、上記考えるべき点でも挙げた通り、汎用的なツールであるとはいいにくいと思います。この方針で行く場合は、まず設計(≒何をゴールとするか)を考えないといけないと思います。

ご意見よろしくお願いします。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.