テキストファイルからvoicevoxで音声を作成するスクリプト

テキストファイルからvoicevoxで音声を作成するスクリプト

Dockerマシンの voicevox で音声を作成するときにコマンドを毎回実行は面倒
ということで
Python スクリプトにして
テキストファイルを引数にして
音声を作成するようにする

元は

import subprocess
import pygame
import time

def generate_and_play_audio_from_text(file_path):
    # テキストファイルからテキストを読み込む
    with open(file_path, 'r') as file:
        text = file.read()

    # JSONファイルを作成するためのcurlコマンド
    command_json = [
        "curl", "-s", "-X", "POST",
        "http://{server_ip}/audio_query?speaker=1",
        "--get", "--data-urlencode", f"text={text}"
    ]

    # 音声ファイルを作成するためのcurlコマンド
    command_audio = [
        "curl", "-s", "-H", "Content-Type: application/json", "-X", "POST",
        "-d", "@query.json", "http://{server_ip}/synthesis?speaker=1"
    ]

    # JSONファイルと音声ファイルを作成
    with open('query.json', 'w') as file:
        subprocess.run(command_json, stdout=file)
    with open('audio_output.wav', 'wb') as file:
        subprocess.run(command_audio, stdout=file)

    # Pygameで音声ファイルを再生
    pygame.init()
    pygame.mixer.init()
    sound = pygame.mixer.Sound("audio_output.wav")
    sound.play()
    while pygame.mixer.get_busy():
        time.sleep(0.1)

# email_body.txtから音声を生成して再生
generate_and_play_audio_from_text('email_body.txt')

というgmail本文を抽出したテキストファイルを音声にするコードがあったので
これを改造する

create_voice.py

として

import subprocess
import sys

def generate_and_play_audio_from_text(file_path, server_ip):
    # テキストファイルからテキストを読み込む
    with open(file_path, 'r') as file:
        text = file.read()

    # JSONファイルを作成するためのcurlコマンド
    command_json = [
        "curl", "-s", "-X", "POST",
        f"http://{server_ip}/audio_query?speaker=1",
        "--get", "--data-urlencode", f"text={text}"
    ]

    # 音声ファイルを作成するためのcurlコマンド
    command_audio = [
        "curl", "-s", "-H", "Content-Type: application/json", "-X", "POST",
        "-d", "@query.json", f"http://{server_ip}/synthesis?speaker=1"
    ]

    # JSONファイルと音声ファイルを作成
    with open('query.json', 'w') as file:
        subprocess.run(command_json, stdout=file)
    with open('audio_output.wav', 'wb') as file:
        subprocess.run(command_audio, stdout=file)

    # 音声ファイルを再生
    subprocess.run(["afplay", "audio_output.wav"])

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python script.py <file_path> <server_ip>")
        sys.exit(1)
    
    file_path = sys.argv[1]
    server_ip = sys.argv[2]
    generate_and_play_audio_from_text(file_path, server_ip)

として

python script.py example.txt 192.168.1.5

というように実行すればいけるはず

python create_voice.py voice.txt 192.168.1.69:50021

で実行したら
音声が流れて、音声ファイルも作成された

voicevox でお知らせメッセージの作成

voicevox でお知らせメッセージの作成

新着メールがあった時とかに急に読み上げするのではなく

内容は長文のためPDFをご確認ください

特別支援学校からのお知らせがあります

Voicevoxで作成した音声を流すようにするため
音声の作成

これは
curlで作成できるので

まず

docker run -d  -p '192.168.1.69:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest

でdockerを起動

次に

vim notice.txt

で内容を
特別支援学校からのお知らせがあります

vim notice_pdf.txt


内容は長文のためPDFをご確認ください

として

curl -s -X POST "192.168.1.69:50021/audio_query?speaker=1" --get --data-urlencode text@notice.txt > query.json

でjsonを作成

このjsonを元に

curl -s -H "Content-Type: application/json" -X POST -d @query.json "192.168.1.69:50021/synthesis?speaker=1" > notice.wav    

で音声を作成

同様に

curl -s -X POST "192.168.1.69:50021/audio_query?speaker=1" --get --data-urlencode text@notice_pdf.txt > query.json

でJSON作成

curl -s -H "Content-Type: application/json" -X POST -d @query.json "192.168.1.69:50021/synthesis?speaker=1" > notice_pdf.wav

で音声を作成

支援学校のPDFをダウンロードし
本文をテキストファイルに保存するプログラムは

main3.py

に記述してある

ダウンロード関連は

pdf_downloader.py

Gmailの認証系は

gmail_utils.py

にまとめてある

また認証関連は

token.json

これらと作成したwavファイルを
mail_voiceディレクトリに移動

これで処理を完成させる

とりあえずPDFとgmail本文の取得した文字列はできているので
あとはテキストファイルの読み上げをvoicevoxとするのと
PDFの本文の長さを取得し

docker のVoicevox で再生できるのは100文字程度だった
それ以上なら
音声ファイルを再生しPDFを閲覧するように促す
このためには文字数のカウントをする

まずはPDFの文字列の長さを取得する

M1MacBookAir でVOICEVOX

Windows/Macに入れたVOICEVOXをPython経由で使う方法

ラズパイ等の非力なPCからPythonやcurlで呼び出し使う方法
が載っていた

残念ながら
NVIDIA製のGPUを持っていないので
とりあえずM1Mac で動かしてみて
できるようならラズパイ4から実行してみる

まずはM1Mac で実行

https://voicevox.hiroshiba.jp/how_to_use/
でダウンロードをクリック

OSの選択をするときにMac にすると
CPUのみの選択になる

パッケージは
インストーラを選択

ダウンロード後に起動しようとしたけど
VOICEVOX”は、開発元を検証できないため開けません。
となるため

https://voicevox.hiroshiba.jp/how_to_use/
を参考に
アップルメニューから「システム環境設定」を選択して「セキュリティとプライバシー」 をクリックしこのまま開くをクリックすることで起動

もしくは
Finder で ctrを押しながら開くことでも可能

使い方の細かい説明は
https://voicevox.hiroshiba.jp/how_to_use/
を参考に

とりあえずインストールはできたので
Voicevox core を使うようにする

Raspberry PiでVOICEVOXに可愛くしゃべってもらおう
では
ラズパイで実行しているけど
M1macで実行してるのを調べたら

VOICEVOX ENGINE(API)のスループット検証

インストール先のディレクトリに移動して、以下のコマンドを実行
とあるので
まずはインストール先ディレクトリを探す

https://voicevox.hiroshiba.jp/qa/
によれば
Mac 版

/Applications/VOICEVOX もしくは /Users/(ユーザー名)/Applications/VOICEVOX

とあったけど
Ls コマンドで調べたら

ls -a /Applications/VOICEVOX.app/Contents/MacOS/

でこの中のディレクトリに
Run が入っていた

cd /Applications/VOICEVOX.app/Contents/MacOS 

で移動し

./run

を実行したけど
VOICEVOXを動かしている状態だとエラーになる

以下エラーログ

Warning: cpu_num_threads is set to 0. ( The library leaves the decision to the synthesis runtime )
INFO:     Started server process [43567]
INFO:     Waiting for application startup.
reading /Users/snowpool/Library/Application Support/voicevox-engine/tmpjvxkxzht ... 64
emitting double-array: 100% |###########################################| 

done!
INFO:     Application startup complete.
ERROR:    [Errno 48] error while attempting to bind on address ('127.0.0.1', 50021): address already in use
INFO:     Waiting for application shutdown.
INFO:     Application shutdown complete.

一度VOICEVOXを終了し再度実行

Warning: cpu_num_threads is set to 0. ( The library leaves the decision to the synthesis runtime )
INFO:     Started server process [43611]
INFO:     Waiting for application startup.
reading /Users/snowpool/Library/Application Support/voicevox-engine/tmpnlpnbr_w ... 64
emitting double-array: 100% |###########################################| 

done!
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
    

となり起動したので
http://127.0.0.1:50021
へアクセスしたけど

{"detail":"Not Found"}

となってしまう

chmod 755 run
./run --host 0.0.0.0

の後に
https://0.0.0.0:50021
でアクセスすると
ページを開けません
0.0.0.0:50021はアドレスが無効なため開けません
となる

よく調べたら
http://127.0.0.1:50021/docs
が正解だった

これでAPIドキュメントが表示される