Reputation: 3015
TL; DR: The reason why it didn't work was because I was running the app on Android 6.0. In 6.0 you have to manually grant the application the permission to access the microphone.
Original post: I wanted to create an ionic app that uses the speechRecognition from https://github.com/macdonst/SpeechRecognitionPlugin
But somehoe it doesn't work?
At first I created an ionic project:
ionic start cordova-speech blank
I went into that new folder and downloaded the plugin:
cordova plugin add https://github.com/macdonst/SpeechRecognitionPlugin
I then added the android platform.
My HTML file:
<body ng-app="starter">
<ion-pane ng-controller="AppCtrl">
<ion-content class="padding">
<button class="button button-full button-positive" ng-click="record()">
Record
</button>
<div class="card">
<div class="item item-text-wrap">
{{recognizedText}}
</div>
</div>
</ion-content>
</ion-pane>
</body>
My app.js file:
angular.module('starter', ['ionic'])
.controller('AppCtrl', function($scope) {
$scope.recognizedText = '';
$scope.record = function() {
alert("step1");
var recognition = new SpeechRecognition();
alert("step2");
recognition.onresult = function(event) {
alert("step3");
if (event.results.length > 0) {
$scope.recognizedText = event.results[0][0].transcript;
$scope.$apply();
}
};
recognition.start();
alert("step4");
};
});
I added some alerts into the code in order to debug (can't debug that feature in the browser). When I press the record button it would only pop up the first and second alert. The issue seems to be with onresult. What did I miss?
I'm using Android 6.0
I did an adb logcat. This is the result:
02-14 03:39:28.109 202 815 D audio_hw_primary: select_devices: out_snd_device(2: speaker) in_snd_device(0: none)
02-14 03:39:28.109 202 815 D msm8974_platform: platform_send_audio_calibration: sending audio calibration for snd_device(2) acdb_id(15)
02-14 03:39:28.109 202 815 D audio_hw_primary: enable_snd_device: snd_device(2: speaker)
02-14 03:39:28.114 202 815 D audio_hw_primary: enable_audio_route: apply and update mixer path: low-latency-playback
02-14 03:39:28.124 26122 26210 D OpenGLRenderer: endAllStagingAnimators on 0x985f7a00 (RippleDrawable) with handle 0x9cace320
02-14 03:39:28.173 779 1396 W InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@eaa7e51 attribute=null, token = android.os.BinderProxy@f80d5f9
02-14 03:39:28.307 189 189 W SurfaceFlinger: couldn't log to binary event log: overflow.
02-14 03:39:29.552 202 815 D audio_hw_primary: out_set_parameters: enter: usecase(1: low-latency-playback) kvpairs: routing=2
02-14 03:39:29.560 26122 26122 I chromium: [INFO:CONSOLE(34)] "initialized", source: file:///android_asset/www/plugins/org.apache.cordova.speech.speechrecognition/www/SpeechRecognition.js (34)
02-14 03:39:29.562 779 1389 W InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@7dff324 attribute=null, token = android.os.BinderProxy@f80d5f9
02-14 03:39:29.569 30081 30096 E RecognitionService: call for recognition service without RECORD_AUDIO permissions
02-14 03:39:29.569 26122 26122 D SpeechRecognition: error speech
02-14 03:39:29.570 26122 26122 W CordovaPlugin: Attempted to send a second callback for ID: SpeechRecognition494458598
02-14 03:39:29.570 26122 26122 W CordovaPlugin: Result was: {"type":"end"}
02-14 03:39:29.570 26122 26122 D cr_Ime : [ImeAdapter.java:213] updateKeyboardVisibility: type [0], flags [0], show [true]
02-14 03:39:29.570 26122 26122 D cr_Ime : [AdapterInputConnection.java:178] updateState [] [0 0] [-1 -1] [true]
02-14 03:39:29.586 202 815 D AudioFlinger: mixer(0xb4180000) throttle end: throttle time(7)
02-14 03:39:29.747 189 189 W SurfaceFlinger: couldn't log to binary event log: overflow.
02-14 03:39:30.796 910 31147 D NotificationMonitor: onNotificationPosted :StatusBarNotification(pkg=com.qihoo.security user=UserHandle{0} id=277 tag=null score=20 key=0|com.qihoo.security|277|null|10720: Notification(pri=2 contentView=com.qihoo.security/0x7f0300d4 vibrate=null sound=null tick defaults=0x0 flags=0x2 color=0x00000000 sortKey=sort_key_00 vis=PRIVATE))
02-14 03:39:30.903 910 31147 D NotificationMonitor: return, onNotificationPosted OWN_PKG_NAME
02-14 03:39:32.721 202 815 D audio_hw_primary: disable_audio_route: reset and update mixer path: low-latency-playback
02-14 03:39:32.721 202 815 D audio_hw_primary: disable_snd_device: snd_device(2: speaker)
UPDATE: I installed
cordova plugin add cordova-plugin-chrome-apps-audiocapture --save
ordova plugin add org.apache.cordova.media
some said I should remove the
<uses-permission android:name="android.permission.RECORD_AUDIO" />
from my speechrecognition and cordova media plugins but it doesn't help either. It now executes the 4th alert but skips alert 3, meaning there is still an issue with the onresult function.
Upvotes: 2
Views: 1619
Reputation: 25220
This line in the log:
02-14 03:39:29.569 30081 30096 E RecognitionService: call for recognition service without RECORD_AUDIO permissions
Tells you need to set permissions to record audio in your application. You can add plugin org.apache.cordova.media
cordova plugin add org.apache.cordova.media
as described here.
Upvotes: 1