Tải bản đầy đủ - 0 (trang)
4 Xây dựng ứng dụng demo tên Funny

4 Xây dựng ứng dụng demo tên Funny

Tải bản đầy đủ - 0trang

private void setupRecognitzer(File assetsDir) throws IOException {

// configure recognizer

speechRecognizer = defaultSetup().setAcousticModel(new File(assetsDir,"digit"))

.setDictionary(new File(assetsDir, "digit.dict"))

.setRawLogDir(assetsDir)

.setKeywordThreshold(1e-45f)

.setBoolean("-allphone_ci",true)

.getRecognizer();

speechRecognizer.addListener(this);

//try to inogre creat keywoard-activation search

// and add phonetic search

//speechRecognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);

File languageModel = new File(assetsDir,"digit.arpa");

speechRecognizer.addNgramSearch(KWS_SEARCH, languageModel);

}



ở đây digit là tên database nhận dạng (đặt lúc xây dựng acoustic model)

có một vấn đề là khi tạo mơ hình language sử dụng các file digit.lm.bin hay digit.lm.DMP thì

báo lỗi mà nhưng file này cho tốc độ chạy nhanh hơn, khi dùng file digit.arpa thì mới ổn.

Lúc này chúng ta có thể bắt đầu nghe tiếng nói với hàm

speechRecognizer.startListening(search_name, 10000);

hoặc: speechRecognizer.startListening(search_name);



Lúc này một luồng (thread) mới được tạo ra

Ta có thể kết thúc với hàm stop() hoặc cancel()

Trong quá trình nghe ta có các phương thức quan trong sau:

onBeginningOfSpeech()



Được gọi khi bắt đầu nói

onEndOfSpeech()



Được gọi khi kết thúc nói

onPartialResult(Hypothesis hypothesis)



Được gọi khi nhận được mỗi phần của tiếng nói (thường là mỗi từ)

onResult(Hypothesis hypothesis)



Được gọi khi kết thúc nhận dạng

Do quá trình nhận dạng chạy trên một luồng riêng do đó ta nên sử dụng lớp AsyncTask

Sau đây là tồn bộ mã nguồn file MainActivity:

package com.example.nguyenvanthinh.funny;



import

import

import

import

import

import

import

import

import

import



android.os.AsyncTask;

android.os.Bundle;

android.support.design.widget.FloatingActionButton;

android.support.design.widget.Snackbar;

android.support.v7.app.AppCompatActivity;

android.support.v7.widget.Toolbar;

android.view.View;

android.view.Menu;

android.view.MenuItem;

android.widget.TextView;



import java.io.File;

import java.io.IOException;



import static edu.cmu.pocketsphinx.SpeechRecognizerSetup.defaultSetup;



35



import

import

import

import



edu.cmu.pocketsphinx.Assets;

edu.cmu.pocketsphinx.Hypothesis;

edu.cmu.pocketsphinx.RecognitionListener;

edu.cmu.pocketsphinx.SpeechRecognizer;



public class MainActivity extends AppCompatActivity implements RecognitionListener{



private

private

private

private



SpeechRecognizer speechRecognizer;

static final String KWS_SEARCH = "moojt";

static final String KWS_PHONE = "hai";

static final String KEYPHRASE = "ba";



private TextView tvResult;

private TextView tvResultNumber;

private TextView tvError;

private String number[] =

{"khoong","moojt","hai","ba","boosn","nawm","sasu","baary","tasm","chisn","muwowfi","

muwowi",

"moost","nghifn","trawm","linh","tuw"};

private String numberCorrespond[] =

{"khơng","một","hai","ba","bốn","năm","sáu","bẩy","tám","chín","mười","mươi",

"mốt","nghìn","trăm","linh","tư"};



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);



tvResult = (TextView) findViewById(R.id.result);

tvResultNumber = (TextView) findViewById(R.id.tvResultNumber);

tvError = (TextView) findViewById(R.id.error);



tvError.setText("Click button to start");

new AsyncTask(){



@Override

protected Exception doInBackground(Void... params) {

try {



Assets assets = new Assets(MainActivity.this);

File assetDir = assets.syncAssets();

setupRecognitzer(assetDir);

} catch (IOException e){

e.printStackTrace();



return e;



}

publishProgress();

return null;



36



}



@Override

protected void onProgressUpdate(Void... values) {

super.onProgressUpdate(values);

}



@Override

protected void onPostExecute(Exception result) {

super.onPostExecute(result);

if(result != null) {

tvError.setText("Failed to init recognizer " + result );

} else {

FloatingActionButton fab = (FloatingActionButton)

findViewById(R.id.fab);

fab.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Snackbar.make(view, "Nguyễn Văn Thịnh",

Snackbar.LENGTH_LONG)

.setAction("Action", null).show();

tvError.setText("Preparing to the recognizer...");

startListening();



}

});

}

}

}.execute();

}



@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.menu_main, menu);

return true;

}



@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();



//noinspection SimplifiableIfStatement

if (id == R.id.action_settings) {

return true;

}



return super.onOptionsItemSelected(item);

}



37



private void startListening() {

stopListening();

speechRecognizer.startListening(KWS_SEARCH, 10000);



}



private void stopListening(){

speechRecognizer.stop();



}

private void setupRecognitzer(File assetsDir) throws IOException {

// configure recognizer



speechRecognizer = defaultSetup().setAcousticModel(new

File(assetsDir,"digit"))

.setDictionary(new File(assetsDir, "digit.dict"))

.setRawLogDir(assetsDir)

.setKeywordThreshold(1e-45f)

.setBoolean("-allphone_ci",true)

.getRecognizer();



speechRecognizer.addListener(this);



//try to inogre creat keywoard-activation search

// and add phonetic search

//speechRecognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);



File languageModel = new File(assetsDir,"digit.arpa");

speechRecognizer.addNgramSearch(KWS_SEARCH, languageModel);

}



@Override

public void onBeginningOfSpeech() {



}



@Override

public void onEndOfSpeech() {

stopListening();

tvError.setText("Starting");

startListening();

}



@Override

public void onPartialResult(Hypothesis hypothesis) {

if(hypothesis == null)

return;

String text =hypothesis.getHypstr();

tvResult.setText(converSequence(text));



38



tvResultNumber.setText(convertSequenceToNumber(text));



}



@Override

public void onResult(Hypothesis hypothesis) {

if(hypothesis != null){

String text = hypothesis.getHypstr();

tvResult.setText(converSequence(text));

tvResultNumber.setText(convertSequenceToNumber(text));



}



}



@Override

public void onError(Exception e) {



tvError.setText(e.getMessage());

}



@Override

public void onTimeout() {

stopListening();

}



@Override

protected void onDestroy() {

super.onDestroy();

speechRecognizer.cancel();

speechRecognizer.shutdown();

}



//below code to convert sequence ascii to unicode and convert sequence ascii to

number



String detectNumberToString(String inputNumber) {

// string line =""

int i = 0, length = number.length;



for(i=0;i
if(number[i].equals(inputNumber)){

return numberCorrespond[i];

}

}



39



return null;

}



String converSequence(String stringDetect) {

int i,j=0, length = stringDetect.length();

String line = "";



for(i = 0;i
if(Character.isWhitespace(stringDetect.charAt(i))){

line = line + detectNumberToString(stringDetect.substring(j, i)) + "

";

j = i+1;

}

if(i == (length-1)){

line = line + detectNumberToString(stringDetect.substring(j, i+1));

}

}



return line;

}



String detectNumberToNumber(String inputNumber) {



for(int i = 0;i
if(number[i].equals(inputNumber)) {

if(i<10){

return String.valueOf(i);

} else if(i == 13 || i == 14 ) {

return "";

} else if(i == 11 || i == 15) {

return "0";

} else if (i == 10 || i == 12) {

return "1";

} else {

return "4";

}

}

}



return "";

}



String convertSequenceToNumber(String stringDetect) {

int i,j=0, length = stringDetect.length();

String line = "";



for(i = 0;i
if(Character.isWhitespace(stringDetect.charAt(i))){

line = line + detectNumberToNumber(stringDetect.substring(j,i));

j = i+1;

}

if(i == (length-1)) {

String temp = stringDetect.substring(j,i+1);

if (temp.equals("muwowfi")) {



40



line = line + detectNumberToNumber(stringDetect.substring(j,i+1))

+"0";

} else {

line = line +detectNumberToNumber(stringDetect.substring(j,i+1));

}

}

}



return line;

}



}



5.4.2 Cài đặt và chạy ứng dụng

Để cài đặt: import mã nguồn ở link phía trên vào android studio và build ra file apk để cài

hoặc có thể down file apk ở đây :

https://drive.google.com/file/d/0B2nvwhLjNEHgdm9Xbi1VcTFTbWM/view?usp=sharing

Sau đó cài vào máy

Để sử dụng ta xem các bước demo sau:

Hình 16:Màn hình bắt đầu

Click nút start phía góc dưới để bắt đầu nhận dạng:



41



Sau khi start app sẽ chuyển qua giai đoạn chuẩn bị dữ liệu:

Hình 17: Màn hình chuẩn bị



Hình 18: Màn hình starting



42



Hình 19: Demo một vài nhận dạng



43



Danh mục hình ảnh

Hình 1: Bộ máy tạo tiếng nói ..................................................................................................... 3

Hình 2: Mơ hình giao tiếp tiếng nói người và máy .................................................................... 5

Hình 3: Kiến trúc ASR ............................................................................................................... 5

Hình 4: Tính 39 MFCC từ tín hiệu vào...................................................................................... 9

Hình 5: q trình nhân với hàm cửa sổ .................................................................................... 10

Hình 6: Biến đổi DFT .............................................................................................................. 11

Hình 7: Dải các bộ lọc mel ...................................................................................................... 12

Hình 8: Ví dụ mơ hình markov ba trạng thái ........................................................................... 15

Hình 9: Ví dụ mơ hình markov thời tiết................................................................................... 15

Hình 10: Quá trình thực hiện giải thuật Forward ..................................................................... 16

Hình 11: Quá trình thực hiện giải thuật Backward .................................................................. 17

Hình 12: Q trình hoạt động thuật tốn Viterbi ..................................................................... 18

Hình 13: Kiến trúc mơ hình nhận dạng .................................................................................... 22

Hình 14: Ví dụ mơ hình HMM từ “six” theo phone ................................................................ 23

Hình 15: Ví dụ mơ hình HMM từ “six” theo subphone .......................................................... 24

Hình 16:Màn hình bắt đầu ....................................................................................................... 41

Hình 17: Màn hình chuẩn bị .................................................................................................... 42

Hình 18: Màn hình starting ...................................................................................................... 42

Hình 19: Demo một vài nhận dạng .......................................................................................... 43



Tài liệu tham khảo

[1] Speech_and_Lang author Daniel_Jurafsky,_James_H._Martin

[2] Springer Handbook of Speech Processing author Jacob Benesty, M.Mohan

Sondhi, Yiteng Huang (Eds.)

[3] On site http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-345automatic-speech-recognition-spring-2003/

[4] On site http://practicalcryptography.com/miscellaneous/machine-learning/guide-melfrequency-cepstral-coefficients-mfccs/

[5] Bài giảng xử lý tiếng nói PGS.TS Trịnh Văn Loan

[6] On site http://cmusphinx.sourceforge.net/wiki/tutorial



44



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

4 Xây dựng ứng dụng demo tên Funny

Tải bản đầy đủ ngay(0 tr)

×