CUIでTTS(Text-To-Speach)を実行する方法


CUIベースの単語帳を作成していた時に英語の読み上げ機能が使えないか調べていたところMac限定ではありますが使用方法がありましたので記事にします。

環境

  • Mac OS Big Sur 11.2.1
  • Python 3.9.1 (使用する場合)

実行方法

sayコマンド

Macにはsayというコマンドが存在しており、引数に読み上げて欲しい内容を入力すればシステムが読み上げてくれます。

say Hello world

ただし、デフォルトでは日本語話者の"Kyoko"さんが選択されていますので日本語っぽい英語になります。

音声切り替え

日本語話者以外はいないのか?と当然思いますよね。試しに以下のコマンドを実行してください。

say -v ?

すると以下のような結果が取得できると思います。こちらは選択できる話者の一覧で、これを明示的に指定することでネイティブの読み上げを確認することができます。

Alex                en_US    # Most people recognize me by my voice.
Alice               it_IT    # Salve, mi chiamo Alice e sono una voce italiana.
Allison             en_US    # Hello, my name is Allison. I am an American-English voice.
Alva                sv_SE    # Hej, jag heter Alva. Jag är en svensk röst.
Amelie              fr_CA    # Bonjour, je m’appelle Amelie. Je suis une voix canadienne.
Anna                de_DE    # Hallo, ich heiße Anna und ich bin eine deutsche Stimme.
Carmit              he_IL    # שלום. קוראים לי כרמית, ואני קול בשפה העברית.
(以下略)

試しにアメリカ英語のAllisonに読み上げてもらいましょう。

say -v Allison "Hello world"

いかがでしたでしょうか?先ほどとは違い英語話者っぽい発音が確認できたかと思います。

話者追加

では、この一覧以外は使えないのか?と思いますよね。実は追加することが可能です。
実際先ほど使用したAllisonもデフォルトでは一覧に表示されません。

[システム環境設定]→[アクセシビリティ]→[読み上げコンテンツ]

と選択し、話者の選択項目から「カスタマイズ」を選択します。

すると各言語ごとの話者が選択できますので、選択して「OK」を押すと音声データのダウンロードが開始され新たにその話者が使用できるようになります。もちろん先程の一覧にも表示されます。

Python

PythonにはOSのコマンドを実行する機能がありますのでPythonからでもこのコマンドを呼び出すことができます。

say.py
import sys
import subprocess

def pronounce():
    voice = sys.argv[1]
    text = sys.argv[2]
    command = ['say', '-v', f'{voice}', f'{text}']
    cp = subprocess.run(command)
    return cp

if __name__ == '__main__':
    pronounce()

これを以下のように呼び出すことで上記と同じような結果が取得できます。

python say.py Allison "Hello world"

ちなみにreturn cpはしなくても良いのですが単体テストなどをする際にcp.returncodeで実行結果が取得できるので便利です。