見出し画像

(V1用記事です(新V2出ました))RVC 愛想良い系少女の声 バグ対策 サポートなど






お知らせ

進化したV2 モデルが登場しました!移行お願いします

理論が進化し、5種の音質全てがとても高品質になり、声の破綻が減り、より実際の若年女性の声に近づきました ! ↓V2導入解説リンク

V2モデルは、V1の完全上位互換版になります。旧V1のサポートは将来的に閉じる予定となっておりますので、V2への移行をお願いします

配布ダウンロード https://chihaya369.booth.pm/items/4701666










V1音声の年齢性別の変換結果 サンプルボイス ほわっと風味.mp3

声のお化粧ともいえます。

【使用例】コント動画の2人の声に使っていただきました、非リアルタイム変換には、なるほどこういう使い方もあるのかと驚きました。

※追記 青いRVC本家バージョンは リアルタイム変換の場合5/28日バージョンを使ってください https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/RVC-beta-v2-0528.7z

リアルタイムボイチェンでの使い方


あたらしいクライアントソフトにアップデートすることで5種風味全てリアルタイム変換できます 以下解説画像です (クリックして拡大)

下の解説画像で紹介されている青いクライアントソフトウェアのダウンロードリンクです
https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/RVC-beta-v2-0528.7z
上のリンクをクリックすると、3.1GBのダウンロードが始まります、    7z解凍方法がわからない場合は ⇒ https://www.google.com/search?client=firefox-b-d&q=7z+%E8%A7%A3%E5%87%8D

以降の説明は下の解説画像をクリックして拡大し見てください
※追記 vcclientでのindex rate調節バーの数値は0にしてください



どうしても古いバージョンのクライアントソフトを使用する方向け⇒【"古いクライアント"でのリアルタイムバグ解決済みほわっと風味、boothで公開しました】


製品による、できる事の違い○×

【RVCモデル_愛想良い系少女の声5種風味パック.zipで出来ること】(2023年4月29日現在のものであり、状況が変化している可能性があります)
○ VCclient 最新バージョンv.1.5.2.6a以降での リアルタイム変換
○ 最新RVC WebUI https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/RVC-beta-v2-0528.7z 最新バージョンでのgo-realtime-gui.bat実行によるリアルタイム変換
○ RVC WebUI https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/RVC-beta-v2-0528.7z でのgo-web.batブラウザUI(モデル推論タブ)による非リアルタイム変換
X 古いVCclientでのリアルタイム変換

【古いクライアントでの リアルタイムバグ解決verほわっと風味.zipでできる事】
○ 古いバージョンのVCclientでのリアルタイム変換
○ RVC WebUI https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/RVC-beta-v2-0528.7z でのgo-web.batクリック実行での ブラウザUI(モデル推論タブ)による非リアルタイム変換


【非リアルタイム変換でも遊べる!】
皆さんからお寄せいただいた案
・ゆっくり霊夢などに声を当ててコント動画
・喋ってツイッターに投稿


RVC本家のWebUI 非リアルタイム使い方

追記 !
・RVC本家(lj1995氏のWebUI)の go-web.batは普通に左クリック実行でお願いします、
・ほわっとタイプが一番性能の高さがわかりやすいモデルです

動作環境 win10
・RVC開発の大元lj1995氏のWebUI
(ダウンロード
https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/RVC-beta-v2-0528.7z ) このzipを解凍後、中にあるgo-web.batを実行してください

さらに愛想良い系少女の声の .pthファイル5種をgo-web.batファイルと同じディレクトリにあるweightsフォルダーに入れてください

・笑顔で話すと綺麗に変換されやすいです
・ピッチ変更は12
・pm、hervestの選択はできればhervestが良いOK
・周波数の選択がボタンがあれば、40kHZ(デフォルト)を選択してください
・他のモデルのために作られた特徴量検索データベースのファイルパス(.index)
特徴量ファイルのパス(npy)と音高ガイドの入力がUI上に残っているとバグが起きる可能性もあります(添付画像)、それらの下にある棒スライダーは0.0にした方が性能が高くなることもあります
・WebUIの変換元音声ファイルを入力する際は、音声ファイルの拡張子間違いにお気を付けください、hanasita.wav hanasita.m4a hanasita.mp3など、音声ファイルにもいろいろございます

今後の開発予定

クライアントソフトアップデートのおかげで、リアルタイム変換5種風味全て対応しました ありがとうございました。


TwitterでRVC好きの人をチェックするといいでしょう


【技術者向けおまけ】 自分が喋った後に声が出るゆりねっとの私用プログラムです


これをinifer-webの先頭に張り付けてさらにvc_single関数等を書き換えたり色々します しくみとしてはwavファイルのパスを引数に音声変換するvc_single関数を流用する感じです、音が検出⇒マイク録音⇒音が無い⇒録音停止⇒wavファイルをvc_single関数に投げてボイチェン⇒出来上がったwavを再生という流れです。こうすることで、喋り終わって一旦おいてから、ボイチェン後の声が聴けます、複雑な環境の違いがあるので一般の人に出してエラー頻発したら悪いのであえてこういう形で現在は置いておきます





folder_path = "./lealtimerecord_out"
def monitor_sound_file(folder_path):
    while True:
        file_path = folder_path+"/sound.wav"
        print(file_path)
        if os.path.exists(file_path):
            try:
                # ファイルが存在する場合、再生
                print("Playing sound file...")

                data, fs = sf.read(file_path)
                fs=44100
                # バッファサイズを設定する (例: 1024)
                time.sleep(0.15)
                sd.default.blocksize = 1024
                #sd .play(data, fs)
                #sd .wait()  # 再生が完了するまで待つ
# 再生したいオーディオファイルのパスを指定します。
                audio_file_path = file_path

# コマンドプロンプトで実行するコマンドを指定します。
                command = f'start "" "{audio_file_path}"'

# コマンドを実行します。
                subprocess.run(command, shell=True)
                time.sleep(2.15)
                # ファイル名を現在時刻のタイムスタンプに変更
                #new_file_name  = time.strftime("%Y%m%d_%H%M%S%f") + ".wav"
                new_file_name = "sound_" + time.strftime("%Y%m%d_%H%M%S") + ".wav"
                new_file_path = folder_path+"/"+new_file_name
                os.rename(file_path, new_file_path)
                print("File renamed to:", new_file_name)
            except:
                print("ERRRORRR  monitor_sound_file")

        # 1秒待機して再度監視
        time.sleep(0.1)
if __name__ == "__main__":
    # 新しいスレッドで関数を実行
    
    monitor_thread2 = threading.Thread(target=monitor_sound_file, args=(folder_path,))
    monitor_thread2.start()
    





handfree_wav_dir="./lealtimerecord/sound.wav"
class Recorder:
    def __init__(self):
        self.sample_rate = 44100
        self.channels = 1
        self.recorded_data = []

    def record(self):
        with sd.InputStream(samplerate=self.sample_rate, channels=self.channels, dtype='int16', callback=self.callback):
            while self.is_recording:
                sd.sleep(1000)

    def callback(self, indata, frames, time, status):
        self.recorded_data.append(indata.copy())

    def start_recording(self):
        self.is_recording = True
        self.record_thread = Thread(target=self.record)
        self.record_thread.start()

    def stop_recording(self):
        self.is_recording = False
        self.record_thread.join()

        recorded_data_np = np.concatenate(self.recorded_data, axis=0).flatten()
        self.recorded_data = []

        return recorded_data_np





# Recorderクラスを使用している部分をsounddeviceに対応するように変更
def monitor_and_save_audio(threshold, silence_duration):
    recorder = Recorder()
    recording = False
    silence_timer = 0

    while True:
        input_data = sd.rec(int(1024), samplerate=44100, channels=1, dtype='int16')
        sd.wait()  # Wait for the recording to finish
        input_data = np.squeeze(input_data)  # Remove the extra dimension
        input_volume = np.average(np.abs(input_data))

        if recording:
            if input_volume < threshold:
                silence_timer += 1024 / 44100
                if silence_timer > silence_duration:
                    recorded_data_np = recorder.stop_recording()
                    sf.write(handfree_wav_dir, recorded_data_np, 44100, format="wav")
                    vc_single(1,".\\lealtimerecord\\sound.wav",12,"","harvest","","",0.3)

                    
                    recording = False
                    print("Audio saved to ''"+handfree_wav_dir)
            else:
                silence_timer = 0
        else:
            if input_volume > threshold:
                recording = True
                recorder.start_recording()
                silence_timer = 0

        time.sleep(0.01)

if __name__ == "__main__":
    # 新しいスレッドで関数を実行
    monitor_thread = threading.Thread(target=monitor_and_save_audio, args=(400, 0.3))
    monitor_thread.start()
#/ORIGINAL CODE