class Jsapi20SpokenInput implements SpokenInput, RecognizerListener {

    @Override
    public void startRecognition(
            final DataModel model,
            final SpeechRecognizerProperties speech,
            final DtmfRecognizerProperties dtmf) throws NoresourceError,
            BadFetchError {
        if (recognizer == null) {
            throw new NoresourceError("recognizer not available");
        }

        if (speech != null) {
            final RecognizerProperties recProbs = recognizer
                    .getRecognizerProperties();

            // confidence
            final float confidence = speech.getConfidencelevel();
            final int scaledConfidence = scale(confidence,
                    RecognizerProperties.MIN_CONFIDENCE,
                    RecognizerProperties.MAX_CONFIDENCE);
            recProbs.setConfidenceThreshold(scaledConfidence);

            // sensitivity
            final float sensitivity = speech.getSensitivity();
            final int scaledSensitivity = scale(sensitivity,
                    RecognizerProperties.MIN_SENSITIVITY,
                    RecognizerProperties.MAX_SENSITIVITY);
            recProbs.setSensitivity(scaledSensitivity);

            // speedvsaccuracy
            final float speedVsAccuracs = speech.getSpeedvsaccuracy();
            final int scaledSpeedVsAccuracy = scale(speedVsAccuracs,
                    RecognizerProperties.MIN_ACCURACY,
                    RecognizerProperties.MAX_ACCURACY);
            recProbs.setSensitivity(scaledSpeedVsAccuracy);

            // completeTimeout
            final long completeTimeout = speech.getCompletetimeoutAsMsec();
            recProbs.setCompleteTimeout((int) completeTimeout);

            // incompleteTimeout
            final long incompleteTimeout = speech.getCompletetimeoutAsMsec();
            recProbs.setIncompleteTimeout((int) incompleteTimeout);

            // maxTimeOut
            // TODO search a corresponding option in JSAPI2
        }

        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("starting recognition...");
        }

        // Add listeners
        currentResultListener = new JVoiceXMLResultListener(this);
        recognizer.addResultListener(currentResultListener);

        // Start the recognition process
        recognizer.requestFocus();
        try {
            recognizer.waitEngineState(Recognizer.FOCUSED);
            recognizer.resume();
            recognizer.waitEngineState(Recognizer.RESUMED);
        } catch (EngineStateException e) {
            throw new NoresourceError(e.getMessage(), e);
        } catch (IllegalArgumentException e) {
            throw new NoresourceError(e.getMessage(), e);
        } catch (IllegalStateException e) {
            throw new NoresourceError(e.getMessage(), e);
        } catch (InterruptedException e) {
            throw new NoresourceError(e.getMessage(), e);
        }

        final SpokenInputEvent event = new RecognitionStartedEvent(this, null);
        fireInputEvent(event);
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("...recognition started");
        }
    }

    public  Jsapi20SpokenInput(final RecognizerMode defaultDescriptor,
            final InputMediaLocatorFactory mediaLocatorFactory);

}