ゆるエンジニアはいろいろ遊びたい

FAエンジニアが週末にいろいろ遊ぶブログです

Raspberry Pi5 でPythonスクリプトからAques Talk Piでしゃべらせる

先日ラズパイ5でAquesTalkPiをターミナルから鳴らしたのですが、今回はPythonスクリプトからしゃべらせてみました。
先日のラズパイの環境はいろいろいじった末の環境で、今回の環境は新しくOSをTrixieにした状態であるため、前回ターミナルで実行した際と同じ記述では再生されませんでした。
↓過去記事はこちら!
slowtech.hateblo.jp

./AquesTalkPi "こんにちは" | aplay

これでは、「aplay: main:850: audio open error: 不明なエラーです524」というエラーがでました。これは、再生デバイスが存在しないか占有されている or 占有されているらしいです。
対策としては、再生するデバイスを指定するとよいみたいです。「aplay -l」で再生ハードウェアの一覧がでるので、デバイス番号を指定します。今回は2番のUSBスピーカーにしました。

./AquesTalkPi "こんにちは" | aplay -D hw:2,0

今度は、「モノラル aplay: set_params:1398: チャネル数が使用不可能」と表示され、再生されません。
これはUSBスピーカーがモノラル音源に対応していないエラーらしいので、2chステレオとして再生するようにaplayに指示します。

./AquesTalkPi "こんにちは" | aplay -D plughw:2,0

これでちゃんとしゃべりました。
ここまでできれば、後はpythonスクリプトを書くだけです。
Aques Talk Piは実行モジュールなので、pythonのsubprocessモジュールを使うようです。
コードは以下の通り

import subprocess
import shlex

def speak(text, speed=100, voice_type="f1"):
    """
    AquesTalk Piを使用してテキストを音声合成し再生します。

    :param text: 読み上げたい日本語テキスト
    :param speed: 話速 (50〜300, デフォルト100)
    :param voice_type: 声の種類 (f1〜f8, m1〜m3, 等)
    """
    # AquesTalkPiの実行ファイルへのパスを指定します。
    # インストール場所に応じて適宜変更してください。
    aquestalk_pi_path = "/home/***/Documents/aquestalkpi/AquesTalkPi" 
    
    # コマンドライン引数を構築します。
    # 日本語テキストは標準入力から渡す方法が確実です。
    # パイプ (|) を使用して AquesTalkPi の出力を aplay に渡します。
    command = f"echo {shlex.quote(text)} | {shlex.quote(aquestalk_pi_path)} -s {speed} -v {voice_type} -f - | aplay -D plughw:2,0"
    
    try:
        # shell=Trueを使う場合は、shlex.quoteでエスケープすることが重要です。
        subprocess.run(command, shell=True, check=True)
    except subprocess.CalledProcessError as e:
        print(f"コマンドの実行中にエラーが発生しました: {e}")
    except FileNotFoundError:
        print(f"'{aquestalk_pi_path}' または 'aplay' が見つかりません。パスを確認してください。")

# 使用例
if __name__ == "__main__":
    speak("こんにちわ、AquesTalk Piからの音声合成です。", speed=120, voice_type="f2")
    speak("CPUの温度は25度です。", speed=100)

実行するとちゃんと喋りました。 「command = f"echo {shlex.quote(text)} | {shlex.quote(aquestalk_pi_path)} -s {speed} -v {voice_type} -f - | aplay -D plughw:2,0"」の末尾にある「aplay -D plughw:2,0」の部分が、環境によって変更する必要があります。
事前にターミナルでちゃんと実行できた際の表記をすることでうまくいくみたいです。
このコマンドにオプションを指定するといろいろ変えれます。よく使いそうなのを以下に書きます。

  • v f2:声種f2
  • b:平板アクセント
  • s:話す速さ
  • g:音量
  • p:先頭に無音を追加

上のコードでは話す速さと声種を変えれるように引数を渡せるようにしています。
ゆっくり音声でラズパイが喋れるようになったので、さらに愛でるのが捗りますね。

では。