最后

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,也可以分享给身边好友一起学习。

一起互勉~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

在这里插入图片描述

代码如下:

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<EditText

android:id=“@+id/edittext”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:hint=“请点击开始录音”

app:layout_constraintEnd_toEndOf=“parent”

app:layout_constraintStart_toStartOf=“parent”

app:layout_constraintTop_toTopOf=“parent” />

<Button

android:id=“@+id/btn_start”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“开始录音”

app:layout_constraintEnd_toStartOf=“@+id/edittext”

app:layout_constraintTop_toTopOf=“@+id/btn_stop” />

<Button

android:id=“@+id/btn_stop”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_marginTop=“116dp”

android:text=“停止录音”

app:layout_constraintStart_toEndOf=“@+id/edittext”

app:layout_constraintTop_toTopOf=“parent” />

</androidx.constraintlayout.widget.ConstraintLayout>

试运行看看实际效果

在这里插入图片描述

②android 6.0 以上版本权限申请。语音识别要用到麦克风,这个使用权限是需要动态申请的。

/**

  • 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 toApplyList = new ArrayList();

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以上动态授权的回调,用户自行实现。

}

③初始化控件与语音识别的核心SDK

protected EditText txtResult;//识别结果

protected Button startBtn;//开始识别,持续一定时间不说话会自动停止,需要再次打开

protected Button stopBtn;//停止识别,立即停止,直接输出已经识别的内容

private EventManager asr;//语音识别核心库

/**

  • 初始化控件

*/

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);

}

});

}

④在onCreate方法中调用

@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方法

}

此时会有错误提示,因为我们还没有实现EventListener这个借口,接下来我们就实现这个接口

在这里插入图片描述

⑤实现EventListener接口,要注意这个接口是百度的这个

在这里插入图片描述

实现接口的onEvent方法

/**

  • 自定义输出事件类 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));

}

}

}

}

因为返回的结果并不是单纯是识别出的我们所说的话,还有别的内容,所以需要使用正则表达式抽取内容,不抽取的话返回内容如下,明显并不是我们想要的结果

在这里插入图片描述

⑥使用真机调试程序(我所用的genymotion模拟器是不支持语音输入的,不知道别的模拟器支不支持),前题你要开启你手机的开发者选项,并允许USB调试与USB安装,不同手机的开启方法不同,自己上网查一下就好。

写在最后

最后我想说:对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

存中…(img-syB2Y44q-1715139228883)]

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐