![](https://habrastorage.org/storage1/f2b2d747/42533279/1968380f/283456be.png)
はじめに
古い映画を見たことがあります。 主人公は電話を使用しました。電話を取り、オペレーターに友人の番号をダイヤルするように頼み、話し始めました。 通話がシンプルになり、電話の外観がとても気に入った。 私はそのような電話を自分で組み立てることにしました。 電話を取り、誰に電話をかけるか、音声が認識されるか、アドレス帳に名前が見つかるか、VoIP通話が行われます。この投稿では、プロジェクトの詳細について説明します。Androidデバイス、IOIOボード、木材およびプラスチックの切断についてです。
結果
なぜ私が特定の決定を下したのかをよりよく理解するために、まず作業の結果を見る価値があります。作成プロセス
コンポーネント
少し調べてから、次のコンポーネントを使用することにしました。
![](https://habrastorage.org/storage1/9c3a064a/605e8925/b4eb6784/66f9cc8e.png)
デバイスケースとしての古い携帯電話 。 古い携帯電話の美学にとても惹かれました。 eBayで電話をかけると、かなり安い電話とケースを見つけました。
![](https://habrastorage.org/storage1/ee70f441/e1e51377/f7f4632e/d505c82f.png)
デバイスの「頭脳」としてのArchos 28 。 私は、小さな価格と主要なコンポーネントの存在に魅了されました:内部メモリ、Wi-Fi、マイクとサウンド出力、800Mhzプロセッサ。
読者は尋ねます:マイクロコントローラとモジュールのセットの問題を解決してみませんか? この携帯電話はより安価で使いやすいように見えます。必要なものはすべて1つのボードに既に組み込まれているだけでなく、Android OSは優れたレベルの抽象化を提供します。 電力消費に問題がないように、デバイスは24時間動作する必要があります。
![](https://habrastorage.org/getpro/geektimes/post_images/d21/94b/f6a/d2194bf6a93be55bdce59cc0a045e8f7.jpg)
「鉄」との相互作用のためのIOIOボード 。 これは、USB経由でデバイスに接続し、「デバッグモードが有効」として電話で認識されます。 Androidプログラムから回線の状態(デジタルとアナログの両方)を読み取り、回線上で信号(デジタルとPWM)を生成できる小さなAPIがあります。
読者は尋ねます:なぜAndroid ADKを使用しないのですか? 悲しいかな、ADKサポートはAndroid 2.3でのみ追加されました。 私の電話は2.2で動作します。
鉄、木材、プラスチック
まず、私は電話を分解し、古代の汚れをきれいにしました。 デバイスは1910年代後半にリリースされたため、十分な汚れがありました。 木材には温かい石鹸水、金属にはWD-40を使用しました。 部品は次のとおりです。
![](https://habrastorage.org/storage1/be4bd337/a7de58fb/e1361c1e/814a4bab.png)
2番目のステップは、Archos 28の準備でした。このデバイスはアマチュアはんだごて用ではありませんが、電源ボタン、マイク、ヘッドフォン、Wi-Fiアンテナに線を引くことはそれほど難しくありませんでした。 古い装置のチューブホルダーには、チューブがオフの場合にラインを地面に閉じる簡単なメカニズムが含まれていました。 少し面倒です、そして結果はここにあります:
![](https://habrastorage.org/storage1/b2d37208/e8a37707/3e9a51fe/21aeeabb.png)
残念ながら、Archos 28というデバイスは、実際には古い箱には収まりませんでした。 電話用の小さな溝を切り、ワイヤー用の穴を開け、ヒンジにカバーをねじ込むために、 Dremelを使用する必要がありました。
![](https://habrastorage.org/storage1/641f3bca/9a8926e1/180f0877/ca8ea940.png)
ある時点で、デスクトップが21世紀から19世紀に戻ったばかりのタイムトラベラーの机に似ていることがわかりました。
![](https://habrastorage.org/storage1/c31be2ce/742264a7/757c1c4f/4dba7490.png)
私は本当に元の電話を続けたかったのです。 リンガーデバイスはほとんど変更できませんでした。古い電磁石とコンデンサがケースのほぼすべてのスペースを占めていました。 そこで、私は自分の通話メカニズムを作ることにしました。 ベルを打つ金属製のボールは、移動可能なプラットフォームに固定されていました。 プラットフォームは、軸上に小さな楕円が取り付けられた小さな電気モーターの動きから前後にスイングしました。 おそらく、これは図でより明確です:
![](https://habrastorage.org/storage1/50d49e54/7eb5edac/dcf4af53/5ab50df8.png)
Inkscapeを使用して図面を作成しました。 Inkscapeを使用することは、私にとって大きな苦痛のように思えたと言わなければなりません。 どこかに非常に高価なアナログがないことを願っています。
図面の準備ができたら、 Ponokoサービスを使用してプラスチック部品を切り取りました。 数週間と詳細が来ます:
![](https://habrastorage.org/storage1/5b85e42e/114ebf1a/93d9c2ca/ab1b1a51.png)
小さな接着剤とこれらのコンポーネントは、永遠にリンガーメカニズムに変わります。
![](https://habrastorage.org/storage1/f1082eb3/97a4d9cf/db5f8fb8/2d7e8309.png)
チップアセンブリ
回路は非常にシンプルであることが判明しました。電話機はUSBケーブルを介してIOIOボードに接続されていました。 ボード自体は電話スタンドの接点に直接接続され(電話がハングアップしたかどうかを確認するため)、 TS1220-600Tを介してモーターに接続しました(電話をかけるため)。 アセンブリでの外観は次のとおりです。
![](https://habrastorage.org/storage1/5356209d/99c5f2a7/771f0602/fc2f930e.png)
ケースにどのように収まるか想像できます。
![](https://habrastorage.org/storage1/659b3d6f/c33c7180/4b46472f/0deb80ca.png)
この設計がコプロスに配置されたとき、Wi-Fi接続の品質が大幅に低下したことに注意してください。 そのため、外部Wi-Fiアンテナを購入してはんだ付けする必要がありました。 Archos 28では、UF.Lポートは非常によくマークされています。 この場合のシステムの外観は次のとおりです。
![](https://habrastorage.org/storage1/8d3c87a6/52a2c403/e09227f7/5a80b93a.png)
ワイヤーの出方は次のとおりです。
![](https://habrastorage.org/storage1/c15ce5e4/1fe0c116/c08e481e/6bd62638.png)
ソフトウェア
主なコンポーネント
CMU Sphinxはカーネギーメロン大学のオープンソースプロジェクトです。 システムは、コードファイルと発音ファイル、および言語モデルの2つの部分で構成されています。 コードは、Androidライブラリにコンパイルされます。 プロジェクトのWebサイトには、音声認識エンジンの使用例があります。誰もが独自の発音を持っています。 幸いなことに、CMU Sphinxは必要なものを正確に教えることができます。 20の文章を読み、それらを特定のプログラムで操作すると、認識の品質を大幅に向上させることができます。 さらに、認識エンジンに言語のモデルを提供できます。 これは、特定の単語やフレーズのみを話すことを約束する契約のようなものです。 私の場合、主なフレーズは「call [name]」でした。ここで、[name]はこのリストの要素の1つです。 このようなモデルが存在すると、認識の品質が大幅に向上します。
読者は尋ねる:なぜGoogle Voiceではないのか? 悲しいかな、彼は私の発音を非常によく理解しておらず、ひどく名前を認識しています。
読者は尋ねます:なぜ特別なチップを使用しませんか? 私は長い間このアプローチについて考え、 感覚的ソリューションを見ましたが、あまりにも高価であることが判明しました。 つまり、CMU Sphinxほど問題は少なくなく、品質は同等ですが、お金を払わなければなりません。
「 いいえ、音声ジェネレーター 」-私はこの結論にいくつかの異なる製品を試してみました。 悲しいかな、声は非常に不自然でした。 ある種の死者。 生きている人に、電話が私に伝えることができるすべての可能なフレーズを読むように頼まなければなりませんでした。 さらに、各フレーズを数回読むように頼みました。 このプログラムはフレーズオプションをランダムに選択するため、生きている人の非常に強い錯覚を作り出します。
PJSIPは、SIPスタックのオープンソース実装です。 大まかに言えば、オープンVoIPライブラリです。 ここではすべてが簡単です。あなたはそれを取り出し、コンパイルして使用します。 CSipSimpleプロジェクトは、ライブラリAPI を把握し、それをアプリケーションに正しく統合するのに大いに役立ちました。
読者は尋ねます:なぜSkypeを使用しないのですか? それが最初に欲しかったことです。 さらに、Skype開発者プログラムにサインアップしました。 しかし、残念ながら、Skype開発者プログラムのライセンス契約では、Androidで制御されるデバイスで製品を起動することは許可されていません。 私が見つけたとき、そしてこの投稿を書いたとき、私はかなりわいせつな言葉で大声で誓った。
読者は尋ねます:Androidのビルトインスタックを使用しませんか? 答えは簡単です。SIPサポートはAndroid 2.3でのみ追加されました。 デバイスは2.2で動作します。
作業アルゴリズム
オフフックの場合:- ちょっと待って
- 「数、お願い!」と言います。
- 音声認識を開始
- 「call [name]」というフレーズが認識された場合は先に進み、そうでない場合は「申し訳ありませんが、わかりませんでした」と言って3に進みます。
- 「[名前]に電話しています...」と発声します
- 音声認識を開始
- 「no」または「stop」というフレーズが認識された場合は2に進み、そうでない場合は先に進みます
- ダイヤル番号
- 「発信」と発声します
- 通話が終了するまで待ちます
- 「通話終了」と言います
着信コールが鳴るときは、受話器を取るか、その終わりにコールを終了するか、20秒が経過します。 パターンに応じた呼び出し:call-break-call。
アプリケーション形式
すべてのロジックを実行するサービスと、現在のステータスのみを表示する通常のアプリケーションを作成するのが最も自然に思えました。 サービスは、デバイスの起動時またはアプリケーションの起動時に開始されます。 ソースコードは、Google Codeのプロジェクトにあります 。
おわりに
電話は私の声をよく認識し、呼び出し音を鳴らし、さらには電話を受けます。 どんな質問にも答え、批判や提案に耳を傾けます。