Android 离线语音识别

        之前的项目使用了百度和科大讯飞的需要付费,追求不付费,各种搜索。

        借鉴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:修改步骤可以参考

修改这两个文件就可以

安卓平台使用pocketSphinx离线语音识别 - 简书 (jianshu.com)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值