現在、大学の授業でアプリを開発しております。
そのアプリは音声認識とビデオ通話を組み合わせたリアルタイムで音声を文字に変換するアプリです。
二つの機能を実装することは出来たのですが、ビデオ通話を接続すると音声認識が出来なくなり、エラーコード:3と表示されてしまいます。
調べてみたところ、グーグルアプリのダウンロードの際にこのメッセージが表示されているようなのですが、私の開発しているアプリとの関連性が分かりません。
通話の接続をしなければ問題なく音声認識は動いているのでコードのミスではないと思うのですが、
何か解決方法、原因を教えていただけないかと思います。
MainActivity
1public class MainActivity extends AppCompatActivity 2 implements View.OnClickListener, RecognitionListener{ 3 private static final String TAG = MainActivity.class.getSimpleName(); 4 5 //省略 6 private boolean _bConnected; 7 8 private Handler _handler; 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 Window wnd = getWindow(); 13 wnd.addFlags(Window.FEATURE_NO_TITLE); 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 17 }); 18 19 _handler = new Handler(Looper.getMainLooper()); 20 final Activity activity = this; 21 22 _handler = new Handler(Looper.getMainLooper()); 23 24 25 PeerOption option = new PeerOption(); 26 option.key = API_KEY; 27 option.domain = DOMAIN; 28 option.debug = Peer.DebugLevelEnum.ALL_LOGS; 29 _peer = new Peer(this, option); 30 31 32 _peer.on(Peer.PeerEventEnum.OPEN, new OnCallback() { 33 @Override 34 public void onCallback(Object object) { 35 _strOwnId = (String) object; 36 TextView tvOwnId = (TextView) findViewById(R.id.tvOwnId); 37 tvOwnId.setText(_strOwnId); 38 39 if (ContextCompat.checkSelfPermission(activity, 40 Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(activity, 41 Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { 42 ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO}, 0); 43 } else { 44 45 startLocalStream(); 46 } 47 48 } 49 }); 50 _peer.on(Peer.PeerEventEnum.CALL, new OnCallback() { 51 @Override 52 public void onCallback(Object object) { 53 //省略 54 55 closeRemoteStream(); 56 _mediaConnection.close(true); 57 58 } 59 60 v.setEnabled(true); 61 } 62 }); 63 64 65 Button switchCameraAction = (Button) findViewById(R.id.switchCameraAction); 66 switchCameraAction.setOnClickListener(new View.OnClickListener() { 67 @Override 68 public void onClick(View v) { 69 if (null != _localStream) { 70 Boolean result = _localStream.switchCamera(); 71 if (true == result) { 72 73 } else { 74 75 } 76 } 77 78 } 79 }); 80 81 mButton = (Button) findViewById(R.id.speech_button); 82 mText = (TextView) findViewById(R.id.output_text); 83 84 mButton.setOnClickListener(this); 85 86 mRecorder = null; 87 88 mAlert = new AlertDialog.Builder(this); 89 mAlert.setTitle("エラー"); 90 mAlert.setPositiveButton("OK", null); 91 92 checkRecordable(); 93 94 } 95 96 public Boolean checkRecordable() { 97 if (!SpeechRecognizer.isRecognitionAvailable(getApplicationContext())) { 98 99 mText.setText("音声認識が使用できません"); 100 return false; 101 } 102 if (Build.VERSION.SDK_INT >= 23) { 103 if (ActivityCompat.checkSelfPermission(this, 104 Manifest.permission.RECORD_AUDIO) 105 != PackageManager.PERMISSION_GRANTED) { 106 mText.setText("マイクの使用を許可してください"); 107 ActivityCompat.requestPermissions(this, 108 new String[]{ 109 Manifest.permission.RECORD_AUDIO}, 110 PERMISSION_RECORD_AUDIO); 111 return false; 112 } 113 } 114 return true; 115 } 116 117 @Override 118 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 119 switch (requestCode) { 120 //省略 121 break; 122 } 123 } 124 125 @Override 126 protected void onStart() { 127 super.onStart(); 128 129 View decorView = getWindow().getDecorView(); 130 decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); 131 132 Window wnd = getWindow(); 133 wnd.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 134 wnd.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 135 } 136 137 @Override 138 protected void onResume() { 139 super.onResume(); 140 /////省略 141 super.onDestroy(); 142 } 143 144 void startLocalStream() { 145 Navigator.initialize(_peer); 146 MediaConstraints constraints = new MediaConstraints(); 147 _localStream = Navigator.getUserMedia(constraints); 148 Canvas canvas = (Canvas) findViewById(R.id.svLocalView); 149 _localStream.addVideoRenderer(canvas, 0); 150 } 151 152 void setMediaCallbacks() { 153 154 _mediaConnection.on(MediaConnection.MediaEventEnum.STREAM, new OnCallback() { 155 @Override 156 public void onCallback(Object object) { 157 _remoteStream = (MediaStream) object; 158 Canvas canvas = (Canvas) findViewById(R.id.svRemoteView); 159 _remoteStream.addVideoRenderer(canvas, 0); 160 } 161 }); 162 163 //省略 164 165 updateActionButtonTitle(); 166 } 167 168 void showPeerIDs() { 169 if ((null == _peer) || (null == _strOwnId) || (0 == _strOwnId.length())) { 170 //省略 171 } else { 172 Toast.makeText(fContext, "PeerID list (other than your ID) is empty.", Toast.LENGTH_SHORT).show(); 173 } 174 } 175 }); 176 177 } 178 void updateActionButtonTitle() { 179 _handler.post(new Runnable() { 180 @Override 181 public void run() { 182 Button btnAction = (Button) findViewById(R.id.btnAction); 183 if (null != btnAction) { 184 if (false == _bConnected) { 185 btnAction.setText("Make Call"); 186 } else { 187 btnAction.setText("Hang up"); 188 } 189 } 190 } 191 }); 192 } 193 public void stopRecording() { 194 //省略 195 196 mButton.setText(getString(R.string.stop_speech)); 197 } 198 } 199 200 @Override 201 public void onClick(View v) { 202 if(v.getId() != R.id.speech_button){ 203 return; 204 } 205 if(mRecorder != null){ 206 stopRecording(); 207 } 208 else{ 209 startRecording(); 210 } 211 } 212 213 @Override 214 public void onReadyForSpeech(Bundle params) { 215 Log.d("MainActivity","onReadyForSpeech"); 216 mText.setText(getString(R.string.ready_speech)); 217 } 218 219 @Override 220 public void onBeginningOfSpeech() { 221 Log.d("MainActivity","onBeginningOfSpeech"); 222 mText.setText(""); 223 } 224 225 @Override 226 public void onBufferReceived(byte[] buffer) { 227 Log.d("MainActivity","onBufferReceived"); 228 } 229 230 @Override 231 public void onRmsChanged(float rmsdB) { 232 Log.d("MainActivity","onRmsChanged"); 233 } 234 235 @Override 236 public void onEndOfSpeech() { 237 Log.d("MainActivity","onEndOfSpeech"); 238 stopRecording(); 239 } 240 241 @Override 242 public void onError(int error) { 243 Log.d("MainActivity","onError.error="+error); 244 mText.setText(getString(R.string.speech_error) + "\nエラーコード:" + error); 245 stopRecording(); 246 } 247 248 @Override 249 public void onEvent(int eventType, Bundle params) { 250 Log.d("MainActivity","onEvent.eventType="+eventType); 251 } 252 253 @Override 254 public void onPartialResults(Bundle partialResults) { 255 Log.d("MainActivity","onPartialResults"); 256 String str = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).get(0); 257 if(str.length() > 0) { 258 mText.setText(str); 259 } 260 } 261 262 @Override 263 public void onResults(Bundle results) { 264 Log.d("MainActivity","onResults"); 265 } 266 267}
下の二つのURLを組み合わせています。
省略部分はURLのものと同じです。
https://www.servernote.net/article.cgi?id=android-voice-to-text
https://webrtc.ecl.ntt.com/documents/android-sdk.html#%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB
よろしくお願いいたします。
あなたの回答
tips
プレビュー