Thiết kế phần mềm

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu về nhận dạng tiếng nói ứng dụng vào điều khiển xe lăn (Trang 53 - 61)

3.4. Thiết kế hệ thống điều khiển xe lăn

3.4.3. Thiết kế phần mềm

Hình 3.6. Sơ đồ khối của quá trình nhận dạng tiếng nói trong Sphinx-4

Chức năng quan trọng nhất ở đây là nhận dạng tiếng nói, chúng tôi sử dụng công cụ mã nguồn mở của Sphinx-4 (hình 3.6). Trong đó có thể tóm tắt chức năng cơ bản như sau:

- Frontend: Từ Input là dữ liệu đầu vào là một chuỗi các sóng âm thanh sẽ được mã hóa và trích chọn đặc trưng qua Fronend và thu được các đặc trừng feature và gửi vào bộ giải mã (decoder). Phương pháp thường dùng trong công đoạn này là MFCC chúng sẽ chuyển đổi tín hiệu âm thanh sang dạng vector.

- Linguist: Chức năng chính của Linguist là cung cấp mô hình ngữ âm, từ điển và mô hình ngôn ngữ nhằm xây dựng một đồ thị cho việc tìm kiếm trên nền tảng sử dụng mô hình Markov ẩn trong đó mô hình ngôn ngữ

dùng để tính xác xuất tiên nghiệm, mô hình ngữ âm được dùng để tính giá trị likelihood. Cụ thể một mô hình ngữ âm Gaussian sẽ được áp dụng để tính các likelihood quan sát được của các vector đặc trưng.

- Decoder: Bộ giải mã (decoder) sẽ có nhiệm vụ sử dụng mô hình tìm kiếm và dữ liệu đầu vào để cho ra kết quả. Mô hình này sử dụng thuật toán Viterbi với các đầu vào gồm các vector đầu vào, mô hình ngữ âm Gausian và mô hình ngôn ngữ nhằm tìm kiếm xâu kí tự biểu diễn chuỗi từ đầu ra.

- Ngoài ra các giá trị tham số của mô hình Markov trên cũng được sinh ra bằng pha huấn luyện nhúng bằng cách sử dụng bộ từ vựng đầu vào. Như vậy ngoài các thư viện chuẩn của Andtoid, chúng ta phải khai báo thêm các thư viện từ Sphinx-4 như sau:

import edu.cmu.pocketsphinx.Assets; import edu.cmu.pocketsphinx.Hypothesis; import edu.cmu.pocketsphinx.RecognitionListener; import edu.cmu.pocketsphinx.SpeechRecognizer; import static edu.cmu.pocketsphinx.SpeechRecognizerSetup.defaultSetup;

Các thư viện trên sẽ có các hàm tương ứng cho việc nhận dạng tiếng nói trên điện thoại.

Cài đặt tham số trong môi trường nhận dạng:

private void setupRecognizer(File assetsDir) throws IOException { recognizer = defaultSetup()

.setSampleRate(16000)

.setAcousticModel(new File(assetsDir, "dkxelan")) .setDictionary(new File(assetsDir, "dkxelan.dict"))

.setRawLogDir(assetsDir) .setKeywordThreshold(1e-20f)

.setBoolean("-allphone_ci", false) .setBoolean("-allphone_cd", true) .getRecognizer();

recognizer.addListener(this);

File dkxlGrammar = new File(assetsDir, "dkxelan.gram"); recognizer.addGrammarSearch("dkxelan", dkxlGrammar); }

Tạo luồng nhận dạng trong onCreate:

new AsyncTask<Void, Void, Exception>() { @Override

protected Exception doInBackground(Void... params) { try {

Assets assets = new Assets(PocketSphinxActivity.this); File assetDir = assets.syncAssets();

setupRecognizer(assetDir); } catch (IOException e) { return e; } return null; } @Override

protected void onPostExecute(Exception result) { if (result == null)

recognizer.stop();

}

}.execute();

Hàm trả về kết quả nhận dạng:

public void onResult(Hypothesis hypothesis) { ((TextView) findViewById(R.id.txtStatus)) .setText("...");

if (hypothesis != null) {

String text = hypothesis.getHypstr();

Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();

((TextView) findViewById(R.id.txtStatus)) .setText(text);

dieuKhienXeLan(text); }

}

Kiểm tra thiết bị có hỗ trợ Bluetooth hay không:

private void checkBTState() { if (btAdapter == null) {

errorExit("Fatal Error", "Bluetooth not support"); } else {

tatBluetooth(); }

}

Tạo socket kết nối Bluetooth:

private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {

if (Build.VERSION.SDK_INT >= 10) { try {

final Method m =

device.getClass().getMethod("createInsecureRfcommSocketToServic eRecord", new Class[]{UUID.class});

return (BluetoothSocket) m.invoke(device, MY_UUID); } catch (Exception e) {

Log.e(TAG, "Could not create Insecure RFComm Connection", e);

} }

return device.createRfcommSocketToServiceRecord(MY_UUID); }

Gửi ký tự qua Bluetooth:

public void write(String message) {

Log.d(TAG, "...Data to send: " + message + "..."); byte[] msgBuffer = message.getBytes();

try {

mmOutStream.write(msgBuffer); } catch (IOException e) {

Log.d(TAG, "...Error data send: " + e.getMessage() + "..."); }

}

Thiết kế phần mềm trên Arduino.

Hàm điều chỉnh tốc độ động cơ: void motor_speech(void){

IRQcount=0; tmp=(((num_pulse*1000.0)/(pulses_cycle*del_timer_ms))/rpm)*255; total=0; for (i=0;i<=3;i++) { tmp_s[i]=tmp_s[i+1]; total+=tmp_s[i]; } tmp_s[4]=tmp; total+=tmp; speech=total/5; //Serial.print("speech=");Serial.println(speech); } Hàm nhận dữ liệu từ Bluetooth: void serialEvent() {

while (Serial.available()) in_command = (char)Serial.read(); }

Hàm có chức năng điều khiển:

void chay_thang(double setpoint_in){ digitalWrite(Dir_R,R_tien); digitalWrite(Dir_L,L_tien); Setpoint=setpoint_in;

tmp=abs(Setpoint-speech); // hieu chinh tham so PID

if (tmp<nguong_adapt) myPIDR.SetTunings(consKp, consKi, consKd);

else myPIDR.SetTunings(aggKp, aggKi, aggKd); myPIDR.Compute();

analogWrite(Motor_R, Output); analogWrite(Motor_L, Output); }

void chay_lui(double setpoint_in){ digitalWrite(Dir_R,R_lui); digitalWrite(Dir_L,L_lui);

Setpoint=setpoint_in; tmp=abs(Setpoint-speech); // hieu chinh tham so PID

if (tmp<nguong_adapt) myPIDR.SetTunings(consKp, consKi, consKd);

else myPIDR.SetTunings(aggKp, aggKi, aggKd); myPIDR.Compute();

analogWrite(Motor_R, Output); analogWrite(Motor_L, Output); }

void quay_trai(double setpoint_in){ digitalWrite(Dir_R,R_lui); analogWrite(Motor_L, 0); Setpoint=setpoint_in; tmp=abs(Setpoint-speech); // hieu chinh tham so PID

if (tmp<nguong_adapt) myPIDR.SetTunings(consKp, consKi, consKd);

else myPIDR.SetTunings(aggKp, aggKi, aggKd); myPIDR.Compute();

analogWrite(Motor_R, Output); }

void quay_phai(double setpoint_in){ digitalWrite(Dir_L,L_tien); analogWrite(Motor_R, 0); Setpoint=setpoint_in; tmp=abs(Setpoint-speech); // hieu chinh tham so PID

if (tmp<nguong_adapt) myPIDR.SetTunings(consKp, consKi, consKd);

else myPIDR.SetTunings(aggKp, aggKi, aggKd); myPIDR.Compute();

analogWrite(Motor_L, Output); }

void dung_xe(void) { analogWrite(Motor_L,0);

analogWrite(Motor_R,0); }

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu về nhận dạng tiếng nói ứng dụng vào điều khiển xe lăn (Trang 53 - 61)

Tải bản đầy đủ (PDF)

(65 trang)