エンジニアとしての市場価値を測りませんか?PR

企業からあなたに合ったオリジナルのスカウトを受け取って、市場価値を測りましょう

0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Macで選択した文字列を ずんだもん(VOICEVOX)に読み上げさせる - Automatorを使う方法 -

Last updated at Posted at 2025-03-18

はじめに

VOICEVOXは、ずんだもん動画を作るための不真面目なツールとして有名ですが、個人的にはとても実用性の高い日本語読み上げツールだと思っています。

選択した文字列を読み上げさせたい

さて、選択した文字列を右クリックしてVOICEVOXに読み上げさせたいケースはよくあるでしょう。しかし、なかなか「これ」といった方法がありませんでした。

Automatorを使う

そこで安直でありながら高い汎用性を持つと思われる方法として、Automatorを採用します。

まず、Automatorを起動して、新規作成で「クイックアクション」を選びます。これで、右クリックもしくは自分で割り当てたキーボードショートカットから「サービス」に投げられるクイックアクションが作成できます。

Automatorを起動

次に、シェルスクリプトを入力します。ユーティリティから、シェルスクリプトを実行を選択します。

image.png

あとは、こんな感じで一枚にまとめてバチンと貼れば動きます。

image.png

# VOICEVOX エンジンの URL
ENGINE_URL="http://localhost:50021"

# Automator からの標準入力を取得し、URL エンコード
INPUT_TEXT=$(cat)
ENCODED_TEXT=$(echo "$INPUT_TEXT" | jq -sRr @uri)

# 音声合成用クエリの生成
QUERY_JSON=$(curl -s -X POST \
    "${ENGINE_URL}/audio_query?text=${ENCODED_TEXT}&speaker=1" \
    -H "accept: application/json")

# 音声データの生成
OUTPUT_WAV="/tmp/voicevox.wav"
curl -s -X POST "${ENGINE_URL}/synthesis?speaker=1" \
    -H "Content-Type: application/json" \
    -d "${QUERY_JSON}" \
    --output "${OUTPUT_WAV}"

# 音声を再生
afplay "${OUTPUT_WAV}"

# 一時ファイルを削除
rm "${OUTPUT_WAV}"

あとは ファイル → 保存 するだけです。ここで、アクションの名前を求められますので、VOICEVOXで読み上げる とすればよいです。

image.png

これで、全てのMacのアプリケーションで、右クリック → サービス → VOICEVOXで読み上げ でずんだもんが読んでくれるようになりました。もちろん、環境設定 → キーボード → キーボードショートカット → サービス → テキスト から任意のキーボードショートカットを割り当てる事も可能です。

作成されたワークフローは ~/Library/Services/ に保存されます。従って、サービスが不要になった場合は、

rm -r ~/Library/Services/VOICEVOXで読み上げる.workflow

で削除できます。

おまけ1

VOICEVOXが起動していない時は起動させて待つようにChatGPTにスクリプトを書いてもらいました。

# VOICEVOX エンジンの URL
ENGINE_URL="http://localhost:50021"

# VOICEVOX のアプリケーション名
VOICEVOX_APP="VOICEVOX"

# VOICEVOXが起動しているかチェック
if ! pgrep -x "$VOICEVOX_APP" > /dev/null; then
    echo "VOICEVOXが起動していないため、バックグラウンドで起動します..."
    open -a "$VOICEVOX_APP" --background
    
    # エンジンの起動を待機(最大30秒)
    echo "エンジンの起動を待機中..."
    for i in {1..30}; do
        if curl -s --head --request GET "$ENGINE_URL" | grep "200 OK" > /dev/null; then
            echo "VOICEVOXエンジンが起動しました。"
            break
        fi
        sleep 1
    done
fi

# Automator からの標準入力を取得し、URL エンコード
INPUT_TEXT=$(cat)
ENCODED_TEXT=$(echo "$INPUT_TEXT" | jq -sRr @uri)

# 音声合成用クエリの生成
QUERY_JSON=$(curl -s -X POST \
    "${ENGINE_URL}/audio_query?text=${ENCODED_TEXT}&speaker=1" \
    -H "accept: application/json" \
    -d '')

# 音声データの生成
OUTPUT_WAV="/tmp/voicevox.wav"
curl -s -X POST "${ENGINE_URL}/synthesis?speaker=1" \
    -H "Content-Type: application/json" \
    -d "${QUERY_JSON}" \
    --output "${OUTPUT_WAV}"

# 音声を再生
afplay "${OUTPUT_WAV}"

# 一時ファイルを削除
rm "${OUTPUT_WAV}"

おまけ2

せっかくAutomatorを使っているので、以下のように、複数に分割して、標準入力でつなぐことも可能です。

image.png

jq -sRr @uri 
curl -s -X POST \
    "http://localhost:50021/audio_query?text=$(cat)&speaker=1" \
    -H "accept: application/json" \
    -d ''
curl -s -X POST "http://localhost:50021/synthesis?speaker=1" \
    -H "Content-Type: application/json" \
    -d "$(cat)" \
    --output "/tmp/voicevox.wav"
afplay "/tmp/voicevox.wav"
rm "/tmp/voicevox.wav"

こうすると、Automatorを使っているな〜という感じがしますし、途中にいろいろなアクションを挟んで一コマずつ実行することでデバッグしやすくなるかもしれません。

この記事は以上です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Conference 2025 will be held!: 4/23(wed) - 4/25(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

ymrl、Masanobu Naruse, Takeshi Kano, Junichi Ito, uhyo, Hiroshi Tokumaru, MinoDriven, Minorun, Hiroyuki Sakuraba, tenntenn, drken, konifar

View event details
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?