之前的项目使用了百度和科大讯飞的需要付费,追求不付费,各种搜索。
借鉴PocketSphinxDemo/app at master · eson-yunfei/PocketSphinxDemo (github.com)代码稍作修改
整体不难主要是移植,按照如下步骤:
步骤一:下载源码,点击上面的链接即可。
步骤二:源码移植,将demo中的代码移植到自己的项目中
箭头所指插入自己的文件即可;
步骤3:修改gradle
dependencies {
implementation ("pub.devrel:easypermissions:3.0.0")
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation files('libs\\pocketsphinx-android-5prealpha-nolib.jar')
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
ant.importBuild 'assets.xml'
preBuild.dependsOn(list, checksum)
clean.dependsOn(clean_assets)
步骤四:修改权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
步骤5:编写主页程序可以参考demo的文件
package com.eson.psx;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
import edu.cmu.pocketsphinx.PocketListener;
import edu.cmu.pocketsphinx.PocketSphinxService;
import edu.cmu.pocketsphinx.PocketSphinxUtil;
import edu.cmu.pocketsphinx.kit.RecognizerSetupListener;
import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.EasyPermissions;
import pub.devrel.easypermissions.PermissionRequest;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Intent serviceIntent;
private PocketSphinxUtil pocketSphinxUtil;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.request_permission).setOnClickListener(this);
findViewById(R.id.start_service).setOnClickListener(this);
findViewById(R.id.start_record).setOnClickListener(this);
findViewById(R.id.stop_record).setOnClickListener(this);
}
@SuppressLint("NonConstantResourceId")
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.request_permission:
onRecordAudioGranted();
break;
case R.id.start_service:
if (hasRecordAudioPermission()) {
startPocketSphinxService();
} else {
Toast.makeText(this, "请先申请权限", Toast.LENGTH_SHORT).show();
}
break;
case R.id.start_record:
if (serviceIntent == null) {
Toast.makeText(this, "请先开启服务", Toast.LENGTH_SHORT).show();
} else {
new Handler(Looper.getMainLooper())
.postDelayed(this::forTest, 5_000);
}
break;
case R.id.stop_record:
if (pocketSphinxUtil != null) {
pocketSphinxUtil.stopRecord();
}
break;
default:
break;
}
}
private boolean hasRecordAudioPermission() {
return EasyPermissions.hasPermissions(this, Manifest.permission.RECORD_AUDIO);
}
@AfterPermissionGranted(100)
private void onRecordAudioGranted() {
if (hasRecordAudioPermission()) {
Toast.makeText(this, "已获取录音权限", Toast.LENGTH_SHORT).show();
}else {
EasyPermissions.requestPermissions(new PermissionRequest.Builder(this, 100, Manifest.permission.RECORD_AUDIO)
.build());
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode,permissions,grantResults,this);
}
private void startPocketSphinxService() {
serviceIntent = new Intent();
serviceIntent.setClass(this, PocketSphinxService.class);
startService(serviceIntent);
Toast.makeText(this,"PocketSphinxService 启动成功",Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
if (pocketSphinxUtil != null) {
pocketSphinxUtil.stopRecord();
}
}
@Override
protected void onStop() {
super.onStop();
if (serviceIntent != null) {
stopService(serviceIntent);
}
}
void forTest() {
pocketSphinxUtil = PocketSphinxUtil.get();
if (pocketSphinxUtil == null) {
return;
}
pocketSphinxUtil.runRecognizerSetup(new RecognizerSetupListener() {
@Override
public void onRecognizerAlreadySetup() {
}
@Override
public Exception doInBackGround() {
return null;
}
@Override
public void onRecognizerPrepareError() {
}
@Override
public void onRecognizerPrepareSuccess() {
}
});
pocketSphinxUtil.startRecord("zh_test", new PocketListener() {
@Override
public void onSpeechStart() {
}
@Override
public void onSpeechResult(List<String> strings) {
Log.d("MainActivity", "find result =" + strings);
if (strings == null) {
return;
}
for (String string : strings) {
Log.d("MainActivity", "find string =" + string);
}
}
@Override
public void onSpeechError(String error) {
}
});
}
}
步骤6:修改字典和关键词
步骤7:修改步骤可以参考
修改这两个文件就可以