【Linux】VOICEVOXで、しゃべってもらうスクリプト、複数行対応【Ubuntu】

【Linux】VOICEVOXで、しゃべってもらうスクリプト、複数行対応【Ubuntu】

VOICEVOXをいじってるので、テキストで渡して、音声化するスクリプトを作ってみた。

#!/bin/bash

# /opt/voicevox_nogui/run、ffmpeg が入っていること
# 使い方
# ./textToVoice.sh ./test.txt

# Voicevoxキャラクタ番号を指定(29 はナンバーセブン
CharacterNum=29

OutputDir="${HOME}/Desktop"

SCRIPT_DIR=$(cd $(dirname $0); pwd)
cd "${SCRIPT_DIR}"

readPath=$1
if [ ! -f "${readPath}" ]; then
	echo "${readPath}"
	echo "  が見つかりません。"
	exit
fi

function Start () {
	killall -9 -q run
	sleep 1
	nice -n 20 \
		'/opt/voicevox_nogui/run' &> /dev/null &

	# 動作チェック 60秒起動を待つ
	echo '# start process'
	for i in {1..30} ; do
		ver=`curl -s -X GET "127.0.0.1:50021/version"`
		if [ -n "${ver}" ]
		then
			echo "  Ver ${ver} Start!"
			return 0
			break
		fi
		sleep 2
	done
	return 1
}

function setData () {
	mkdir -p '/tmp/textToVoicevox'
	Sentence=${1}
	echo "${Sentence}" > '/tmp/textToVoicevox/text.txt'
}

function text2Wav () {
	SpeakerNo=${1}
	FileName=${2}

	echo "# voice generation -> ${FileName}"
	Line=`cat '/tmp/textToVoicevox/text.txt'`
	echo -e "  ${Line}"

	nice -n 20 curl -s \
	    -X POST "localhost:50021/audio_query?speaker=${SpeakerNo}" \
    	--get --data-urlencode 'text@/tmp/textToVoicevox/text.txt' > \
    	'/tmp/textToVoicevox/query.json'

	nice -n 20 curl -s \
    	-H "Content-Type: application/json" \
	    -X POST -d @/tmp/textToVoicevox/query.json \
    	"localhost:50021/synthesis?speaker=${SpeakerNo}" \
	    > "/tmp/textToVoicevox/${FileName}"
}

function voiceGeneration () {
	echo '# combine audio'
	for ((i=0; i<$count; i++))
	do
		wavPath="/tmp/textToVoicevox/${i}.wav"
		if [ -f "${wavPath}" ]; then
			echo "${wavPath}"
		fi
	done

	((count--))
	outputPath='/tmp/textToVoicevox/_out.wav'
	eval sox /tmp/textToVoicevox/{0..$count}.wav "${outputPath}"
	nice -n 20 ffmpeg -y -hide_banner -i "${outputPath}" \
		-vn -ar 44100 -ac 2 -b:a 192k "${outputPath%.wav}.mp3" 2> /dev/null
}

function Etc.. () {
	MovePath=`basename ${readPath}`
	mv "${outputPath%.wav}.mp3" "${OutputDir}/${MovePath%.*}.mp3"

	echo '# completion!'
}

### 実行部分 ### ###
# Start
Start
if [ $? ]; then
	# 文章読み込み
	count=0
	while read line
	do
		if [ -n "$line" ]; then
			# SetData
			setData "${line}"
			# TextToWav
			text2Wav "${CharacterNum}" "${count}.wav"
			((count++))
		fi
	done < "${readPath}"

	killall -q run
	# 音声結合
	voiceGeneration
	# 後処理
	Etc..
fi

#

使い方

上のコードをコピーしてもいいけど、Zipファイルも上げておく。

その中の、textToVoice.shに実行権限を与えて、下記のように実行する。

./textToVoice.sh ./test.txt

デフォルトでは、キャラクタは29のナンバーセブン、保存場所は${HOME}/Desktopになっているので、変えたければ、任意に、変える。
あとは、読ませたいテキストパスと、テキストの内容を変更する、と。

出力される音声ファイルは、テキストファイルの名前で、保存場所で指定したフォルダに、作成される。
下のようになっていたら、成功です。

仕様状況

・VOICEVOXを起動するために、メモリを1GBくらい使う。
・何らかの状況で、途中で終了した場合、killall run をして、VOICEVOXの実行ファイルを終了させる。
・/tmp フォルダに過程のファイルを作るので、不要なら削除すること。
・ファイル名に、 ’ や [ ] \ # とかの特殊文字が入っていると、困る。やめて欲しい。
・2行、25文字読ませるのに、自分のパソコンだと、3分弱かかる。
VOICEVOXとGPUで検索すると、GPU版では不安定になるようなので、CPU版でしか、試してないけど。

以上。

Ubuntu22.04のメニューを追加したり、修正する

メニューを修正する

Ubuntuにソフトを入れると、意図していないグループに、アイコンが追加されていたり、アイコンが表示されないこともある。
ので、それを修正したり、追加したいと思う。

まずは、意図していないメニューのアイコンを、右クリックして、「デスクトップに追加する」を選ぶ。
その追加されたものを、テキストエディタで開く。

[Desktop Entry]
X-SnapInstanceName=upnote
Name=UpNote
Exec=env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/upnote_upnote.desktop /snap/bin/upnote %U
Terminal=false
Type=Application
Icon=/snap/upnote/102/meta/gui/icon.png
StartupWMClass=UpNote
Comment=Note app
MimeType=x-scheme-handler/upnote;
Categories=TextEditor;

開くと、こんな感じになる。
このCategoriesが、メニューの表示場所になるので、TextEditorがないために、「その他」のカテゴリになっているのかと。
これを適切なカテゴリにすればいいんだけど、なににしたらいいのか?が、分からない。

ので、すでにあるカテゴリのアイコンを探して、同様にテキストエディタで、開く。
sudo 権限でないと編集できないので、sudo 権限で、テキストエディタを開くこと。
OneNoteというクラウドメモツールでは、下記のようになるので、

Comment=OneNote Desktop Client for Linux
Categories=Notes;Office;Productivity;

Officeを、変更する。

Categories=Office;

少し待つと、自動的にメニューが変更されている。

このアイコンの置き場所は、

snapでインストールしたものは、ここ。
/var/lib/snapd/desktop/applications
aptでインストールしたものは、ここ。
/usr/share/applications
に、アイコンがある。

アイコンがそもそもない場合

そもそも、コマンドとか、スクリプト、Imageファイルは、アイコンが追加されない。
どうにかして、メニューにアイコンを追加したい場合もある。
そういう場合は、すでにあるアイコンを、コピー&ペーストする。
こちらも、sudo権限が必要なので、ファイルマネージャをsudo権限で開く。

[Desktop Entry]
Name=マイスクリプト
Exec=/opt/myScript.sh
Type=Application
Icon=/snap/upnote/102/meta/gui/icon.png
Categories=Office;

必要なのは、
Name:メニューに表示される名前(ファイル名と表示される。
Exec:アイコンをクリックしたときの、実行ファイルパス。
スクリプトのパスやImageファイルのパスでも、問題がない。
Icon:メニューに表示されるアイコンのパス。
Terminal:ターミナルで起動したい時はこれを、true。
Categories:メニューのカテゴリ指定。

ここを変更すれば、自動的にメニューが変更される。
ただし、Name=UpNoteがファイル名として表示されるので、混乱しないように。

最後に

sudo 権限で操作するときには、最新の注意をする。

【簡単】Bashでマルチスレッド待機を実現する【スクリプト】

Bashでマルチスレッド待機を実現する(ただし、非同期

Bashで、マルチスレッドを実現する方法は、簡単で、コマンドの後ろに &をつければ、それがスレッドとして実行される。
デフォルトのファイルマネージャで、ホームフォルダを開くためには、下記のようにする。

xdg-open “${HOME} &

&を付けなければ、ファイルマネージャを終了させるまで、次の処理には行かない。
しかし、スクリプトの中で、全部のコマンドに &を付けると、全部が実行されてしまう。

Bashでのグループ化した処理を、マルチスレッドにしたい

全部のコマンドが逐次実行されてしまうのが、困る時もある。
この一連の処理と、この一連の処理は、別に逐次実行したい時、だ。
スクリプト化し、別にスレッド化する方法もあるかと思うが、もっと簡単な方法でできたので、公開することにする。

zenity --warning --text='スレッド1' && \
	(xdg-open "${HOME}"; \
	xdg-open "${HOME}/Downloads") &

zenity --warning --text='スレッド2' && (pluma; kcalc) &

それはこんな感じ。
zenityは、GUIアラートを出すコマンドだが、分かればなんでもよい。
「スレッド1」で、「OK」ボタンを押して終了になれば、ファイルマネージャで、ホームフォルダと、ダウンロードフォルダが開く。
「スレッド2」で、「OK」ボタンを押して終了になれば、plumaというテキストエディタと、 kcalcという電卓が開かれる。

特定の処理群を、スレッド化する方法としては、わかりやすく、最善の方法の1つではなかろうか。

まとめ

Bashには、いろいろな方法があるかと思うので、いろいろと模索するのは、ちょっと楽しい。
特定の処理群を、マルチスレッド化できたので、よしよし、とする。

【Linux】VOICEVOXで、動画で、しゃべってもらうスクリプト、単一行【Ubuntu】

【前準備】

ffmpegのパスが通っていること。
取ってなければ、ffmepg で検索して、スクリプトを絶対パスに変える。
VOICEVOX.AppImage を /opt/voicevox_nogui フォルダに解凍しておく。
VOICEVOX.AppImage が解凍ソフトで開けない場合は、拡張子を、zipに変えると、解凍できる。

VOICEVOX.AppImage -> VOICEVOX.zip

/opt/voicevox_nogui
┣run
┣voicevox
とかいろいろと入っていること。

あとは、下記のスクリプトと同じフォルダに、動画用の画像の img.bmp と、しゃべってもらう文字を text.txt をやっぱり、同じフォルダに入れておく。

【スクリプト】

#!/bin/bash

SCRIPT_DIR=$(cd $(dirname $0); pwd)
cd "${SCRIPT_DIR}"

killall run
timeout 600 nice -n 20 '/opt/voicevox_nogui/run' --cpu_num_threads 1 &> /dev/null &

# 動作チェック 30秒起動を待つ
echo '1. start process'
for i in {1..30} ; do
	ver=`curl -s -X GET "127.0.0.1:50021/version"`
	if [ -n "${ver}" ]
	then
		echo "   VoiceVox ${ver} Start!"
		break		
	fi
	sleep 2
done

echo '2. text creation'
No=29
nice -n 20 curl -s \
    -X POST "localhost:50021/audio_query?speaker=${No}" \
    --get --data-urlencode text@text.txt > './_query.json'

echo '3. voice generation'
nice -n 20 curl -s \
    -H "Content-Type: application/json" \
    -X POST -d @_query.json \
    "localhost:50021/synthesis?speaker=${No}" \
    > './_voice.wav' && killall run

# 動画作成
echo '4. video creation'
ffmpeg -y -loop 1 -r 15 \
	-i ./img.bmp -i ./_voice.wav -vcodec libx264 \
	-acodec mp3 -strict experimental -ab 320k -ac 2 -ar 48000 \
	-pix_fmt yuv420p -shortest './_movie.mp4'

echo '5. completion'
#

【実行/ダウンロード】

上記のスクリプトを、 makeMovie.sh に保存する。
同じフォルダに、動画用のための画像の img.bmp、しゃべってもらう文章を text.txtに入力。
で、端末を立ち上げて、実行。

  1. start process
    VoiceVox “0.14.6” Start!
  2. text creation
  3. voice generation
  4. video creation
    (中略 ffmpeg の動画変換出力)
  5. completion

【その他】

スクリプト中の、No=29 は、ナンバーセブン というキャラクタです。

詳しくは、Helpから。

usage: run [-h] [–host HOST] [–port PORT] [–use_gpu]
[–voicevox_dir VOICEVOX_DIR] [–voicelib_dir VOICELIB_DIR]
[–runtime_dir RUNTIME_DIR] [–enable_mock]
[–enable_cancellable_synthesis] [–init_processes INIT_PROCESSES]
[–load_all_models] [–cpu_num_threads CPU_NUM_THREADS]
[–output_log_utf8]
[–cors_policy_mode {CorsPolicyMode.all,CorsPolicyMode.localapps}]
[–allow_origin [ALLOW_ORIGIN [ALLOW_ORIGIN …]]]
[–setting_file SETTING_FILE]

VOICEVOX のエンジンです。

optional arguments:
-h, –help show this help message and exit
–host HOST 接続を受け付けるホストアドレスです。
–port PORT 接続を受け付けるポート番号です。
–use_gpu 指定するとGPUを使って音声合成するようになります。
–voicevox_dir VOICEVOX_DIR
VOICEVOXのディレクトリパスです。
–voicelib_dir VOICELIB_DIR
VOICEVOX COREのディレクトリパスです。
–runtime_dir RUNTIME_DIR
VOICEVOX COREで使用するライブラリのディレクトリパスです。
–enable_mock 指定するとVOICEVOX COREを使わずモックで音声合成を行います。
–enable_cancellable_synthesis
指定すると音声合成を途中でキャンセルできるようになります。
–init_processes INIT_PROCESSES
–load_all_models 指定すると起動時に全ての音声合成モデルを読み込みます。
–cpu_num_threads CPU_NUM_THREADS
音声合成を行うスレッド数です。指定しないと、代わりに環境変数VV_CPU_NUM_THREADSの値が使われ
ます。VV_CPU_NUM_THREADSが空文字列でなく数値でもない場合はエラー終了します。
–output_log_utf8 指定するとログ出力をUTF-8でおこないます。指定しないと、代わりに環境変数
VV_OUTPUT_LOG_UTF8 の値が使われます。VV_OUTPUT_LOG_UTF8
の値が1の場合はUTF-8で、0または空文字、値がない場合は環境によって自動的に決定されます。
–cors_policy_mode {CorsPolicyMode.all,CorsPolicyMode.localapps}
CORSの許可モード。allまたはlocalappsが指定できます。allはすべてを許可します。locala
ppsはオリジン間リソース共有ポリシーを、app://.とlocalhost関連に限定します。その他のオリジ
ンはallow_originオプションで追加できます。デフォルトはlocalapps。
–allow_origin [ALLOW_ORIGIN [ALLOW_ORIGIN …]]
許可するオリジンを指定します。スペースで区切ることで複数指定できます。
–setting_file SETTING_FILE
設定ファイルを指定できます。

【2024年】マイクロソフトのOneNoteで、「ノートブックを取得できません」と出る件

目次

  • 「ノートブックを取得できません」と出る
  • 原因は、アカウントの凍結
  • まとめ
  • 追記:無事に凍結解除

【2024年】マイクロソフトのOneNoteで、「ノートブックを取得できません」と出る件

まず、当方は、LinuxのOneNoteがインストール済み。
非公式なはずなので、Linux版のソフトの不具合かと思い、ブラウザで試してみる。

それでも、

申し訳ございません。現在、ノートブックを取得できません。後でもう一度お試しください。

のエラーが出る。

検索したら、ノート自体がないことが原因らしい。
しかし、ブラウザからは、新しくノートを追加する方法が、見当たらない。

ので、AndroidアプリのOneNoteにアクセスしたら、OneDriveにアクセスしろと。
言われたとおりにアクセスすると、

原因は、アカウントの凍結だった

「しばらく使っていなかったために、アカウントが凍結された」とのこと。

ああ、マイクロソフトのアカウントが、しばらく使ってなかったから、凍結されていたのですね。

分かりづらい!

アカウント凍結の解除には、長くて、24時間、丸一日かかるよ!と言われたので、待つことにする。

復元するといいなー。

まとめ

結論:「ノートブックを取得できません」と出るのは、ノートがないか、アカウント凍結されている。
解決:Androidアプリから、凍結解除に。
ブラウザから、凍結のアナウンスがあっても良さそうだけど、調査不足だったのかも?

追記:無事に凍結解除

無事に凍結解除できました。
待つこと、数分、無事にアカウント凍結の解除ができ、ブラウザからアクセス出来るようになりました。
過去に作ったノート自体は、凍結されても残っている。
これで、Evernoteから、移行を開始しようかと思ってます。

URLをコピーしました!