마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

음성인식 채팅 어플 개발 문의

0 추천
package com.morp.android;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Launcher extends Activity implements OnClickListener {
 
 public static final String TAG = "SampleVoiceRecognizerActivity";
 public static final String aItem = null;
 
 public static String SERVER_IP = "(ip)";
 public static int SERVER_PORT = (포트);
 
 SpeechRecognizer recognizer;
 
 Button sendButton;
 EditText inputField;
 TextView textView;

 String name;

 Socket socket;
 DataInputStream input;
 DataOutputStream output;

 
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  sendButton = (Button) findViewById(R.id.sendButton);
  inputField = (EditText) findViewById(R.id.inputField);
  textView = (TextView) findViewById(R.id.textView);
  
  sendButton.setOnClickListener(this);
  intro();

  Button startButton = (Button) findViewById(R.id.startButton);
  startButton.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
    startRecognizer();
   }   
  });
  
  Button stopButton = (Button) findViewById(R.id.stopButton);
        stopButton.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
          stopRecognizer();
          
         }
        });
       
        init();
  
 }
 
 private void init() {
  recognizer = SpeechRecognizer.createSpeechRecognizer(this);
  recognizer.setRecognitionListener(new VoiceRecognitionListener());
 }

 private void startRecognizer() {
     Log.d(TAG, "startRecognizer() called.");

     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
         RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
     intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
         "org.androidtown.voice.recognizer");

     recognizer.startListening(intent);

    }

 

    private void stopRecognizer() {
     Log.d(TAG, "stopRecognizer() called.");

     recognizer.stopListening();

    }
 
 @Override
 public void onDestroy() {  
  recognizer.cancel();
  recognizer.destroy();
  try {
   socket.close();
   input.close();
   output.close();   
  } catch (IOException e) {
  }
  super.onDestroy();
 }

 
 class VoiceRecognitionListener implements RecognitionListener {

  @Override
  public void onBeginningOfSpeech() {
   Toast.makeText(getApplicationContext(), "음성인식 시작.", Toast.LENGTH_SHORT).show();

  }

  @Override
  public void onBufferReceived(byte[] buffer) {

  }

  @Override
  public void onEndOfSpeech() {
   Toast.makeText(getApplicationContext(), "음성인식 중지.", Toast.LENGTH_SHORT).show();

  }

  @Override
  public void onError(int error) {
   Toast.makeText(getApplicationContext(), "음성인식 오류.", Toast.LENGTH_SHORT).show();

  }

  @Override
  public void onEvent(int eventType, Bundle params) {

  }

  @Override
  public void onPartialResults(Bundle partialResults) {

  }

  @Override
  public void onReadyForSpeech(Bundle params) {
   Toast.makeText(getApplicationContext(), "음성인식 준비.", Toast.LENGTH_SHORT).show();

  }

  @Override
  public void onResults(Bundle results) {
   Log.d(TAG, "onResults() called.");

   ArrayList<String> outStringList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
   if (outStringList != null) {
    println("음성인식된 결과물 갯수 : " + outStringList.size());
    for (int i = 0; i < outStringList.size(); i++) {
     String aItem = outStringList.get(i);
     println("    결과물 #" + i + " : " + aItem);
    }
   }

  }

  @Override
  public void onRmsChanged(float rmsdB) {

  }

    }
 
 private void println(String message) {
     textView.append(message + "\n");
    }
 
 public void intro() {
  print("운쓰 채팅에 접속하셨습니다! (v1.2 by 류동운)\n");
  print("대화명을 입력하시고 전송 버튼을 눌러주세요.");
 }

 public void print(Object message) {
  textView.append(message + "\n");
 }

 public void onClick(View view) {
  switch (view.getId()) {
  case R.id.sendButton:

   if (inputField.getText().toString() == "")
    return;

   if (name == null) {
    String text = inputField.getText().toString();
    inputField.setText("");
    name = text;
    connect();
   } else {
    String text = inputField.getText().toString();
    inputField.setText("");

    try {
     output.writeUTF("c`" + text);
     output.flush();
    } catch (IOException e) {
     print("메시지 전송을 실패하였습니다.");
    }

   }
   break;
  }
 }

 public void connect() {
  try {

   print(SERVER_IP + ":" + SERVER_PORT + "로 접속중...");

   socket = new Socket(SERVER_IP, SERVER_PORT);

   input = new DataInputStream(socket.getInputStream());
   output = new DataOutputStream(socket.getOutputStream());

   while (socket != null) {
    if (socket.isConnected()) {
     output.writeUTF("r`1`1`" + name + "`");
     output.flush();
     break;
    }
   }

   MessageReciver messageReceiver = new MessageReciver();
   messageReceiver.start();

  } catch (Exception e) {
   print("서버에 접속할 수 없습니다.");
   this.finish();

  }

 }
 
 public String chatMessage;

 public class MessageReciver extends Thread {
  public void run() {
   try {
    String received;

    while ((received = input.readUTF()) != null) {

     String[] buffer = received.split("`");

     switch (buffer[0].charAt(0)) {
     case 'n':
      chatMessage = "★★★" + buffer[1] + "★★★";

      break;
     case 'c':
      chatMessage = buffer[1] + ": " + buffer[2];
      break;
     case 'x':
      chatMessage = "☆☆☆" + buffer[1] + "☆☆☆";
      break;
     }

     Message message = handler.obtainMessage(1, received);

     handler.sendMessage(message);

    }
   } catch (IOException e) {

    e.printStackTrace();
   }
  }
 }

 Handler handler = new Handler() {

  public void handleMessage(Message message) {
   super.handleMessage(message);

   print(chatMessage);

  }
 };

}

 

안녕하세요 안드로이드 어플개발에 입문한 초보 유저인데요

음성인식 채팅을 개발해보려고 인터넷에 돌아다니는 음성인식예제와 채팅예제를 수정하고 조합하고 있는데요..

먼저 각각 따로따로는 성공을 했거든요? 음성인식은 음성을 인식해서 텍스트로 바꿔주고.. 채팅은 자바서버와의 통신으로 채팅도 성공을 했습니다. 그런데 이제 이 두개를 합쳐서 문자 채팅도 되고 음성인식 버튼을 누른뒤에 음성을 텍스트로 변환해서 전송하고 싶은데.. 두가지를 합쳐보았더니 에러는 나지않는데 문자 채팅은 잘됩니다. 그런데 음성인식 버튼을 누르면 무조건 "음성인식 오류" 라는 메세지만 뜹니다.. 어디가 문제일까요?? 코드상으로 에러도 나지않아서 더 감이 안잡히네요..고수님들 조언부탁드립니다. 그리고 super.onDestroy();를 넣었더니 종료할때 에러메시지가 나오는 것을 해결할 수 있었습니다. 하지만 일단 채팅서버에 접속 후 종료하면 에러메시지가 안뜨는데 그냥 어플을 켰다가 바로 끄면 에러메시지가 뜨네요 무슨 오류에 의해 종료되었다고 뜨네요..무슨 문제일까요? 답변 부탁드립니다!!
익명사용자 님이 2013년 8월 26일 질문

1개의 답변

0 추천
에러 로그를 올려주세요
Gradler (109,780 포인트) 님이 2013년 8월 27일 답변
에뮬레이터에서는 음성인식이 지원안되서요 휴대폰으로 직접 어플리캐이션 설치해서 테스트 했는데 에러 로그 못보지 않나요??ㅜㅜ
컴퓨터에 USB로 폰에 연결해서 이클립스에서 직접 빌드 하면 로그 볼 수 있어요~
08-27 11:24:52.990: D/memalloc(28640): ion: Mapped buffer base:0x50a93000 size:1536000 offset:0 fd:71
08-27 11:24:53.130: D/memalloc(28640): ion: Mapped buffer base:0x50d0a000 size:1536000 offset:0 fd:75
08-27 11:25:19.196: D/SampleVoiceRecognizerActivity(28640): startRecognizer() called.
08-27 11:25:19.236: D/memalloc(28640): ion: Mapped buffer base:0x50f8b000 size:73728 offset:0 fd:79
08-27 11:25:21.228: D/memalloc(28640): ion: Unmapping buffer  base:0x50f8b000 size:73728
08-27 11:25:27.424: D/SampleVoiceRecognizerActivity(28640): startRecognizer() called.
08-27 11:25:27.444: D/memalloc(28640): ion: Mapped buffer base:0x50f8b000 size:73728 offset:0 fd:79
08-27 11:25:28.475: D/SampleVoiceRecognizerActivity(28640): startRecognizer() called.
08-27 11:25:29.446: D/memalloc(28640): ion: Unmapping buffer  base:0x50f8b000 size:73728
08-27 11:25:29.456: D/memalloc(28640): ion: Mapped buffer base:0x50f85000 size:73728 offset:0 fd:79
08-27 11:25:31.448: D/memalloc(28640): ion: Unmapping buffer  base:0x50f85000 size:73728
08-27 11:25:34.711: D/SampleVoiceRecognizerActivity(28640): startRecognizer() called.
08-27 11:25:34.741: D/memalloc(28640): ion: Mapped buffer base:0x50f8b000 size:73728 offset:0 fd:79
08-27 11:25:35.272: D/SampleVoiceRecognizerActivity(28640): stopRecognizer() called.
08-27 11:25:35.912: D/SampleVoiceRecognizerActivity(28640): stopRecognizer() called.
08-27 11:25:36.212: D/SampleVoiceRecognizerActivity(28640): stopRecognizer() called.
08-27 11:25:36.423: D/SampleVoiceRecognizerActivity(28640): stopRecognizer() called.
08-27 11:25:36.683: D/SampleVoiceRecognizerActivity(28640): startRecognizer() called.
08-27 11:25:36.863: D/memalloc(28640): ion: Unmapping buffer  base:0x50f8b000 size:73728
08-27 11:25:36.883: D/memalloc(28640): ion: Mapped buffer base:0x50f85000 size:73728 offset:0 fd:79
08-27 11:25:36.893: D/SampleVoiceRecognizerActivity(28640): startRecognizer() called.
08-27 11:25:37.183: D/SampleVoiceRecognizerActivity(28640): stopRecognizer() called.
08-27 11:25:37.354: D/SampleVoiceRecognizerActivity(28640): stopRecognizer() called.
08-27 11:25:37.634: D/SampleVoiceRecognizerActivity(28640): startRecognizer() called.
08-27 11:25:37.774: D/SampleVoiceRecognizerActivity(28640): startRecognizer() called.
08-27 11:25:37.954: D/SampleVoiceRecognizerActivity(28640): stopRecognizer() called.
08-27 11:25:38.124: D/SampleVoiceRecognizerActivity(28640): stopRecognizer() called.
08-27 11:25:38.725: D/memalloc(28640): ion: Unmapping buffer  base:0x50f85000 size:73728
08-27 11:25:38.755: D/memalloc(28640): ion: Mapped buffer base:0x50f85000 size:73728 offset:0 fd:79
08-27 11:25:38.785: W/IInputConnectionWrapper(28640): showStatusIcon on inactive InputConnection
08-27 11:25:38.815: D/memalloc(28640): ion: Unmapping buffer  base:0x50a93000 size:1536000
08-27 11:25:38.815: D/memalloc(28640): ion: Unmapping buffer  base:0x50d0a000 size:1536000
08-27 11:25:39.346: W/System.err(28640): java.net.SocketException: Socket closed
08-27 11:25:39.346: W/System.err(28640):     at libcore.io.Posix.recvfromBytes(Native Method)
08-27 11:25:39.346: W/System.err(28640):     at libcore.io.Posix.recvfrom(Posix.java:131)
08-27 11:25:39.346: W/System.err(28640):     at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
08-27 11:25:39.346: W/System.err(28640):     at libcore.io.IoBridge.recvfrom(IoBridge.java:503)
08-27 11:25:39.346: W/System.err(28640):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
08-27 11:25:39.346: W/System.err(28640):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
08-27 11:25:39.346: W/System.err(28640):     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
08-27 11:25:39.346: W/System.err(28640):     at libcore.io.Streams.readFully(Streams.java:81)
08-27 11:25:39.346: W/System.err(28640):     at java.io.DataInputStream.readShort(DataInputStream.java:169)
08-27 11:25:39.346: W/System.err(28640):     at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:182)
08-27 11:25:39.346: W/System.err(28640):     at java.io.DataInputStream.readUTF(DataInputStream.java:186)
08-27 11:25:39.346: W/System.err(28640):     at com.morp.android.Launcher$MessageReciver.run(Launcher.java:260)
08-27 11:25:39.356: E/SpeechRecognizer(28640): not connected to the recognition service
08-27 11:25:40.777: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:40.787: D/memalloc(28640): ion: Unmapping buffer  base:0x50f85000 size:73728
08-27 11:25:42.739: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:42.769: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:44.741: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:44.751: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:46.743: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:46.763: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:48.735: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:48.755: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:50.747: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:50.757: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:52.749: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:52.759: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:54.751: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:54.771: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:56.763: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:56.773: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:25:58.754: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728
08-27 11:25:58.764: D/memalloc(28640): ion: Mapped buffer base:0x50b97000 size:73728 offset:0 fd:59
08-27 11:26:00.766: D/memalloc(28640): ion: Unmapping buffer  base:0x50b97000 size:73728

확인 부탁드립니다!
...