ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

[JB]iOSのプッシュ通知を音声読み上げするSpeakingPushNotification

      2014/08/13

ヘッドフォンだけでプッシュ通知の内容を把握したい

スマートフォンから出る音声を、もっとプッシュ型の情報伝達手段に使ってもいいのではないか、というのが昔からの持論。

そこで、iOSのプッシュ通知を音声読み上げするJailbreak Tweak、SpeakingPushNotificationというものを作ってみました。

動画は、以下のメンションを読み上げています。(続きは[Read More]から)


SpeakingPushNotification

SpeakingPushNotificationは、iOSのプッシュ通知を音声合成で読み上げるためのJailbreak Tweakです。

持って生まれた制約について

しゃべらせるとミュージックアプリのiPod機能の再生等が止まるので、SpeakingPushNotificationで調停してポーズ/再開処理をしていますが、対処しているのはミュージックアプリのiPod機能だけです。

また、ミュージックアプリのiPod機能のポーズ/再開処理も完璧でなく、不整合が起きる場合がありますが、これ以上きめ細やかに制御するつもりはありません。

しゃべらせることと他のオーディオ再生が排他なので、どうしても限界があります。

前提となる設定について

プッシュ通知のバナー表示を利用しているので、これを非表示にすると読み上げられません。

設定項目

SpeakingPushNotificationをインストールすると「設定>SpeakingPushNotification」が出現します。

IMG 0113

  • Mute When From Speaker
    • オンにすると、iPhoneにヘッドフォンを接続していないときに、読み上げを抑止します
  • Voice Volume
    • 読み上げ音声のボリューム
  • Voice Rate
    • 読み上げのスピード
  • Voice Pitch
    • 読み上げ音声の高さ
  • Target Applications
    • 読み上げ対象にするアプリケーション選択(選択しても読み上げが実行されない場合があるようです)

IMG 0114

アプリケーション選択画面は、以下のようになっています。

IMG 0116

  • Pre Process (JavaScript)
    • 読み上げ前に、読み上げ対象のテキストを加工するための設定です。加工にはJavaScriptを使います。ここでは非常に編集しづらいので、テキストエディタで編集してから、ここにペーストすることを想定しています。もっと広い編集領域を確保する方法もあるのですが、なぜかhtmlタグが付加されてしまうので、このようにしています

IMG 0115

変数msgに通知メッセージが入っているので、加工してmsgに戻します。

msg = msg.replace(/@/g, "");

変数idには、通知メッセージを飛ばしてきたアプリのBundle Identifierが入っているので、アプリ別の処理ができます。デフォルト値である以下の例は、Tweetbot3からの通知のメッセージ中のアットマークを削除、の意。

if (id == "com.tapbots.Tweetbot3") {
	msg = msg.replace(/@/g, "");
}

@を消すほかに、やりたいことがあったら縦に連ねて書いていきます。

if (id == "com.tapbots.Tweetbot3") {
	msg = msg.replace(/@/g, "");
	msg = msg.replace(/RT/g, "リツイート");
	msg = msg.replace(/花澤/g, "はなざわ");
	msg = msg.replace(/香菜/g, "かな");
}


例外的なロケール

通常、読み上げはシステムの言語環境に依るので、日本語なら日本語読みされます。

例外的に、読み上げる通知メッセージがASCII文字だけで構成されていた場合は、言語環境に依らず英語で読み上げます。

判定には、NSStringのsmallestEncodingを使っています。

「〜さんからのツイート Hello, World」という読み上げがされている場合は、「Hello, World」の部分が英語でも、日本語読みされます。

こういう場合に英語読みしてほしい場合は、Pre Process (JavaScript)機能でASCII文字じゃないものをつぶしてください。

iPod機能「ミュージック」で再生される曲名、アーチスト名の読み上げ

コメントを寄せていただいたholo_holo氏によれば、TweakのNowListeningとの併用で可能のようです。

「Target Application」で「ミュージック」をオンにします。SpeakingPushNotification Ver.0.0.2以降では曲名も読み上げられます。

「ミュージック」が発行するローカル通知なので、「ミュージック」が前面にある間は通知が表示されないようです。

曲名とアーチスト名はタブ区切りにした(Ver.0.0.3より)ので、読み上げを加工する場合はそれを利用します。

Ver.0.0.4から、NowPlayingアイテムの情報を、各変数から参照できるようにしました。

  • title
    • 曲名
  • artist
    • アーチスト名
  • albumTitle
    • アルバム名

曲名とアーチスト名の間にbyを入れる

if (id == "com.apple.Music") {
	msg = title + " by " + artist;
}

曲名とアーチスト名の順番を逆にする

if (id == "com.apple.Music") {
	msg = artist + ", " + title;
}

アーチスト名削除

if (id == "com.apple.Music") {
	msg = title;
}

全部盛り

if (id == "com.apple.Music") {
	msg = title + " by " + artist + " from " + albumTitle;
}

ほかの処理と共存させる

if (id == "com.apple.Music") {
	msg = title + " by " + artist;
}
if (id == "com.tapbots.Tweetbot3") {
	msg = msg.replace(/@/g, "");
}

JavaScriptからクリップボードに転送する

clipboard変数にテキストを入れておくと、これをクリップボードにコピーします。

JavaScriptで加工するに当たり、通知テキストをテスト用に手元に持ってきたい場合に使うと便利かと。

clipboard =	msg;

APIが公開されたプッシュ通知アプリとの連携

ProwlのようなAPIが公開されたプッシュ通知アプリを使い、サーバから、例えば毎時0分に時刻を知らせるプッシュ通知を送れば、時報になります。

サーバ側でRSS等を監視して、変化があったら通知を送る、といったことをやるのも面白いですね。

Prowl: Growl ClientApp
カテゴリ: Utilities
販売元: Zac West(サイズ: 722 KB)
全てのバージョンの評価: (50 件の評価)

免責

SpeakingPushNotificationは無保証、無サポートです。自己責任でお使いください。

既知の不具合

  • アプリによっては、プッシュ通知が読み上げられないことがある
  • たまに読み上げされないことがある(同時に、音楽再生中だった場合にポーズされたままになる)

動作確認環境

iOS 7.1.2 / iPhone 5s

履歴

  • 0.0.6-1 2014.08.13 クリップボードにundefinedがコピーされる問題に対処
  • 0.0.5-1 2014.08.05 電話中はミュートするように
  • 0.0.4-1 2014.07.19 JavaScriptでエラーが発生したときに、アラートを表示するように、変数clipboardに代入することでのクリップボードへのテキスト転送機能追加、title, artist, albumTitleの各変数から、NowPlayingアイテムの情報を参照可能に
  • 0.0.3-1 2014.07.17 NowListening向けの変更。タイトルとアーチスト名をタブ区切りに
  • 0.0.2-1 2014.07.17 NowListening向けの変更
  • 0.0.1-1 2014.07.17 初版

インストール

いつもの New野良リポジトリ をCydiaに登録後、以下のリンクをタップしてインストールしてください。

インストール後、「設定>SpeakingPushNotification」を設定してください。

SpeakingPushNotificationをCydiaからインストールする

Amazonで買い物してく?

 - iOS, iPad, iPhone, Jailbreak