2024/09/19(木) [n年前の日記]
#1 [linux][ubuntu][python][dtm] 音声合成ソフトespeakを試用
Linux上で音声合成をして鳴らすことができる、espeak というプログラムがある。Python + pyttsx3 で音声合成する時に呼び出されるのだとか。VMware + Ubuntu Linux 20.04 LTS や、実機上の Ubuntu Linux 22.04 LTS上ででインストールして試用してみた。
Ubuntu Linux 20.04 LTS の場合、espeak 1.48.04 が、22.04 LTS の場合、espeak 1.48.15 が入った。
libespeak1 というパッケージもインストールされる。pyttsx3 を利用する時は、このパッケージが必要になるらしい。
_Debian -- bookworm の libespeak1 パッケージに関する詳細
_Debian -- パッケージのファイル一覧: libespeak1/bookworm/amd64
espeak はメジャーな言語(英語等)しかサポートしてなくて、日本語はサポートされていない。日本語も利用したい時は、espeak-ng を使うといいらしい。espeak をアンインストールしてから、espeak-ng をインストールしてみた。
Ubuntu Linux 20.04 / 22.04 LTS上では espeak-ng 1.50 が入った。
◎ インストール :
sudo apt install espeak libespeak-dev
Ubuntu Linux 20.04 LTS の場合、espeak 1.48.04 が、22.04 LTS の場合、espeak 1.48.15 が入った。
libespeak1 というパッケージもインストールされる。pyttsx3 を利用する時は、このパッケージが必要になるらしい。
_Debian -- bookworm の libespeak1 パッケージに関する詳細
_Debian -- パッケージのファイル一覧: libespeak1/bookworm/amd64
espeak はメジャーな言語(英語等)しかサポートしてなくて、日本語はサポートされていない。日本語も利用したい時は、espeak-ng を使うといいらしい。espeak をアンインストールしてから、espeak-ng をインストールしてみた。
sudo apt purge espeak libespeak-dev libespeak1 sudo apt install espeak-ng libespeak-ng-dev libespeak-ng1
Ubuntu Linux 20.04 / 22.04 LTS上では espeak-ng 1.50 が入った。
◎ 動作確認 :
使い方は以下。
機械的な男性の声で、「ハローワールド」と喋ってくれた。
声の種類というか言語の指定は「-v hoge」をつける。また、男女の声を選び分ける時は、言語指定の後に、「+m2」「+f2」等をつける。「+f1」から「+f4」まで指定して、声質が変わることを確認した。
また、「-s xxx」をつけることで、速度が変わる。デフォルトは175、らしい? 一定時間に何語喋るかを指定するそうで、指定した数値が少なければ遅くなり、多ければ早くなる。
espeak, espeak-ng で、英語、かつ、女性の声を指定するなら以下になる。
espeak と espeak-ng で、言語指定時の文字列が違っているのがちょっと面倒かもしれない。
一応、選択できる言語の種類を出力してみた。
_voices_espeak.txt
_voices_espeak-ng.txt
espeak "Hello world" or espeak-ng "Hello world"
機械的な男性の声で、「ハローワールド」と喋ってくれた。
声の種類というか言語の指定は「-v hoge」をつける。また、男女の声を選び分ける時は、言語指定の後に、「+m2」「+f2」等をつける。「+f1」から「+f4」まで指定して、声質が変わることを確認した。
また、「-s xxx」をつけることで、速度が変わる。デフォルトは175、らしい? 一定時間に何語喋るかを指定するそうで、指定した数値が少なければ遅くなり、多ければ早くなる。
espeak, espeak-ng で、英語、かつ、女性の声を指定するなら以下になる。
espeak -v "english-us+f2" -s 150 "hello world" or espeak-ng -v "English (America)+f2" -s 150 "hello world"
espeak と espeak-ng で、言語指定時の文字列が違っているのがちょっと面倒かもしれない。
一応、選択できる言語の種類を出力してみた。
_voices_espeak.txt
_voices_espeak-ng.txt
◎ pyttsx3から利用 :
Python + pyttsx3 で利用してみる。VMware + Ubuntu Linux 20.04 LTS上で動作確認した。
ユーザのホームフォルダに pyttsx3 をインストール。
利用できるボイス種類の一覧は、以下で表示できる。
動作確認用スクリプト。
ただ、VMware + Ubuntu Linux 20.04 LTS 上では、音声再生が途中で打ち切られてしまった…。実機なら正常に動作するのだろうか?
実機(Ubuntu Linux 22.04 LTS, Python 3.10.12, pyttsx3 2.97) でもダメだった。やはり音声再生が途中で打ち切られてしまう…。
espeak-ng を単独で呼び出した場合は最後まで再生されるのだけど、pyttsx3 経由だと音声が最後まで流れてくれない。
espeak-ng を使ってるのがマズいのかと、espeak をインストールし直してみたけれど、改善しなかった。
Windows10 x64 22H2 + Python 3.10.10 64bit + pyttsx3 2.97 なら、最後まで再生される。ちなみに Windows10 x64 22H2上で動かすと、Windowsにインストールされてる音声合成エンジン(SAPI5)を使ってくれるらしい。
ユーザのホームフォルダに pyttsx3 をインストール。
python3 -m pip install pyttsx3
利用できるボイス種類の一覧は、以下で表示できる。
import pyttsx3 engine = pyttsx3.init() voices = engine.getProperty('voices') for voice in voices: print(f"Voice: {voice.name}")
動作確認用スクリプト。
import pyttsx3 import time engine = pyttsx3.init() # engine.setProperty("voice", "english-us+f2") engine.setProperty("voice", "English (America)+f2") engine.setProperty("rate", 200) engine.say("hello world. Speaker test. Left, center, right.") engine.runAndWait() time.sleep(2)
ただ、VMware + Ubuntu Linux 20.04 LTS 上では、音声再生が途中で打ち切られてしまった…。実機なら正常に動作するのだろうか?
実機(Ubuntu Linux 22.04 LTS, Python 3.10.12, pyttsx3 2.97) でもダメだった。やはり音声再生が途中で打ち切られてしまう…。
espeak-ng を単独で呼び出した場合は最後まで再生されるのだけど、pyttsx3 経由だと音声が最後まで流れてくれない。
espeak-ng を使ってるのがマズいのかと、espeak をインストールし直してみたけれど、改善しなかった。
Windows10 x64 22H2 + Python 3.10.10 64bit + pyttsx3 2.97 なら、最後まで再生される。ちなみに Windows10 x64 22H2上で動かすと、Windowsにインストールされてる音声合成エンジン(SAPI5)を使ってくれるらしい。
◎ 余談。python3-espeakパッケージ :
Ubuntu Linux (or Debian Linux) では、Python3 から espeak を呼び出せる、python3-espeak というパッケージも用意されているらしい。こちらを使ったら、また違う動作になるのだろうか…?
_Debian -- bookworm の python3-espeak パッケージに関する詳細
_Debian -- bookworm の python3-espeak パッケージに関する詳細
◎ 余談その2。Python 2.7の場合 :
Windows10 x64 22H2 + Python 2.7の場合、pyttsx3 2.6 をインストールしたら動いてくれた。
_pyttsx3 - PyPI
_pyttsx3 - PyPI
pip install pyttsx3==2.6
◎ 参考ページ :
_pyttsx3 - PyPI
_Python で text-to-speach を試してみる - プログラマーのメモ書き
_python - Having problem using 'pyttsx3' on Ubuntu 20.04 - Stack Overflow
_【Python】合成音声pyttsx3使い方-テキストを読み上げ | アリッシアの朝
_eSpeak NG Text-to-Speech|npaka
_Python で text-to-speach を試してみる - プログラマーのメモ書き
_python - Having problem using 'pyttsx3' on Ubuntu 20.04 - Stack Overflow
_【Python】合成音声pyttsx3使い方-テキストを読み上げ | アリッシアの朝
_eSpeak NG Text-to-Speech|npaka
◎ 2024/09/20追記 :
pyttsx3 が正常に動作しない原因が分かった。pyttsx3 2.97 のバグっぽい。
あるいは、espeak-ng をそのまま使うこともできるらしい。libespeak-ng.so.1 を libespeak.so.1 としてリンクを張ればいい模様。
- espeak-ng ではなく、espeak をインストール。
- pyttsx3 をアンインストールして pyttsx3 2.88, 2.91, 2.95 をインストール。
sudo apt purge espeak-ng libespeak* sudo apt install espeak libespeak-dev python -m pip uninstall pyttsx3 python -m pip install pyttsx3=2.95
あるいは、espeak-ng をそのまま使うこともできるらしい。libespeak-ng.so.1 を libespeak.so.1 としてリンクを張ればいい模様。
sudo apt install espeak-ng libespeak-ng-dev libespeak-ng1 cd /usr/lib/x86_64-linux-gnu ln -s libespeak-ng.so.1 libespeak.so.1
[ ツッコむ ]
以上です。