Macで音声入力の言語を切り替えられるアプリを作りました

新しく作ったMacアプリがAppleの審査に通り、今日App Stroreにリリースされました!OS X Mountain Lionの音声入力の言語をキー入力で切り替えることが出来る”SwitchDictLang“というアプリです。

SwitchDictLang

OS X Mountain Lion から音声入力機能がついてとても便利ですが、音声入力の言語を日本語に設定しているとちょっとした英単語を入力したい時にうまく認識してくれません。

「英語の発音が悪いんじゃないか?」という声もあるかと思いますが、OS X が日本語だと思って認識するので、一番近い発音の日本語と解釈されてしまうのです。

例えば、「MacBook ProやiMacなどアップル製品」という文章は、日本語っぽいべたな発音をするとわりときちんと認識してくれますが、少しでも英語っぽい発音をすると認識してくれません。また、私は「アップル製品」ではなく、「Apple製品」とアルファベットで入力したいのです。「アップル製品」ならまだなんとか耐えられますが、OS Xの「 Mountain Lion」 が「マウンテンライオン」と入力されてしまうと、全く別の製品のような気がして嫌です。

そこで、簡単に音声入力の言語を切り替えられるアプリを作りました。

使い方

初期設定では、左のcommandキーを2回押すと音声入力の言語が英語に変わります。

日本語に戻したい時は、右のcommandキーを2回押します。

アプリが起動すると、Macのメニューバー(ステータスバー)にアイコンが表示されます。キー入力で音声入力の言語を切り替えると、このアイコンの国旗が変わります。このアイコンを見れば、忘れた頃に音声入力しようとして、「今、どの言語に設定されているんだっけ?」と悩む必要がありません。

設定

メニューバーのアイコンをクリックしてプルダウンするメニューから設定画面を開くことができます。

設定画面で、次の設定を行うことが出来ます。

  • キーの割当

左右のcommandキー以外にもoptionキーなどに割り当てることができます。また、最大3つの言語を好きなキーに割り当てることができます。

  • 対象言語

現在、OS X Mountain Lionの音声入力可能な言語は全て割り当てられます。

開発裏話

アプリ作成を思い立ったきっかけ

iPad/iPhone録画対応フルセグTVチューナーを買って以来、ベッドにiPadを置いて録画しておいた番組を見ているのですが、iPadが占有されてしまいます。この視聴アプリは番組を見ながらネットサーフィンが出来るようになっているのですが、他のアプリに切り替えると視聴アプリが終了してしまうので、メモ帳にメモ入力したり他の用途でiPadを使い時に面倒です。

そこで、私は、ベッドにMacBook Proを持ち込みました。ベッドにいるということは寝転んでいるわけで、キータイプするにはとても不自然な姿勢です。

 

OS X Mountain Lionの音声入力は、そんな時にとっても便利です!

さくさくと文章が入力できてしまいます。

しかし、英語がどうしてもきちんと入力されません。

英語だけキータイプするのは面倒です。システム環境設定で音声入力の言語を設定し直せば英語で入力できるようになりますが、これもいちいち設定し直すのが面倒です。

「適当なキーを押したらすぐに好きな言語に切り替えてくれればいいのに!」

そう思ってネットを検索してみたりしたものの、どうやらそんな機能はなさそうです。

「なんて気が利かないんだ!こんな簡単ことなのに!」

「ん?簡単なこと?それなら自分でアプリを作ればいいか。」

そんなわけで、数時間程集中してサクッと作っちゃおうと思い作り始めました。

いざ作り初めて見ると

簡単なはずだったのですが、開発を始めると、Macアプリ開発経験が1年にも満たない私ではすぐに解決できない問題がたくさんでてきました。

「キーの入力ってアプリでどうやって感知するんだろう?」

「メニューバーにアイコンを表示させるのはどうやってやるんだろう?」

などと、おそらく熟練のMacアプリ開発者には基本的であろうことから始まって、

「OS X Mountain Lionの音声入力の言語設定ってどうやってアプリで設定すればいいんだ?」

「ログイン時にアプリを自動的に起動するにはどうすればいいの?」

などと、だんだんとディープな部分の問題にはまっていきました。

そして、そんな問題をどうにかこうにか解決してなんとかアプリっぽくなりました。そうなると、どうせなら他の国の人にも使ってもらおうとOS X Mountain Lionの音声入力で設定可能な全ての言語をサポートするようにしたのですが、そこでまたはたと疑問がわきました。

「他の国の人のMacのキーボードって、もしかしてその国独自の配置?」

恐る恐るネットを検索してみると、万国共通だと思っていたアルファベットの配置が全く違うキー配置のキーボードの存在が浮かび上がってきました。

例えば、フランスなんかだとこんな配列になっているようです。

アルファベットの並びが想定外です。controlキーなどの修飾キーの配置も若干違います。

そこで、修飾キーとなりそうキーをなるべくたくさんサポートすることにしました。

Appleにアプリ申請

そんなこんなで、1週間ほどかかってようやくアプリが完成し、Appleに申請しました。

Macアプリは審査してもらうまでとっても時間がかかります。

半月ほど経つとAppleからRejectされて戻ってきました。クラッシュしたようで、クラッシュダンブが添えられていました。

Process:         SwitchDictLang [27462]
Path:            /Applications/SwitchDictLang.app/Contents/MacOS/SwitchDictLang
Identifier:      com.reirou.SwitchDictLang
Version:         1.0 (1)
Code Type:       X86-64 (Native)
Parent Process:  launchd [146]
User ID:         201

Date/Time:       2012-11-12 13:30:23.213 -0800
OS Version:      Mac OS X 10.8.2 (12C54)
Report Version:  10

Sleep/Wake UUID: C349857F-4B91-4AB9-B5F2-14CF89932DBB

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000

Application Specific Information:
*** CFRelease() called with NULL ***

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   com.apple.CoreFoundation      0x00007fff87a637d8 CFRelease + 40
1   com.reirou.SwitchDictLang     0x000000010ac7fc93 0x10ac7e000 + 7315

ふむふむ、0x000000010ac7fc93番地の処理がまずかったんですね。

「どこやねん!」

ネットを検索してアドレスをメソッド名に変換する方法を試してみたりしたのですが、変換されたメソッドの処理はどう考えてもクラッシュする可能性がない処理です。

そんなことで、クラッシュダンプと悪戦苦闘しながら、なんとかバグを発見して2回目の申請をしました。

そして、今日、審査に通過しました!

審査担当の人が大きな声を出して音声入力しながら審査している姿を想像すると、きっと周りの人から変な目で見られて恥ずかしい思いをしたでしょう。かなり気の毒です。そんな気の毒な審査担当の人には、クラッシュするバグを見付けれくれて、感謝の思いで一杯です。


関連記事

「Macで音声入力の言語を切り替えられるアプリを作りました」への2件のフィードバック

  1. Thanks for great work for this app,I love it.
    But the “National Flag” of Taiwan is just not the right one.

    And now it needs to 2 steps to launch the “音声入力”function.
    (1.Switch languages 2. Launch the function.)

    Is it possible just combine 2 to 1. Thanks.

    1. Thank you for writing comments and requests!
      I’m going to try to implement your requests.

コメントは停止中です。