Sh!t we dislike – I’m Watch

Sh!t we dislike – I’m Watch

The broad introduction of Voice User Interfaces, which allow humans to interaction with computers through voice/speech, may be the next revolution, when it comes to User Interface Engineering and represent an even bigger change, when compared to the transition from text-based to graphical user interfaces. A Voice User Interfaces seems to be especially attractive on smaller devices, like small phones or watches that don’t allow for many buttons or have a touch-screen that is just not big enough, to allow for comfortable interactions.
pebbles
The first generation of watches that connect to smartphone via Bluetooth is now available, most of them are not equipped with a microphone and speaker, i.e. don’t provide a good platform for a Voice User Interface.

  • Pebble, E-Paper Watch for iPhone and Android.
  • Smartwatch, Sony Android watch.
  • MOTOACTV, Motorola GPS Fitness Tracker with MP3 Player.
  • NEXD, The Next-gen Android watch.
  • i’m Watch, i’m SpA, Smartwatch connects via Bluetooth to a phone.

i’m Watch

However, there is i’m SpA, an Italian company, maker of the I’M WATCH, an Android 1.6 powered watch that works as a Bluetooth extension for iPhone and Android phones and comes with microphone and speaker on board.

imwatches

Gestures

I really wanted to like the i’m Watch, but a couple of significant shortcomings became immediately obvious, during the setup process.
There is a delay with all touch and swipe gestures, which we are just not used to anymore. A response often comes delayed and you end up pressing buttons twice. Mainly due to the small display size, gestures seem too sensitive, i.e. minuscule gestures create unexpected effects.
The notification panel, which is heavily used, is too small and therefore hard to access, when dragging it downwards to open it.

Audio Quality

hotspot
Using the watch as an Bluetooth extension for a phone, e.g. to make phone calls, is virtually impossible. The audio quality for both playback and recording is terribly bad.

Internet Access

Most applications running on the Watch need to access the Internet, which means that the smart phone that connects to the watch via Bluetooth, needs to act as hotspot for Bluetooth devices. Enabling this feature on your smartphone requires to upgrade ($$) your dataplan (at least for Verizon and AT&T customers).

Software development

Software development, at least for the purpose I wanted to use the watch for, turned into something close to a nightmare. There are two Android 1.6 images available for the Watch, one has adb enabled, i.e. allows to deploy Android apps, the other one allows to mount the watch as a USB drive – it’s either or. I went with the adb enabled image for developers, but the Watch still doesn’t easily show up with “adb devices”. Instead, one needs to setup a RNDIS network device and hardcode 10.0.0.168 as its ANDROID HOST IP. adb needs to be manally killed and restarted every time the watch gets (re-)connected. Which needs to happens very often, since a DRRS-plug is the only way to tether the watch for deployment, but while connected, the DRRS-plug also shuts-off microphone and speaker.

20130115-IMG_7626

SpeechSynthesis

While android.speech.tts.TextToSpeech was introduced with Android 1.6, there was no implementation provided on the i’m Watch. However, after a little bit of searching around, I came across com.svox.langpack.installer.apk and PicoLangInstaller.apk, which can be installed on the watch (adb install ..). This eventually helped to enable a crummy but still understandable voice output.

//
// TextToSpeech.OnInitListener listener
//

   	@Override
   	public void onInit(int i) {
       	tv.setText("onInit");
       	tts.setPitch(1.2f);
       	tts.setSpeechRate(1.1f);
       	tv.setText("Locale:" + tts.getLanguage().toString());
       	tts.speak("Hello, how are you today?", TextToSpeech.QUEUE_FLUSH, null);
   	}

Since that didn’t take too long, I was optimistic to get SpreechRecognition working as well. However, huge portions of the Android 1.6 SDK are simply missing. E.g. RecognizerIntent is not implemented and MediaRecorder will always fail when prepare() is called. Meaning, I ended up using AudioRecord for the voice recording. Something like so:

private void startRecording() {

        mRecorder = new AudioRecord(
                MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE,
                RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING,
                mBufferSize);

        mRecorder.startRecording();
        isRecording = true;

        mRecordingThread = new Thread("Recording Thread") {
            @Override
            public void run() {
                writeAudioDataToFile();
            }
        };
        mRecordingThread.start();
    }

    /**
     * <code>writeAudioDataToFile</code> writes the raw recording buffer into a temp. file.
     */
    private void writeAudioDataToFile() {
        final byte data[] = new byte[mBufferSize];
        try {
            final OutputStream os = new BufferedOutputStream(new FileOutputStream(getTempFilename()));
            while (isRecording) {
                final int k = mRecorder.read(data, 0, mBufferSize);
                if (k != AudioRecord.ERROR_INVALID_OPERATION) {
                    try {
                        os.write(data, 0, k);
                    } catch (IOException e) {
                        Log.e(LOG_LAG, e.getMessage());
                    }
                }
            }
            try {
                os.flush();
                os.close();
            } catch (IOException e) {
                Log.e(LOG_LAG, e.getMessage());
            }

        } catch (FileNotFoundException e) {
            Log.e(LOG_LAG, e.getMessage());
        }
    }

    private void stopRecording() {
        if (mRecorder != null) {
            isRecording = false;
            mRecorder.stop();
            mRecorder.release();
            mRecorder = null;
            mRecordingThread = null;
        }

        final String wavFile = getFilename();
        copyWaveFile(getTempFilename(), wavFile);
        new File(getTempFilename()).delete();
        // AsyncTask calling SpeechRecognition web service ..
        new NAPI(mHandler).execute(getHttp_Api_Url(), wavFile );
    }

Unfortunately, the sound quality was once again very poor and Nuance’s Web service for Speech Recognition could not render any results. After significantly improving the wav-file using Wiretap Studio on my Mac, Nuance would finally return a result, which wasn’t even too far off. However, even if the improvement could be done on the i’m Watch itself, the total processing time was just way too long that even when considering all optimizations, we would never get into usable range.

20130116-IMG_7630

List of things that won’t work

  • Sensors APIs require special library, which have not been released yet.
  • The i’m Watch has a custom audio system. Android Audio recording/routing APIs are not working (Manufacturer has acknowledged the problem, but no ETA)
  • Speech recognition APIs don’t work due to the previous point.
  • NetworkManager.isConnected() always returns true (Manufacturer has acknowledged the problem, but no ETA)
  • Option menus are not working (UI/UX decision: screen is too small for this) (Manufacturer promised to publish a fix on their GitHub account soon.)
  • Vibration APIs are not working (no vibration motor in the i’m Watch)
  • Input Method Editors are not supported (UI/UX decision: screen is too small for this) (Manufacturer promised to publish a fix for the NumPad at least on their GitHub account soon.)
  • Links that open the web browser are not supported. The web browser is present, but will be removed in a future release (UI/UX decision: screen is too small for this)

Final Verdict

Requested RMA. Returned i’m Watch ..
20130115-IMG_7627

Submit a Comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>