原因は音声データの未インストール
TextToSpeech の speak で音声読み上げに失敗する原因はいろいろあると思いますが、自分がハマったのは、端末に「音声データ」をインストールしていなかったために、ネットワークを無効(オフライン)にしてしまうと音声データがダウンロードできず、音声の読み上げがエラーではなく「無言」になってしまうというトラブル。
てっきり端末に日本語の「音声データ」くらいはインストールされているとばかり思っていたので、この初歩的なミスに何時間もハマってしまった。
もし、アプリを作っていてオフラインで音声読み上げができない場合は、コードのバグはもちろんですが「音声データ」がインストールされているのかを一度確認した方が良いでしょうね。
設定・音声データのインストール方法
1.設定から「システム」を選択。

2.「言語と入力」を選択。

3.一番下の「詳細設定」を選択。

4.一番下の「テキスト読み上げの出力」を選択。

5.「優先するエンジン」の右の「ギヤマーク」を選択。

6.一番上の「音声データをインストール」を選択。

7.言語の一覧から必要なものを選択。
※テスト端末には、日本語(日本)が既にインストールされているので、サンプルとして「広東語(香港)」を選択しています。

8.右のダウンロードマークを選択。

9.ダウンロードとインストールが終わると「ダウンロードマーク」が「ゴミ箱マーク」に変わる。不要になった場合はこの「ゴミ箱マーク」を選択すれば音声言語データは削除されます。

以上です。
何度確認してもコードは間違っていないのに音声読み上げが実行されない・・・という場合は、一度端末にインストールされている「音声データ」を確認してみると良いかもしれません。
END