今回は前回に続いて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以外の形式で保存することもできます。どのような形式に対応しているかは以下のようにコマンドを入力します。指定可能な形式が表示されます。
コマンドを実行すると以下のように表示されますが、実際には使えない、指定するとエラーになるものもあります。なお、大文字小文字は判別されるので注意してください。
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を組み合わせれば起床した時に自動的にニュースや他の人からのメッセージを読み上げさせたりできますし、サーバーの不具合がいくつあったかなどを音声で知ることができます。音声の都合のいいところは聞きながら他の作業ができる点にあります。今一度音声利用を見つめ直してみるのも良いのではないかと思います。
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。