1
0
hugo/content/blog/2024-09-01-voice.md
2024-12-20 17:03:48 +09:00

5.4 KiB

+++ date = "2024-09-01" tags = ["mac","ue", "obs"] title = "obs+discord+beatriceを使う" +++

obsは配信のためのアプリですが、windowsで使えるマイクがないので、iphoneかmacを使って音声変換してdiscordから取ってみた。このやり方がすごく良かった。あと後述するちやは神社が配布しているrvc modelがすごかった。

./start_http.command

まずマイクに近づかないと音を取れないのがきつい。なので離れていても音を取るのがいい。最初はiphone(discord)からwindowsに繋いだらかなり離れててもしっかりと音を取れてよかった。

ただ、音声変換があまりうまくいかなくて、obsのVST Pluginだったかを使うのは厳しいと感じた。なので、方向を変えてmac(discord)から接続することにした。

macのgaragebandによる音声変換も使えるけど、beatriceがいいらしいのでw-okada/voice-changerから使うことにした。

webcam motion capture

まずvrm4u(vmc)ではwebcam motion captureが動きません。ue5.4.4のvrm4u(202408)の環境ですが動かない。しかし、一旦、vseefaceなどを挟むと使用できます。ただし、webcam motion capturew-okada/voice-changerを同時に使用するとアプリが落ちます。時間経過でwebcamのcaptureが動かなくなります。

discordを使う理由

discordからでないと音量が大きくなりません。小さい声でもちゃんと拾って変換してくれるやり方として、discordを使うとうまくいきました。ただし、高価なマイクがある場合はそちらの方が良いでしょう。

配信環境

[mac]

  1. VB-Cableで仮想オーディオデバイス(output)を起動
  2. discordのinputに指定
  3. w-okada/voice-changerを起動してoutputにいれる

[windows]

  1. discordでボイスチャットに入る(別アカウント)、ここで音声が聴こえるはず
  2. obsでdiscordの音声キャプチャ
  3. webcam motion capture -> vseefaceでカメラからvrmを動かせるようにする
  4. ue5を起動して、obsでウィンドウキャプチャ。youtubeアカウントに接続し、配信管理から予約、開始する。開始したあとは準備できるまで音声キャプチャをミュート。ゲームを調整できれば開始してミュートを切る

配信中にやること。操作がちょっと大変です。カメラ操作や移動操作など。

また、英語音声に変換しながら配信する予定。自動音声変換は精度が悪かったので文字列にしました。文字を打ち込むかあらかじめ用意しておいた文字を変換します。これをmacで流すとdiscordを通じてかなりはっきり英語を喋ってくれます。たまってきたら音声ファイルをpecoとかfzfで検索できるようにしておくと良さそう。

#!/bin/zsh

d=${0:a:h}
f=$d/voice.json
vdir=$d/voice_dir
cfg=~/.config/ai/voice.json

if [ ! -d $vdir ];then
	mkdir -p $vdir
fi

if [ -z "$1" ];then
    ep=`cat $f|jq length`
	ep=$((ep - 1))
else
	ep=$1
fi

j=`cat $f|jq ".[$ep].body"`
n=`echo $j|jq length`
n=$((n - 1))

fnction voice_chat() {
	#echo chat : https://openai.com
	#echo voice : https://elevenlabs.io
	
	vfile=$vdir/${ep}_${i}.mp3
	if [ -f $vfile ];then
		mpv $vfile
		echo voice ok
		read
		continue
	fi

	echo "[$i]"
	t=`echo $j|jq -r ".[$i].text"`
	echo $t
	echo ---
	read chat_text
	if [ -z "$chat_text" ] && [ -n "$t" ];then
		chat_text=$t
	fi
	echo $chat_text
	echo ---

	chat_api=`cat $cfg|jq -r .chat_api`	
	voice_text=`curl -sL https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer $chat_api" -d "{ \"model\": \"gpt-4o-mini\", \"messages\": [{\"role\": \"user\", \"content\": \"次の文章を英語に訳して\n\n$chat_text\"}], \"temperature\": 0.7 }"|jq ".choices.[].message.content"`

	echo $voice_text
	# like-model
	voice_id=zrHiDhphv9ZnVXBqCLjz
	# alice-model
	voice_id=Xb7hH8MSUJpSbSDYk0k2
	voice_api=`cat $cfg|jq -r .voice_api`
	curl -sL --request POST \
		--url https://api.elevenlabs.io/v1/text-to-speech/$voice_id \
		--header "xi-api-key: $voice_api" \
		--header 'Content-Type: application/json' \
		--data "{
			\"text\": $voice_text,
			\"model_id\": \"eleven_multilingual_v2\",
			\"voice_settings\": {
			\"stability\": 0.5,
			\"similarity_boost\": 0.5
		}
	}" --output $vfile && mpv $vfile
}

for ((i=0;i<=$n;i++))
do
	voice_chat
done
[
	{
		"id":1,
		"body" :[
			{ "text":"こんにちは、みんな"},
			{ "text":"配信を見てくれてありがとう。またね。"}
		]
	}
]

なぜue5(editor)で起動するのか?

editorは相当重いので本来はbuildしたpackageで実行する方が良いです。しかし、buildするとvrm4u(vmc)の表情が動かなくなります。またstandaloneはもっと重くなりますので選択しません。PIEでwindowを作りません。windowを作ると新しい問題が発生しますし、動作も重くなります。

rvc model

boothでいくつかrvc modelを販売しているけどおすすめしません。freeのものも含めて使用できるレベルのものは現状少ないと感じています。