今回は前回に続いてsayコマンドを使ってコンピューターにしゃべらせてみます。sayコマンドはファイルの内容を読み上げることができます。これを利用してWeb上のHTMLファイルをダウンロードし内容を読み上げさせてみましょう。

今回もこれまでのようにサンプルで利用するファイル・ディレクトリはデスクトップのsampleディレクトリとしています。デスクトップにsampleディレクトリがない場合は作成しておいてください。(コマンド入力ならmkdir ~/Desktop/sampleとして作成することができます)

ファイルの内容を読み上げる

 sayコマンドはfオプションを付けると指定したパスにあるテキストファイルの内容を読み上げることができます。カレントディレクトリになるsample1.txtファイルの内容を読み上げるには以下のように指定します。sample1.txtの内容は日本語で「こんにちは」となっています。

say -f ./sample1.txt

長文でも大丈夫ですが、文章の長さによっては読み上げるまでに時間がかかる場合があります。

say -f ./sample2.txt

 読み上げている内容の進捗状況を表示することもできます。この場合は--progressを指定します。

say --progress -f sample2.txt

 -iを指定すれば文章のどの部分を読み上げているかを表示することもできます。ただし、日本語だと正常な表示にはならないようです。

say -i -f sample2.txt

読み上げた音声をオーディオファイルとして保存する

 単純に単語や文章を読み上げるだけでなくオーディオファイルに保存することができます。オーディオファイルに保存できるので映像に合わせて音声解説をする場合にも利用できるでしょう。オーディオファイルとして保存するには-oを指定し、その後に保存するファイル名を指定します。オーディオファイルの形式を指定しない場合はAIFF形式として保存されます。拡張子を省略した場合は対応するオーディオ形式の拡張子が自動的に付加されます。

say -f sample2.txt -o sample2.aiff

 AIFF以外の形式で保存することもできます。どのような形式に対応しているかは以下のようにコマンドを入力します。指定可能な形式が表示されます。

say --file-format \?

コマンドを実行すると以下のように表示されますが、実際には使えない、指定するとエラーになるものもあります。なお、大文字小文字は判別されるので注意してください。

3gp2  3GPP-2 Audio         (.3g2) [Qclp,aac,aace,aacf,aacg,aach,aacl,aacp]
3gpp  3GP Audio            (.3gp) [Qclp,aac,aace,aacf,aacg,aach,aacl,aacp]
AIFC  AIFC                 (.aifc,.aiff,.aif) [lpcm,ulaw,alaw,ima4,Qclp]
AIFF  AIFF                 (.aiff,.aif) [lpcm]
BW64  WAVE (BW64 for length over 4 GB) (.wav) [lpcm,ulaw,alaw]
NeXT  NeXT/Sun             (.snd,.au) [lpcm,ulaw,alaw]
RF64  WAVE (RF64 for length over 4 GB) (.wav) [lpcm,ulaw,alaw]
Sd2f  Sound Designer II    (.sd2) [lpcm]
W64f  Wave64               (.w64) [lpcm,ulaw,alaw]
WAVE  WAVE                 (.wav) [lpcm,ulaw,alaw]
adts  AAC ADTS             (.aac,.adts) [aac,aach,aacp]
caff  CAF                  (.caf) [Qclp,aac,aace,aacf,aacg,aach,aacl,aacp,alac,alaw,flac,ilbc,ima4,lpcm,opus,ulaw]
flac  FLAC                 (.flac) [flac]
loas  LATM/LOAS            (.loas,.latm,.xhe) [aac,aace,aacf,aacg,aach,aacl,aacp]
m4af  Apple MPEG-4 Audio   (.m4a,.m4r) [aac,aace,aacf,aacg,aach,aacl,aacp,alac,flac,lpcm]
m4bf  Apple MPEG-4 AudioBooks (.m4b) [aac,aace,aacf,aacg,aach,aacl,aacp]
mp4f  MPEG-4 Audio         (.mp4) [aac,aace,aacf,aacg,aach,aacl,aacp,alac,flac,lpcm]

MacBook Air(M1/BigSur、IntelMac/Catalina)で試したところ以下の形式では保存できたものの、これ以外の形式はエラーで保存できませんでした。WAVE形式くらいは保存できそうなものですがダメなようです。

AIFC,AIFF,NeXT,Sd2f,adts,caff,flac,m4af,m4bf,mp4f

 MPEG4 Audio形式で保存する場合は以下のように指定します。

say -f sample2.txt --file-format mp4f -o sample2

Web上にあるデータをダウンロードする

 それではWeb上にあるデータをダウンロードしてしゃべらせてみます。Web上にプレーンテキストを用意しておけば簡単ですが、ここは少し頑張ってHTMLファイルをダウンロードし、その中にあるテキストを読み上げさせてみましょう。
 読み上げるHTMLデータですが、この連載の第一回目のものを使います。連載第一回目のURLは以下のようになっています。

なんとなくコマンド 第1回 コマンドを入力するターミナル
https://news.mynavi.jp/techplus/article/natonakucommand-1/

このページのHTMLデータをダウンロードしてみましょう。Web上にあるデータをダウンロードする場合はcurlを使います。現在のmacOSには標準で入っています。 curlのコマンド名の後にダウンロードしたいURLを指定します。

curl https://news.mynavi.jp/techplus/article/natonakucommand-1/

ダウンロードされると画面上にHTMLの内容が出力されます。ざっと見てエラーになっていなければ大丈夫です。
次にHTMLファイルとして現在のディレクトリに保存しておきます。リダイレクトを使ってファイルを保存します。ここでは第一回目の連載なので1.htmlとします。以下のように入力するとカレントディレクトリにHTMLファイルがダウンロードされ1.htmlという名前で保存されます。

curl https://news.mynavi.jp/techplus/article/natonakucommand-1/ >1.html

 このまま読み上げるとHTMLタグも読まれてしまいます。読み上げて欲しいのは本文です。そこでHTMLからプレーンテキストに変換してから読み上げるようにします。
 HTMLからプレーンテキストに変換するにはtextutilを使います。macOSには古くからあるコマンドでプレーンテキストだけでなくワードなどの形式にも変換することができます。textutilも機会があれば取り上げたいと思います。
 textutilでプレーンテキスト形式に変換するにはconvertオプションを指定します。-convertの後にtxtを指定し、その後に変換したいHTMLファイル名(ファイルパス)を指定します。変換後のファイル名は指定しない場合は現在のファイル名の拡張子が自動的に変換フォーマットに合わせて設定されます。変換後のファイル名(ファイルパス)を指定したい場合は-outputを指定し、その後にファイル名を指定します。
 今回は面倒なので自動的にファイル名と拡張子をtextutilに設定してもらいましょう。以下のように入力します。これで1.txtというテキストファイルが生成されます。

textutil -convert txt 1.html

変換され生成されたファイルを確認するとHTMLタグが削除されプレーンテキストになっているのが確認できます。

textutilで変換した際にいろいろなエラーメッセージが表示されています。このエラーメッセージはなくてもよいので、表示しない方がスッキリします。以下のようにすると標準エラー出力を削除してくれます。削除というよりもブラックホールのようにどこかに吸い込まれ消えてしまい二度と戻ってきません。

textutil -convert txt 1.html 2>/dev/null

 テキストファイルにしてしまえばsayコマンドでファイル内容を読み上げるだけです。以下のようにするとHTMLから変換されたテキストを読み上げてくれます。

say -f ./1.txt

しかし、実際に読み上げさせてみると思っていたのとは違った状態になります。とりあえず読み上げを止めるにはcontrolキーを押したままcキーを押します。

多くのWebサイトではHTMLページデータを読み上げて利用するような用途に関しては配慮されていません。sayコマンドに限らずIBMのホームページリーダーなどの読み上げソフトも期待通りには読み上げてくれません。アクセシビリティに配慮したサイトもまれにありますが、現実的には音声利用のためのHTMLページ作成は難しいと思われます。

仕方ないので、ここでは読み上げて欲しい行までを削除して対処することにします。何行目まで削除すればよいか調べましょう。手作業で調べるのでlessを使います。lessで-Nを指定すると行番号をつけて表示してくれます。ちなみにcatコマンドで-nを指定しても行番号が表示されます。catコマンドの場合、lessやmoreと組み合わせることになります。それなら最初からlessを使った方が楽です。

カーソルキーの上下で1行ずつスクロールします。Fキーかスペースキーを押すと1ページ先に進みます。Bキーを押せば1ページ前に戻ります。キーを押しながら見ていくと、どうやら132行目から読み上げさせればよさそうです。終わりは173行目なので、この範囲を抜き出します。

 テキストファイルの指定範囲の行を抜き出すには以前にも使ったsedを利用します。以下のように-nを指定した後に'開始行,終了行p'とし、その後にファイル名を指定します。

sed -n '132,173p' 1.txt

抜き出してしまえば後は簡単です。以下のように|(パイプ)でsayコマンドに渡します。

sed -n '132,173p' 1.txt | say

説明が長くなりましたが、以下の3行でWebからHTMLファイルをダウンロード、プレーンテキストに変換した後に読み上げさせることができるわけです。

curl https://news.mynavi.jp/techplus/article/natonakucommand-1/ >1.html
textutil -convert txt 1.html 2>/dev/null
sed -n '132,173p' 1.txt | say

sayコマンドとcurlコマンド、cronを組み合わせれば起床した時に自動的にニュースや他の人からのメッセージを読み上げさせたりできますし、サーバーの不具合がいくつあったかなどを音声で知ることができます。音声の都合のいいところは聞きながら他の作業ができる点にあります。今一度音声利用を見つめ直してみるのも良いのではないかと思います。

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