2024/09/18(水) [n年前の日記]
#1 [dtm] 音声合成ソフトVOICEVOXを試用
スピーカーのテストをするための音声データを作りたくなったけれど、自分の声で「Left」「Center」「Right」と吹き込むのはなんか嫌だなと思えてきて、音声合成ソフトを使ってみたくなった。
ググってみたら、VOICEVOXという音声合成ソフトが無料で利用できるらしいと知った。
_VOICEVOX | 無料のテキスト読み上げ・歌声合成ソフトウェア
_VOICEVOX Nemo
特に VOICEVOX Nemo のほうは、何かしらで使った際に「VOICEVOX Nemo」とクレジットを入れておくだけでいいらしい。
_Nemo 利用規約 | VOICEVOX
Windows10 x64 22H2上でインストールして試用してみることにした。
ググってみたら、VOICEVOXという音声合成ソフトが無料で利用できるらしいと知った。
_VOICEVOX | 無料のテキスト読み上げ・歌声合成ソフトウェア
_VOICEVOX Nemo
特に VOICEVOX Nemo のほうは、何かしらで使った際に「VOICEVOX Nemo」とクレジットを入れておくだけでいいらしい。
Nemo の音声ライブラリを用いて生成した音声は、「VOICEVOX Nemo」とクレジットを記載すれば、商用・非商用で利用可能です。
_Nemo 利用規約 | VOICEVOX
Windows10 x64 22H2上でインストールして試用してみることにした。
◎ インストール :
VOICEVOX.Web.Setup.0.20.0.exe を入手して実行。ネットから1.xGBの何かをダウンロードした後、インストール作業が始まる。今回は、現ユーザのみ使用を選んで、D:\Prog\VOICEVOX\ にインストールしてみた。
起動すると、キャラクターの声を選ぶ画面になる。が、設定 → オプション → マルチエンジン機能、を有効にする。ここで一旦終了。
VOICEVOX Nemo のファイル、voicevox_engine-windows-directml-0.20.0.vvpp を入手して、ダブルクリック。警告が出るけどそのまま続行。これで VOICEVOX Nemo のエンジンが、VOICEVOX に追加された。
全部で1.79GBほどストレージ容量を使う模様。
起動すると、キャラクターの声を選ぶ画面になる。が、設定 → オプション → マルチエンジン機能、を有効にする。ここで一旦終了。
VOICEVOX Nemo のファイル、voicevox_engine-windows-directml-0.20.0.vvpp を入手して、ダブルクリック。警告が出るけどそのまま続行。これで VOICEVOX Nemo のエンジンが、VOICEVOX に追加された。
全部で1.79GBほどストレージ容量を使う模様。
◎ 使ってみた感想 :
比較的それらしく喋ってくれて感心してしまった。ビミョーにイントネーションが怪しいところはあるけれど、そのあたりは指示し直して使うことになるのだろう…。
出力されるwavは、モノラル/24KHzらしい。
出力されるwavは、モノラル/24KHzらしい。
[ ツッコむ ]
#2 [python] edge-ttsを試用
英語に対応した音声合成ソフトを使いたいとググっていたら、PythonからMicrosoft Edge経由で音声合成(TTS)を呼び出せる、edge-tts なるモジュールがあると知った。
_Pythonで音声合成 〜edge-ttsを利用して英語の音声ファイルを作成〜 | 東陽テクニカ | “はかる"技術で未来を創る | ワン・テクノロジーズ・カンパニー
_UbuntuやRaspberry Piでも利用可能な音声合成エンジン、Edge-TTSの導入方法 - uepon日々の備忘録
_[Pythonプログラミング]最新のAI音声合成ライブラリEdgeTTSを試してみる : 乙Py先生のプログラミング教室
気になったので試用してみることにした。環境は Windows10 x64 22H2 + Python 3.10.10 64bit。
_Pythonで音声合成 〜edge-ttsを利用して英語の音声ファイルを作成〜 | 東陽テクニカ | “はかる"技術で未来を創る | ワン・テクノロジーズ・カンパニー
_UbuntuやRaspberry Piでも利用可能な音声合成エンジン、Edge-TTSの導入方法 - uepon日々の備忘録
_[Pythonプログラミング]最新のAI音声合成ライブラリEdgeTTSを試してみる : 乙Py先生のプログラミング教室
気になったので試用してみることにした。環境は Windows10 x64 22H2 + Python 3.10.10 64bit。
◎ インストール :
pip でインストール。
色々なモジュールがインストールされた…。
pip install edge-tts
色々なモジュールがインストールされた…。
> pip install edge-tts Collecting edge-tts Downloading edge_tts-6.1.12-py3-none-any.whl.metadata (4.0 kB) Collecting aiohttp>=3.8.0 (from edge-tts) Downloading aiohttp-3.10.5-cp310-cp310-win_amd64.whl.metadata (7.8 kB) Collecting certifi>=2023.11.17 (from edge-tts) Downloading certifi-2024.8.30-py3-none-any.whl.metadata (2.2 kB) Collecting aiohappyeyeballs>=2.3.0 (from aiohttp>=3.8.0->edge-tts) Downloading aiohappyeyeballs-2.4.0-py3-none-any.whl.metadata (5.9 kB) Collecting aiosignal>=1.1.2 (from aiohttp>=3.8.0->edge-tts) Using cached aiosignal-1.3.1-py3-none-any.whl.metadata (4.0 kB) Collecting attrs>=17.3.0 (from aiohttp>=3.8.0->edge-tts) Downloading attrs-24.2.0-py3-none-any.whl.metadata (11 kB) Collecting frozenlist>=1.1.1 (from aiohttp>=3.8.0->edge-tts) Using cached frozenlist-1.4.1-cp310-cp310-win_amd64.whl.metadata (12 kB) Collecting multidict<7.0,>=4.5 (from aiohttp>=3.8.0->edge-tts) Downloading multidict-6.1.0-cp310-cp310-win_amd64.whl.metadata (5.1 kB) Collecting yarl<2.0,>=1.0 (from aiohttp>=3.8.0->edge-tts) Downloading yarl-1.11.1-cp310-cp310-win_amd64.whl.metadata (49 kB) Collecting async-timeout<5.0,>=4.0 (from aiohttp>=3.8.0->edge-tts) Using cached async_timeout-4.0.3-py3-none-any.whl.metadata (4.2 kB) Requirement already satisfied: typing-extensions>=4.1.0 in d:\python\python310-64\lib\site-packages (from multidict<7.0,>=4.5->aiohttp>=3.8.0->edge-tts) (4.5.0) Requirement already satisfied: idna>=2.0 in d:\python\python310-64\lib\site-packages (from yarl<2.0,>=1.0->aiohttp>=3.8.0->edge-tts) (3.4) Downloading edge_tts-6.1.12-py3-none-any.whl (29 kB) Downloading aiohttp-3.10.5-cp310-cp310-win_amd64.whl (379 kB) Downloading certifi-2024.8.30-py3-none-any.whl (167 kB) Downloading aiohappyeyeballs-2.4.0-py3-none-any.whl (12 kB) Using cached aiosignal-1.3.1-py3-none-any.whl (7.6 kB) Using cached async_timeout-4.0.3-py3-none-any.whl (5.7 kB) Downloading attrs-24.2.0-py3-none-any.whl (63 kB) Using cached frozenlist-1.4.1-cp310-cp310-win_amd64.whl (50 kB) Downloading multidict-6.1.0-cp310-cp310-win_amd64.whl (28 kB) Downloading yarl-1.11.1-cp310-cp310-win_amd64.whl (110 kB) Installing collected packages: multidict, frozenlist, certifi, attrs, async-timeout, aiohappyeyeballs, yarl, aiosignal, aiohttp, edge-tts Attempting uninstall: certifi Found existing installation: certifi 2022.12.7 Uninstalling certifi-2022.12.7: Successfully uninstalled certifi-2022.12.7 Successfully installed aiohappyeyeballs-2.4.0 aiohttp-3.10.5 aiosignal-1.3.1 async-timeout-4.0.3 attrs-24.2.0 certifi-2024.8.30 edge-tts-6.1.12 frozenlist-1.4.1 multidict-6.1.0 yarl-1.11.1
◎ 動作確認 :
edge-tts というコマンドと、edge-playback というコマンドが入るらしい。
edge-tts は、音声合成の結果をファイルとして出力する。mp3を出力して動作確認してみる。
hello.mp3、jhello.mp3 が保存された。再生してみたら、たしかに「ハローワールド」「こんにちは世界」と喋ってる。
edge-playback は、その場で音声として鳴らしてくれるけれど、mpv という再生ソフトが必要になるらしい。Ubuntu Linux 20.04 LTS上で mpv をインストールして試してみたけれどたしかに音声がその場で鳴った。しかし、Windowsではどうすればいいんだろう…?
Windows版のmpvもあるらしい。mpv-x86_64-20240918-git-22620af.7z を入手して、解凍して、任意のディレクトリに置いて、環境変数PATHに追加してみたら動作してくれた。
_mpv.io
_mpv_rのインストール方法(Windows)|kwks_workshop
> which edge-tts "D:\Python\Python310-64\Scripts\edge-tts.exe" > which edge-playback "D:\Python\Python310-64\Scripts\edge-playback.exe"
edge-tts は、音声合成の結果をファイルとして出力する。mp3を出力して動作確認してみる。
edge-tts --text "Hello, world!" --write-media hello.mp3 --write-subtitles hello.vtt edge-tts --text "こんにちは、世界" -v ja-JP-NanamiNeural --write-media jhello.mp3 --write-subtitles jhello.vtt
hello.mp3、jhello.mp3 が保存された。再生してみたら、たしかに「ハローワールド」「こんにちは世界」と喋ってる。
edge-playback は、その場で音声として鳴らしてくれるけれど、mpv という再生ソフトが必要になるらしい。Ubuntu Linux 20.04 LTS上で mpv をインストールして試してみたけれどたしかに音声がその場で鳴った。しかし、Windowsではどうすればいいんだろう…?
Windows版のmpvもあるらしい。mpv-x86_64-20240918-git-22620af.7z を入手して、解凍して、任意のディレクトリに置いて、環境変数PATHに追加してみたら動作してくれた。
_mpv.io
_mpv_rのインストール方法(Windows)|kwks_workshop
◎ 音声の種類 :
edge-tts -l または edge-tts --list-voices で、選択できる音声の種類が表示される。めちゃくちゃたくさんあるなと思ったけれど、どうやら言語別で用意されてるようで、実際には男性か女性かぐらいしか選べない感じもする。
日本語に対応しているのは以下だろうか。
英語(en-us)は結構あるな…。男女別で分けると以下のような感じだろうか。
日本語に対応しているのは以下だろうか。
Name: ja-JP-KeitaNeural Gender: Male Name: ja-JP-NanamiNeural Gender: Female
英語(en-us)は結構あるな…。男女別で分けると以下のような感じだろうか。
Gender: Female en-US-AnaNeural en-US-AriaNeural en-US-AvaMultilingualNeural en-US-AvaNeural en-US-EmmaMultilingualNeural en-US-EmmaNeural en-US-JennyNeural en-US-MichelleNeural Gender: Male en-US-AndrewMultilingualNeural en-US-AndrewNeural en-US-BrianMultilingualNeural en-US-BrianNeural en-US-ChristopherNeural en-US-EricNeural en-US-GuyNeural en-US-RogerNeural en-US-SteffanNeural
[ ツッコむ ]
#3 [prog] AIにPythonスクリプトを作成してもらえないか実験
昨日も作業したのだけど、Microsoft Copilot に、Pythonスクリプトを作成してもらえないか試してた。
昨日は何度も修正要求を出して目的のスクリプトに辿り着いたけど、そのあたりをまとめたら以下のプロンプトになった。コレを渡したら、最初からそれらしいスクリプトを生成してくれた。
ちなみに、フツーはEnterを叩くと即座に送信してしまうので改行できないけれど、Shift+Enterで改行できるらしい。あるいは、まとめてコピーして貼り付けるだけでも改行は反映される模様。
生成結果は以下。
コメントで何をしてるか解説してくれているし、イイ感じかもしれない。プロンプト次第で生成結果が結構変わるのだな…。
余談。「すげえ。これならもうプログラマー要らねえじゃん」と言い出す人が出てきそうだけど、Python も tkinter も winsound もプログラマーが作ってくれているからこうして呼び出して利用できるわけで…。それに今回の事例に限って言えば、どのモジュール(ライブラリ)を使うのか、どのオプションを使うのか、そこまで逐一指示しないと、音が鳴り続けて止め方すら分からないダメダメなスクリプトを生成してきたので…。
やはり、ある程度分かってる人が ―― プログラムを書ける程度の知識を持ってる人ならコレを使ってちょっと楽ができそうかも、みたいな状況かなと。Copilot = 副操縦士、という名称はなんだか上手い気がする。
昨日は何度も修正要求を出して目的のスクリプトに辿り着いたけど、そのあたりをまとめたら以下のプロンプトになった。コレを渡したら、最初からそれらしいスクリプトを生成してくれた。
ちなみに、フツーはEnterを叩くと即座に送信してしまうので改行できないけれど、Shift+Enterで改行できるらしい。あるいは、まとめてコピーして貼り付けるだけでも改行は反映される模様。
以下に示す仕様でPythonスクリプトを作成してください。 ・ tkinterとwinsoundを使った、ウインドウサイズが300x140のGUIアプリです。 ・ wavファイルをwinsoud.SND_LOOP指定でループ再生します。 ・ スレッドは使いません。 ・ デフォルトのwavファイル名は「speakertest.wav」です。 ・ アプリを起動すると自動でwavが再生されます。 ・ ボタンをクリックすると再生を停止してボタン表示が「Play」になります。 ・ 再度ボタンをクリックすると再生を開始してボタン表示が「Stop」になります。 ・ ウインドウ上にwavファイル名が表示されます。 ・ ファイル選択ボタンをクリックするとファイル選択ダイアログが開いてwavファイルを選択できます。 ・ Enterキーかスペースキーを押すと再生または停止になります。 ・ ESCキーかQキーを押すとアプリが終了します。 ・ これらの処理をクラスを使わずに記述します。
生成結果は以下。
import tkinter as tk from tkinter import filedialog import winsound # デフォルトのwavファイル名 wav_file = "speakertest.wav" # 再生中かどうかのフラグ is_playing = True # 再生を開始する関数 def play_sound(): global is_playing winsound.PlaySound(wav_file, winsound.SND_LOOP | winsound.SND_ASYNC) button.config(text="Stop") is_playing = True # 再生を停止する関数 def stop_sound(): global is_playing winsound.PlaySound(None, winsound.SND_PURGE) button.config(text="Play") is_playing = False # ボタンがクリックされたときの処理 def toggle_sound(): if is_playing: stop_sound() else: play_sound() # ファイル選択ダイアログを開く関数 def select_file(): global wav_file file_path = filedialog.askopenfilename(filetypes=[("WAV files", "*.wav")]) if file_path: wav_file = file_path label.config(text=wav_file) if is_playing: play_sound() # キーが押されたときの処理 def on_key_press(event): if event.keysym in ["Return", "space"]: toggle_sound() elif event.keysym in ["Escape", "q"]: root.destroy() # ウインドウの設定 root = tk.Tk() root.title("WAV Player") root.geometry("300x140") # ラベルの設定 label = tk.Label(root, text=wav_file) label.pack(pady=10) # ボタンの設定 button = tk.Button(root, text="Stop", command=toggle_sound) button.pack(pady=10) # ファイル選択ボタンの設定 file_button = tk.Button(root, text="Select File", command=select_file) file_button.pack(pady=10) # キーイベントのバインド root.bind("<KeyPress>", on_key_press) # アプリ起動時に再生を開始 play_sound() # メインループの開始 root.mainloop()
コメントで何をしてるか解説してくれているし、イイ感じかもしれない。プロンプト次第で生成結果が結構変わるのだな…。
余談。「すげえ。これならもうプログラマー要らねえじゃん」と言い出す人が出てきそうだけど、Python も tkinter も winsound もプログラマーが作ってくれているからこうして呼び出して利用できるわけで…。それに今回の事例に限って言えば、どのモジュール(ライブラリ)を使うのか、どのオプションを使うのか、そこまで逐一指示しないと、音が鳴り続けて止め方すら分からないダメダメなスクリプトを生成してきたので…。
やはり、ある程度分かってる人が ―― プログラムを書ける程度の知識を持ってる人ならコレを使ってちょっと楽ができそうかも、みたいな状況かなと。Copilot = 副操縦士、という名称はなんだか上手い気がする。
[ ツッコむ ]
以上、1 日分です。