質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

WebRTC

WebRTC(Web Real-Time Communication)とは、プラグイン無しでウェブブラウザ間の音声通話・ビデオチャットなどリアルタイムコミュニケーションができるオープンフレームワークです。W3CがAPIレベルで、IETFがプロトコルレベルでそれぞれ標準化が進められています。

Q&A

解決済

1回答

1934閲覧

音声文字変換で出た文字をを相手に送信したい

bjarmstrong

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

WebRTC

WebRTC(Web Real-Time Communication)とは、プラグイン無しでウェブブラウザ間の音声通話・ビデオチャットなどリアルタイムコミュニケーションができるオープンフレームワークです。W3CがAPIレベルで、IETFがプロトコルレベルでそれぞれ標準化が進められています。

0グッド

1クリップ

投稿2021/01/14 11:13

現在、AndroidstudioでSkywayのビデオ通話と音声文字変換を組み合わせたアプリを開発しています。
ビデオ通話と音声文字変換は一つにすることが出来たのですが、変換した文字を通話相手に送るにはどうしたら良いでしょうか。考えられる方法として画面共有やテキストチャットの実装を考えたのですが、変換された文字だけを送ることにはならないので、どうしたらよいかわからずにいます。

MainActivity

1package com.ntt.ecl.webrtc.sample_p2p_videochat; 2import androidx.appcompat.app.AppCompatActivity; 3import android.Manifest; 4//省略 5import io.skyway.Peer.PeerOption; 6 7public class MainActivity extends AppCompatActivity 8 implements View.OnClickListener, RecognitionListener { 9 10 private static final int PERMISSION_RECORD_AUDIO = 1; 11 12 private Button mButton; 13 private TextView mText; 14 private SpeechRecognizer mRecorder; 15 private AlertDialog.Builder mAlert; 16 17 private static final String TAG = MainActivity.class.getSimpleName(); 18 19 20 private static final String API_KEY = "\\\\\\"; 21 private static final String DOMAIN = "\\\\\\"; 22 23 private Peer _peer; 24 private MediaStream _localStream; 25 private MediaStream _remoteStream; 26 private MediaConnection _mediaConnection; 27 28 private String _strOwnId; 29 private boolean _bConnected; 30 31 private Handler _handler; 32 33 @Override 34 protected void onCreate(Bundle savedInstanceState) { 35 super.onCreate(savedInstanceState); 36 37 setContentView(R.layout.activity_main); 38 39 _handler = new Handler(Looper.getMainLooper()); 40 final Activity activity = this; 41 42 43 PeerOption option = new PeerOption(); 44 option.key = API_KEY; 45 option.domain = DOMAIN; 46 _peer = new Peer(this, option); 47 48 49 // OPEN 50 _peer.on(Peer.PeerEventEnum.OPEN, new OnCallback() { 51 @Override 52 public void onCallback(Object object) { 53 54 //省略 55 56 Button btnAction = (Button) findViewById(R.id.btnAction); 57 btnAction.setEnabled(true); 58 btnAction.setOnClickListener(new View.OnClickListener() { 59 @Override 60 public void onClick(View v) { 61 v.setEnabled(false); 62 63 if (!_bConnected) { 64 65 // Select remote peer & make a call 66 showPeerIDs(); 67 } else { 68 69 // Hang up a call 70 closeRemoteStream(); 71 _mediaConnection.close(true); 72 73 } 74 75 v.setEnabled(true); 76 } 77 }); 78 79 Button switchCameraAction = (Button) findViewById(R.id.switchCameraAction); 80 switchCameraAction.setOnClickListener(new View.OnClickListener() { 81 @Override 82 public void onClick(View v) { 83 if (null != _localStream) { 84 Boolean result = _localStream.switchCamera(); 85 if (true == result) { 86 //Success 87 } else { 88 //Failed 89 } 90 } 91 92 } 93 }); 94 95 mButton = (Button) findViewById(R.id.speech_button); 96 mText = (TextView) findViewById(R.id.output_text); 97 98 99 mRecorder = null; 100 101 mAlert = new AlertDialog.Builder(this); 102 mAlert.setTitle("エラー"); 103 mAlert.setPositiveButton("OK", null); 104 105 checkRecordable(); 106 } 107 108 public Boolean checkRecordable() { 109 if (!SpeechRecognizer.isRecognitionAvailable(getApplicationContext())) { 110 111 mText.setText("音声認識が使用できません"); 112 return false; 113 } 114 if (Build.VERSION.SDK_INT >= 23) { 115 if (ActivityCompat.checkSelfPermission(this, 116 Manifest.permission.RECORD_AUDIO) 117 != PackageManager.PERMISSION_GRANTED) { 118 mText.setText("マイクの使用を許可してください"); 119 ActivityCompat.requestPermissions(this, 120 new String[]{ 121 Manifest.permission.RECORD_AUDIO}, 122 PERMISSION_RECORD_AUDIO); 123 return false; 124 } 125 } 126 return true; 127 } 128 129 @Override 130 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 131 switch (requestCode) { 132 case 0: { 133 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 134 startLocalStream(); 135 } else { 136 Toast.makeText(this, "Failed to access the camera and microphone.\nclick allow when asked for permission.", Toast.LENGTH_LONG).show(); 137 } 138 break; 139 } 140 } 141 Log.d("MainActivity", "onRequestPermissionsResult"); 142 143 if (grantResults.length <= 0) { 144 return; 145 } 146 switch (requestCode) { 147 case PERMISSION_RECORD_AUDIO: 148 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 149 mText.setText(""); 150 } else { 151 152 } 153 break; 154 } 155 } 156                  157 //省略 158 159 void updateActionButtonTitle() { 160 _handler.post(new Runnable() { 161 @Override 162 public void run() { 163 Button btnAction = (Button) findViewById(R.id.btnAction); 164 if (null != btnAction) { 165 if (false == _bConnected) { 166 btnAction.setText("Make Call"); 167 } else { 168 btnAction.setText("Hang up"); 169 } 170 } 171 } 172 }); 173 } 174 175 public void stopRecording() { 176 if (mRecorder != null && checkRecordable()) { 177 mRecorder.stopListening(); 178 mRecorder.cancel(); 179 mRecorder.destroy(); 180 mRecorder = null; 181 mButton.setText(getString(R.string.start_speech)); 182 } 183 } 184 185 public void startRecording() { 186 if (mRecorder == null && checkRecordable()) { 187 mText.setText(getString(R.string.prepare_speech)); 188 mRecorder = SpeechRecognizer.createSpeechRecognizer(this); 189 mRecorder.setRecognitionListener((RecognitionListener) this); 190 Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 191 intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 192 RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 193 intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 194 getPackageName()); 195 intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 196 mRecorder.startListening(intent); 197 mButton.setText(getString(R.string.stop_speech)); 198 } 199 } 200 201 @Override 202 public void onClick(View v) { 203 if(v.getId() != R.id.speech_button){ 204 return; 205 } 206 if(mRecorder != null){ 207 stopRecording(); 208 } 209 else{ 210 startRecording(); 211 } 212 } 213 214 @Override 215 public void onReadyForSpeech(Bundle params) { 216 Log.d("MainActivity","onReadyForSpeech"); 217 mText.setText(getString(R.string.ready_speech)); 218 } 219 220 @Override 221 public void onBeginningOfSpeech() { 222 Log.d("MainActivity","onBeginningOfSpeech"); 223 mText.setText(""); 224 } 225 226 @Override 227 public void onBufferReceived(byte[] buffer) { 228 Log.d("MainActivity","onBufferReceived"); 229 } 230 231 @Override 232 public void onRmsChanged(float rmsdB) { 233 Log.d("MainActivity","onRmsChanged"); 234 } 235 236 @Override 237 public void onEndOfSpeech() { 238 Log.d("MainActivity","onEndOfSpeech"); 239 stopRecording(); 240 } 241 242 @Override 243 public void onError(int error) { 244 Log.d("MainActivity","onError.error="+error); 245 mText.setText(getString(R.string.speech_error) + "\nエラーコード:" + error); 246 stopRecording(); 247 } 248 249 @Override 250 public void onEvent(int eventType, Bundle params) { 251 Log.d("MainActivity","onEvent.eventType="+eventType); 252 } 253 254 @Override 255 public void onPartialResults(Bundle partialResults) { 256 Log.d("MainActivity","onPartialResults"); 257 String str = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).get(0); 258 if(str.length() > 0) { 259 mText.setText(str); 260 } 261 } 262 263 @Override 264 public void onResults(Bundle results) { 265 Log.d("MainActivity","onResults"); 266 } 267}

これがメインになります。
なにか少しでも教えていただきたいです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

WebRTCにはデータチャネルの機構があってデータ通信が出来ます。

Skyway自体は使った事ないんですが、データチャネルに関するリファレンスがあったんで実現できるかと思います。まあ、根っこのWebSocket側の仕様を持ってきた感じですね。
https://webrtc.ecl.ntt.com/api-reference/javascript.html
https://webrtc.ecl.ntt.com/android-reference/classio_1_1skyway_1_1_peer_1_1_data_connection.html

また、Mozillaの機能対応マトリクスによるとAndroidは全API対応しているようです。
https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API

なので、onopenonmessageoncloseonerror辺りが実装できればテキストを相手に送ることは可能かと思います。

投稿2021/01/14 19:52

編集2021/01/14 22:36
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問