今回はターミナルからコマンドを入力してコンピューターにしゃべらせてみます。



今やコンピューターは様々な処理を行うことができます。昔はテキスト処理がメインだったものが、画像処理ができるようになり、やがて映像や音声、AR,VRなどより高度で複雑な処理が手元のスマートフォンで簡単に扱えるようになりました。

今回はターミナルからコマンドを入力してコンピューターにしゃべらせてみます。都合の良いことにmacOSでは最初からテキストを読み上げるsayコマンドが用意されています。最初から用意されているとインストールの手間もなく簡単ですので、今回はmacOS上でしゃべらせることにします。

この連載もだんだんと1回あたりの文字数が多くなってきたので、今回は短めにいきます。

○コマンドを使う前に

 これから説明するコマンドを実行する前にシステムの環境設定を確認しておきましょう。使用する音声によっては、あらかじめダウンロードしておかないといけません。

 古いMacでは音声コマンド絡みはシステム環境設定のスピーチの項目で設定できます。最近のMacではシステム環境設定のアクセシビリティの項目内にあるスピーチのカテゴリになります。

 読み上げる文章の言語に応じた音声がない場合やバリエーションを増やしたい場合は使いたい音声データをダウンロードする必要があります。日本語の場合は標準では女性の音声Kyokoとなっていますが、男性の音声を利用したい場合はOtoyaの音声データをダウンロードする必要があります。ダウンロードは以下の図のような手順で行います。

システム環境設定を開きます。

カテゴリから読み上げコンテンツをクリックして選択します。

システムの声のポップアップメニューをクリックしカスタマイズ...を選択します。

ダウンロードしたい声にチェックを入れます。OKボタンをクリックします。

ダウンロードが開始されます。

無事にダウンロードが終わったら準備完了です。

○sayコマンド

 sayコマンドはかなり前のバージョンから使えるので、古いマシンを再利用する場合にも役立つかもしれません。例えばシンプルにcronと組み合わせれば目覚まし時計代わりにする事もできます。定時に処理するような場合に限らず、特定の日時に音声で知らせてくれると備忘録がわりにもなります。

 それではsayコマンドで何かしゃべらせてみましょう。ターミナルからsayとだけ入力してください。すると、入力待ち状態になります。

 この状態で文字を入力して最後にリターンキーを押してください。入力した文字が読み上げられます。日本語でも読み上げられます。もし、読み上げられない場合はログインユーザーの言語設定を確認してください。また、日本語ではない場合、対応する言語の音声データが入っていない、ダウンロードされていない場合は読み上げられず無音になります。

単語や文章が駄目な場合は数字を入れてみてください。それでも音声がでない場合は消音状態やボリュームが最小になってるかどうか確認してください。







音声が出るのを確認したらコントロールキーを押したままCキーを押してください。処理が中断されます。



sayコマンドはパラメーターに文字列を指定すると、その文字列を読み上げてくれます。以下のように入力すると「こんにちは」という音声が流れます。読み上げる文章が英語なのか日本語なのかなどは自動判別されるようです。

say こんにちは



○音声を変える

 sayコマンドは日本語環境ではKyokoの音声が流れます。Kyokoは女性の声ですが、これを男性の声であるOtoyaに変えてみましょう。音声を変えるにはvオプションの後に声の名前を指定します。以下のようにするとOtoyaの声で「こんにちは」と音声が流れます。なお、指定した音声をダウンロードしていない場合は動作しません。

say -v Otoya こんにちは



vオプションを省略した場合、日本語環境ではKyokoの声になります。vオプションで指定できる声の種類を確認するには以下のように入力します。すると使用可能な声の種類が表示されます。

say -v \?



対象となる言語に対応する音声の人物名を指定すれば日本語以外も読み上げることが可能です。以下の様にすると中国語で「你好」(ニーハオ)と発声されます。

say -v Ting-Ting 你好



○指定した時間後にしゃべらせる

 次に5秒後とか指定した時間後にしゃべらせてみましょう。UNIX系だと、こういう場合に使用されるのはatコマンドです。(注:通信モデムなどで使われるATコマンドではありません)



 それでは早速macOSでatコマンドを…といきたいところですが、macOSではこのコマンドは使用しないようになってるようです。デフォルトで動かないようになっています。macOSではatコマンドの代わりにlaunchdコマンドを使用するようです。atコマンドの方が簡単なのですが、macOSでは動かすまでに手間がかかるのと、将来的に動かない可能性もあるので別の簡単なコマンドで代用することにします。

 とにかく一定時間後にsayコマンドが実行されればよいので、ここではシンプルなsleepコマンドを使います。sleepコマンドは指定した秒数だけ次のコマンドの処理を待ちます。

macOS (BigSur)でのman sleepの表示

 以下のようにすると5秒後にsayコマンドが実行され音声か流れます。セミコロンで区切ることで複数の命令を一行に書くことができます。

sleep 5;say yes

 Linuxなどではsleepの後の数値に以下の単位をつけると1分や1時間、1日などの指定が可能ですが、macOSのsleepで指定できるのは秒数のみです。ここらへん細かいところですが、Linuxの方が便利だなと思ってしまうところです。

s 秒

m 分

h 時間

d 日

Ubuntuでのman sleepの表示

 ターミナルでsleepコマンドを使うと処理が止まるため、指定した秒数は何もできなくなってしまいます。それでは困る場合はcontrolキーを押したままCキーを押すとシェルに戻ります。

 それならコマンドを入力したらバックグラウンドで処理するように最後に&をつければよさそうに思えます。以下のように入力すると、期待とは違う動作になります。コマンドを入力するとバックグラウンドで動作せずに5秒処理を待ったあとに音声が流れます。

sleep 5;say yes &





 バックグラウンドで動作させるには以下のようにバッククオートで囲み、最後に&をつけます。

`sleep 5;say yes` &

今度は期待通りに動作しました。ただ、秒数や音声メッセージを色々と変えたい場合はシェルスクリプトにしておいた方が便利でしょう。

○シェルスクリプトにする

 それでは最後に指定した時間後に音声が流れるシェルスクリプトを作成します。

 シェルスクリプトでは、秒数とメッセージをパラメータとして受け取り処理することにします。

 ここではsay1.shという名前のシェルスクリプトを作成します。このシェルスクリプトの最初のパラメータに秒数、二番目のパラメータにメッセージを渡します。例えば以下のようにすると3秒後にyesの音声が流れます。

./say1.sh 3 yes

それでは早速シェルスクリプトを作成しましょう。最初の一行目には動作させるシェルを指定します。bashでもzshでも構いません。今回はどちらを指定しても動作します。

2行目はsleepコマンドを指定します。パラメーターはシェルスクリプトに渡された最初の値になるので$1を指定します。

3行目はsayコマンドを指定します。パラメーターはシェルスクリプトに渡された二番目の値になるので$2を指定します。

まとめると以下のようになります。これをテキストエディタで入力し保存します。以下の図はvi(vim)での例です。

#!/bin/bash

sleep $1

say $2





入力したら実行権限を付与しておきます。

chmod +x ./say1.sh



./say1.sh 3 yesと入力して3秒後にyesと音声が流れるか動作確認してみましょう。無事に音声が流れたらOKです。

./say1.sh 3 yes





次にバックグラウンドで処理してみましょう。シェルスクリプトにしてあるので最後に&を付けるだけです。

./say1.sh 3 yes &



3分(180秒)のラーメンタイマーとして使う場合は以下のように入力します。

./say1.sh 180 ラーメンができました &



秒数の指定がない、パラメーターが少ない場合などのエラー処理はまったくありませんので使用する場合は注意してください。自分でわかって使うのであれば無理にエラー処理を入れなくてもよいかもしれません。他の人に使用してもらう場合にはエラー処理やデフォルト処理などを考慮してスクリプトを作成する必要があります。が、本連載は気軽にコマンドを使ってみようという趣旨なので、そこまで突っ込みません。

今回はここまでです。次回はテキストファイルを読み上げさせたりネットからダウンロードしたHTMLファイルの内容を読み上げさせてみます。

著者 仲村次郎

いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。