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();를 넣었더니 종료할때 에러메시지가 나오는 것을 해결할 수 있었습니다. 하지만 일단 채팅서버에 접속 후 종료하면 에러메시지가 안뜨는데 그냥 어플을 켰다가 바로 끄면 에러메시지가 뜨네요 무슨 오류에 의해 종료되었다고 뜨네요..무슨 문제일까요? 답변 부탁드립니다!!