say コマンド(macOS)を英語学習に活用する

ちょっとした小ネタ。

macOSには標準で音声読み上げ機能が存在している。いわゆるVoice Overというアクセシビリティ機能。

ただ、この機能を常時有効化するのは正直うっとおしい。

視覚補助としての機能とは別に、選択した文字列をを読み上げる機能もある(「設定」→「アクセシビリティ」→「スピーチ」)。

ただし、日本語環境におけるデフォルトは当然日本語音声。

英語音声に設定することもできるけど、音声読み上げ機能を呼び出すためのコマンドが用意されているのでこれを使う。

say コマンドとは

iTermなどの端末エミュレータを起動してsayコマンドを使うことで、任意の文字列を指定した言語で読み上げさせることができる。

基本的な構文は、以下のとおり。

$ say -v 音声名(人名) 読み上げさせたい文字列

読み上げさせたい文字列を指定しない場合は、標準入力からの入力待ちになる。リターンキーを入力するたびに文字列を読み上げるので、連続して読み上げさせるという使い方もできる。-vオプションに指定する引数は、下記のようにすれば確認できる。

$ say -v '?'

bashの場合はシングルクォートなしでも問題はない。この方法だと全言語について表示されてしまうのでgrepでロケールを指定して絞り込む。

$ say -v '?' | grep en_US
Alex                en_US    # Most people recognize me by my voice.
Fred                en_US    # I sure like being inside this fancy computer
Samantha            en_US    # Hello, my name is Samantha. I am an American-English voice.
Victoria            en_US    # Isn't it nice to have a computer that will talk to you?

イギリス英語の音声名を調べたいなら、en_USの代わりにen_GBとすればいい。


読み上げ速度は-rオプションに一分間あたりの単語数(words per minute)*1を整数で指定する。

詳細は端末エミュレータでman sayを実行。

参考:Macのsayコマンドの使い方 - Qiita

その2:say(1) Mac OS X Manual Page

より便利に使う

アメリカ英語については男性音声と女性音声がそれぞれ2人ずつ用意されているので、これを有効活用したい。

一つの単語について1秒間隔で別の音声で読み上げさせるようなスクリプトを作ってみる。

#! /bin/bash

for person in Alex Fred Samantha Victoria ; do
#    echo ${person}
    say -v ${person}  $1
    sleep 1
done


使い方は適当なファイル名(例えばmultisay.shで保存して(要実行権限)、引数に文字列を指定するだけ。

$ multisay.sh 文字列

ハードコーディングは良くないとかエラーチェックが……とかマサカリが飛んできそうだけど気にしない。

真面目にやるなら少なくとも引数の文字列が与えられないケースの考慮が必要。

人名決め打ちの部分(for文のinとセミコロンの間)をいじって、イギリス発音とかオーストラリア発音を混ぜることもできる。

おしまい

普段はスマートフォンの辞書アプリで事足りるのだけど、ごくたまに地域差とか男女差を確認したいケースがあったりする。
そういうケースで(しょぼいけど)微妙に便利。

英語の学習教材だと男性音声・女性音声の両方を収録しているものもあるけど、辞書アプリもオンラインの辞書も音声は1パターンしかない。

最近のWindowsはこういう機能はどうなのか知らないが、macOSは標準でこういう機能が利用できるので地味にお得。

普通にオフラインで使えるし。


ではまた。

*1:ネイティヴで180から200wpmらしいがデフォルト値不明