この記事では、「Node.js と Mac の Sayコマンドを組み合わせて、テキストの読み上げを行う」というものです。その際に、1回のコマンド実行で、複数の文章を読み上げるようにしつつ、さらに読み上げの速度の変更も試してみます。
今回の内容を行った背景は、以下のイベント参加時に試作したものが関係しています。
具体的には、Node.js で Vertex AI Gemini API を使った簡易なプログラムを作った際に、API で扱うリクエスト・レスポンスのテキストを、Mac上で簡易な方法で読み上げるようにしてみたい、というものでした。
●Build with AI - Python SDKを触ってみよう @ 仙台 - connpass
https://gdgishinomaki.connpass.com/event/315940/
ちなみに以下のポストの動画が、API でのリクエスト・レスポンスのテキストの内容を、Sayコマンドで読み上げる、という内容を Node.js で実装して動かしてみた時の様子です。
Mac の Sayコマンド
Mac の Sayコマンドは、Mac で標準で使える、テキストの読み上げができるコマンドです。
例えば、以下のコマンドを実行すると、音声読み上げが簡単に行えます。
say "こんにちは"
読み上げ時に利用できる音声
この読み上げをする音声は変更できるのですが、その際に選べる音声のリストは、以下のコマンドで確認できます。
say -v "?"
上記のコマンドを実行した際に表示される結果の一部を以下に掲載します。
自分のデフォルトの環境だと、日本語の読み上げができるのは、以下の 1つのみでした(※日本語に対応した他の音声を、追加することはできるようです)。
Kyoko ja_JP # こんにちは! 私の名前はKyokoです。
読み上げに関するパラメータ
また、Sayコマンドでの読み上げでは、読み上げるスピードなどを変更できます。
以下のやり方を使うと、文章の途中で読み上げのスピードを変更できます。
say "読み上げのテストです。[[rate 220]]この部分ははやく読まれて[[rate 70]]この部分は遅く読まれます。"
また、コマンドで指定した文章全体を、あるスピードで読み上げるという場合は、以下のやり方を使うこともできます。
say -r 220 "この文章ははやく読まれます。"
Node.js で Sayコマンドを使う
それでは上で見てきた Sayコマンドを、Node.js で使ってみます。
Node.js でコマンドを実行するのには、↓こちらを使いました。
●Child process | Node.js v22.1.0 Documentation
https://nodejs.org/api/child_process.html#child_processexecsynccommand-options
以下が、Sayコマンドを 3回実行するプログラムです。
const { execSync } = require("child_process");
execSync('say テスト');
execSync('say '+'読み上げのテストです。[[rate 220]]この部分ははやく読まれて[[rate 70]]この部分は遅く読まれます。');
execSync('say '+'-r 250 この文章ははやく読まれます。');
上記のプログラムを nodeコマンドで実行すると、読み上げが行われるのが確認できます。
参考にしたサイト
●(macOS)sayコマンドの読み上げを動的にカスタマイズする方法
https://zenn.dev/moutend/articles/5f4ab7f51f8a1ea87e8d
●"say" command in Mac.|Nobu
https://note.com/nobuhirosaijo/n/n815a8390e4c5