Android使用百度語音識別api程式碼實現。
阿新 • • 發佈:2021-09-15
第一步
① 建立平臺應用
點選百度智慧雲進入,沒有賬號的可以先註冊賬號,這裡預設都有賬號了,然後登入。
然後左側導航欄點選找到語音技術
然後會進入一個應用總覽頁面,
然後點選建立應用
立即建立
點選檢視應用詳情
這幾個值都是等下專案中要用的,請注意,最好是複製貼上,不要手打,上圖中有一個下載SDK,點選進入下載頁面,第一個就是
點選下載到本地,下載之後是一個壓縮檔案,解壓之後先不用管它,
第二步
然後在Android Studio裡面建立一個專案
② 建立Android專案並配置。包名填之前建立應用時填的包名
將下載的SDK中的core複製到你專案的app同級目錄下,
開啟core中的src/main/AndroidManifest.xml
在裡面修改成你的apiid ,appid,secretid
第三步
示例程式碼:
MainActivity.java
package com.yyz.asrdemo; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.baidu.speech.EventListener; import com.baidu.speech.EventManager; import com.baidu.speech.EventManagerFactory; import com.baidu.speech.asr.SpeechConstant; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MainActivity extends AppCompatActivity implements EventListener { protected EditText txtResult;//識別結果 protected Button startBtn;//開始識別,持續一定時間不說話會自動停止,需要再次開啟 protected Button stopBtn;//停止識別,立即停止,直接輸出已經識別的內容 private EventManager asr;//語音識別核心庫 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initPermission(); //初始化EventManager物件 asr = EventManagerFactory.create(this, "asr"); //註冊自己的輸出事件類 asr.registerListener(this); // EventListener 中 onEvent方法 } /** * android 6.0 以上需要動態申請許可權 */ private void initPermission() { String permissions[] = {Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET, Manifest.permission.WRITE_EXTERNAL_STORAGE }; ArrayList<String> toApplyList = new ArrayList<String>(); for (String perm : permissions) { if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) { toApplyList.add(perm); //進入到這裡代表沒有許可權 } } String tmpList[] = new String[toApplyList.size()]; if (!toApplyList.isEmpty()) { ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123); } } /** * 許可權申請回調,可以作進一步處理 * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 此處為android 6.0以上動態授權的回撥,使用者自行實現。 } /** * 初始化控制元件 */ private void initView() { txtResult = (EditText) findViewById(R.id.edittext); startBtn = (Button) findViewById(R.id.btn_start); stopBtn = (Button) findViewById(R.id.btn_stop); startBtn.setOnClickListener(new View.OnClickListener() {//點選開始按鈕 @Override public void onClick(View v) { asr.send(SpeechConstant.ASR_START, null, null, 0, 0); } }); stopBtn.setOnClickListener(new View.OnClickListener() {//點選停止按鈕 @Override public void onClick(View v) { asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); } }); } /** * 自定義輸出事件類 EventListener 回撥方法 */ @Override public void onEvent(String name, String params, byte[] data, int offset, int length) { if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) { // 識別相關的結果都在這裡 if (params == null || params.isEmpty()) { return; } if (params.contains("\"final_result\"")) { // 一句話的最終識別結果 String regrex = "\\[(.*?),"; //使用正則表示式抽取我們需要的內容 Pattern pattern = Pattern.compile(regrex); Matcher matcher = pattern.matcher(params); if (matcher.find()) { int a = matcher.group(0).indexOf("["); int b = matcher.group(0).indexOf(","); txtResult.setText(matcher.group(0).substring(a+2,b-3)); } } } } @Override protected void onDestroy() { super.onDestroy(); //傳送取消事件 asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); //退出事件管理器 // 必須與registerListener成對出現,否則可能造成記憶體洩露 asr.unregisterListener(this); } }
activity_main.xml
<?xml version="1.0" encoding="UTF-8"?> -<androidx.constraintlayout.widget.ConstraintLayout tools:context=".MainActivity" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> <EditText android:layout_height="wrap_content" android:layout_width="wrap_content" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:hint="請點選開始錄音" android:id="@+id/edittext"/> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" app:layout_constraintTop_toTopOf="@+id/btn_stop" android:id="@+id/btn_start" app:layout_constraintEnd_toStartOf="@+id/edittext" android:text="開始錄音"/> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" app:layout_constraintTop_toTopOf="parent" android:id="@+id/btn_stop" android:text="停止錄音" app:layout_constraintStart_toEndOf="@+id/edittext" android:layout_marginTop="116dp"/> </androidx.constraintlayout.widget.ConstraintLayout>
跑起來!!