百度语音SDK使用

百度语音SDK提供:

  • 语音识别:将声音转成文字

  • 语音合成:将文字转成语音文件,然后播放语音文件,即文字变声音。

  • 语音唤醒:语音唤醒,激活运用程序

在这里,本篇介绍百度语音合成的使用。

百度语音介绍:

  1. 永久免费
  2. 多语言(中文,中英混读)多音色(男音,女音)可选
  3. 离线与在线,节省流量

详情参考,百度语音介绍

百度语音使用流程指南:

  1. 成为开发者,创建运用,选择服务
  2. 下载对应的SDK,集成开发。

详情参考,百度语音接入指南、百度语音SDK下载.

项目集成百度语音SDK:

  1. 在androidStudio中按照其AS特有的使用方式添加添加so库,相关的jar。

    这里写图片描述

    添加完so库,jar库后,需Gradle中配置如下:

    android {
    ........sourceSets {main { //设置so库依赖路径jniLibs.srcDirs = ['libs']}
    }
    }
    dependencies {..... compile files('libs/com.baidu.tts_2.3.0.jar')
    }
  2. 在androidStudio中assert文件夹下添加文本模型文件.dat,和声音模型文件.dat(无网络,离线下使用的)。这里因项目需求,只添加下载到女生模型文件。

    这里写图片描述

  3. 添加以下权限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  4. Proguard配置(不需要混淆sdk中jar包)

  5. 编写相关使用代码如下:

    5.1 加载离线资源,先创建存储的文件夹,然后将assert中模型文件一个个通过Stream读写(异步操作,可考虑工作线程或者RxJava完成)指定的文件夹下:

    /*** 百度tts文件夹*/
    public static final String BAIDU_TTS_DIR_NAME = "baiduTts";
    public static final String SPEECH_FEMALE_MODE_NAME = "bd_etts_ch_speech_female.dat";
    public static final String TEXT_MODEL_NAME = "bd_etts_ch_text.dat";/*** 初始化语音文件的配置** @param context*/
    private void initFileConfig(Context context) {File dirFile = getDirFile(context);if (dirFile != null && !dirFile.exists()) {dirFile.mkdir();copyFromAssertsToSDCard(context, SPEECH_FEMALE_MODE_NAME, getFilePath(dirFile, SPEECH_FEMALE_MODE_NAME));copyFromAssertsToSDCard(context, TEXT_MODEL_NAME, getFilePath(dirFile, TEXT_MODEL_NAME));}
    }/*** 获取目录** @param context* @return*/
    public File getDirFile(Context context) {return MyUtils.getCacheFile(context, BAIDU_TTS_DIR_NAME);
    }/*** 获取文件路径** @param dirFile* @param fileName* @return*/
    public String getFilePath(File dirFile, String fileName) {return dirFile.getAbsolutePath() + File.separator + fileName;
    }/*** 将文件写入sdcard中** @param context* @param assertFileName* @param filePath*/
    private void copyFromAssertsToSDCard(Context context, String assertFileName, String filePath) {FileOutputStream outputStream = null;InputStream inputStream = null;try {inputStream = context.getResources().getAssets().open(assertFileName);outputStream = new FileOutputStream(filePath);byte[] buffer = new byte[1024];int length = 0;while ((length = inputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, length);}} catch (Exception e) {e.printStackTrace();} finally {try {if (outputStream != null) {outputStream.close();}if (inputStream != null) {inputStream.close();}} catch (Exception e) {e.printStackTrace();}}
    }

    MyUtil工具类中创建文件夹的代码如下:

      /*** 获得存储文件** @param* @param* @return*/
    public static File getCacheFile(Context context,String name) {String cachePath;if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())|| !Environment.isExternalStorageRemovable()) {cachePath = context.getExternalCacheDir().getPath();} else {cachePath = context.getCacheDir().getPath();}return new File(cachePath + File.separator + name);
    }

    5.2 配置语音合成客户端:

    /**
    * 运用的配置信息,由百度语音官网给定
    */
    public static final String API_KEY = "hBuMkBgzGR0YQQHflkufAWcvFRaqTxxx";
    public static final String SECRET_KEY = "FemUYlEKxzr0moQ0jydZcmQ3fo11xxx";
    public static final String APP_ID = "9369xxx";/*** 语音合成的客户端*/
    private SpeechSynthesizer speechSynthesizer;
    /*** 合成状态的监听器*/
    private SpeechSynthesizerListener speechSynthesizerListener;/*** 初始化语音的client*/
    private void initBaiduTts(Context context) {speechSynthesizer = SpeechSynthesizer.getInstance();speechSynthesizer.setContext(context);//设置监听器if (getSpeechSynthesizerListener() != null) {speechSynthesizer.setSpeechSynthesizerListener(getSpeechSynthesizerListener());}//设置运用的api_key和secret_keyspeechSynthesizer.setApiKey(API_KEY, SECRET_KEY);//设置运用的app_idspeechSynthesizer.setAppId(APP_ID);File dirFile = getDirFile(context);//设置语音合成中文本模型文件(离线使用)speechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, getFilePath(dirFile, TEXT_MODEL_NAME));//设置语音合成中声音模型文件(离线使用)speechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, getFilePath(dirFile, SPEECH_FEMALE_MODE_NAME));//发音人(在线引擎),可用参数为0,1,2,3。。。(服务器端会动态增加,各值含义参考文档,以文档说明为准。0--普通女声,1--普通男声,2--特别男声,3--情感男声。。。)speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");//设置Mix模式的合成策略speechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);//上线的时候,移除授权检查操作,即移除以下if语句if (isAuthSuccess()) {LogController.i(BaiduTtsController.class.getSimpleName(), "首次验证成功");}//初始化ttsspeechSynthesizer.initTts(TtsMode.MIX);}/*** 用于首次使用的使用,测试检查运用是成功申请到授权。注意点:若是测试无误后,可省略该步骤。** @return*/
    public boolean isAuthSuccess() {AuthInfo info = speechSynthesizer.auth(TtsMode.MIX);if (!info.isSuccess()) {LogController.i(BaiduTtsController.class.getSimpleName(), "错误信息: " + info.getTtsError().getMessage());}return info.isSuccess();
    }public SpeechSynthesizerListener getSpeechSynthesizerListener() {return speechSynthesizerListener;
    }/*** 设置语音合成的监听器** @param speechSynthesizerListener*/
    public void setSpeechSynthesizerListener(SpeechSynthesizerListener speechSynthesizerListener) {this.speechSynthesizerListener = speechSynthesizerListener;if(speechSynthesizerListener!=null){this.speechSynthesizer.setSpeechSynthesizerListener(this.speechSynthesizerListener);}
    }

    5.3 语音合成客户端的生命周期管理:

    在Activity或者Service的生命周期中使用,onCreate()调用客户端的初始化操作(即以上两个配置步骤), onResume()调用客户端的resume(),Onstop()中调用客户端的stop().最后在onDestory()中调用客户端的release()

    
    /*** 释放资源*/
    public void release() {this.speechSynthesizer.release();
    }/*** 停止正在执行的任务*/
    public void stop() {this.speechSynthesizer.stop();
    }/*** 恢复暂停的任务*/
    public void resume() {this.speechSynthesizer.resume();
    }

    5.4 通过语音合成的客户端,将多段文本按一定顺序或者单独一段文本进行播放:

    /*** 将text转成一个语音文件,然后自动播放。*** @param text*/
    public void speeckText(String text) {if (!TextUtils.isEmpty(text)) {this.speechSynthesizer.speak(text);}}/*** 有顺序的合成多段语音,然后按一定顺序播放。** @param values*/
    public void speeckTextValues(String[] values) {if (values == null && values.length == 0) {return;}List<SpeechSynthesizeBag> bags = new ArrayList<>();for (int i = 0; i < values.length; ++i) {bags.add(getSpeechSynthesizeBag(values[i], String.valueOf(i)));}this.speechSynthesizer.batchSpeak(bags);
    }/**** @param text 播放的文本内容* @param utterancedId  播放顺序,即第几个播放* @return*/
    private SpeechSynthesizeBag getSpeechSynthesizeBag(String text, String utterancedId) {SpeechSynthesizeBag speechSynthesizeBag = new SpeechSynthesizeBag();//需要合成的文本text的长度不能超过1024个GBK字节。speechSynthesizeBag.setText(text);speechSynthesizeBag.setUtteranceId(utterancedId);return speechSynthesizeBag;
    }

    5.5 监控语音合成客户端的监听器(即SpeechSynthesizerListener)

    public class MessageDialogActivity extends BaseActivity implements View.OnClickListener,SpeechSynthesizerListener {private static final String TAG=MessageDialogActivity.class.getSimpleName();@Override
    public void onSynthesizeStart(String s) {LogController.i(TAG," onSynthesizeStart "+s);
    }@Override
    public void onSynthesizeDataArrived(String s, byte[] bytes, int i) {LogController.i(TAG," onSynthesizeDataArrived "+s);
    }@Override
    public void onSynthesizeFinish(String s) {LogController.i(TAG," onSynthesizeFinish "+s);
    }@Override
    public void onSpeechStart(String s) {LogController.i(TAG," onSpeechStart "+s);
    }@Override
    public void onSpeechProgressChanged(String s, int i) {LogController.i(TAG," onSpeechProgressChanged "+s);
    }@Override
    public void onSpeechFinish(String s) {LogController.i(TAG," onSpeechFinish "+s);
    }@Override
    public void onError(String s, SpeechError speechError) {LogController.i(TAG," onError "+speechError.description);
    }
    }

(个人)在实际项目中做法:

  1. 将百度语音客户端的初始化操作,生命周期管理操作,播放语音操作,封装成一个操作类。

    public class BaiduTtsController {
    public static BaiduTtsController instance;private BaiduTtsController(Context context) {initConfig(context);
    }public synchronized static BaiduTtsController getInstance(Context context) {return instance = instance == null ? new BaiduTtsController(context) : instance;
    }public void initConfig(Context context) {initFileConfig(context);initBaiduTts(context);
    }
    //剩下的是,初始化,生命周期,播放的具体代码,以上步骤已经贴出。
    }
  2. 将这个操作类保存到自定义的Application子类中,作为一个全局共享的对象。

    public class BaseApplication extends Application {private BaiduTtsController controller;
    public  BaiduTtsController  initBaiduTts(){return controller= controller==null?BaiduTtsController.getInstance(this):controller;
    }
    public BaiduTtsController getBaiduTtsController(){return controller;
    }
    public void setBaiduTtsController(BaiduTtsController controller){this.controller=controller;
    }
    }
  3. 在service中通过Application子类对象,获取到操作类对象,拿到需要播放的文本,调用播放语音的操作。

    private BaiduTtsController controller;
    //获取操作类的对象
    controller=BaseApplication.getAppContext().getBaiduTtsController();
    controller.setSpeechSynthesizerListener(this);//播放文本
    controller.speeckText(msg1);

开发遇到问题:

  • so库没有加载成功,控制台日志如下:
  No implementation found for int com.baidu.tts.jni.EmbeddedSynthesizerEngine.bdTTSGetLicenseNo implementation found for int com.baidu.speechsynthesizer.utility.SpeechDecoder.decodeWithCallback
 解决方式:正确导入so库,可以在手机中安装的运用查看so库是否随运用一起安装在手机上。
  • 运用的签名错误,控制台日志如下:

        Authentication Error=============================================----------------- 鉴权错误信息 ------------sha1;package:B3:88:6A:66:18:70:4E:FE:48:60:4C:4C:37:A9:2D:84:5D:16:56:xx;com.xxx.mjqzclientkey:RWpAlKWQE8SBoE354xUYeRcy906Asxxxerrorcode: -11 uid: -1 appid -1 msg: httpsPost failed,IOException:Unable to resolve host "api.map.baidu.com": No address associated with hostname请仔细核查 SHA1、package与key申请信息是否对应,key是否删除,平台是否匹配errorcode为230时,请参考论坛链接:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=106461

    解决方式:正确配置App的签名,然后在开发平台上,填写对应的包名,和sha1值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23976.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 语音识别(百度api)

文章目录 前言准备下载库代码实现以及编写我的key语音的录入&#xff1a;使用百度语音作为STT引擎并通过pyttsx3函数将返回的内容读出来形成简单的对话完整代码运行结果 前言 现在语音助手已经成为我们生活中ai的代表&#xff0c;下面让我们看一下语音助手的语音输入功能 准备…

Python调用百度API实现语音识别(一)

咪哥杂谈 本篇阅读时间约为 2 分钟。 1 前言 上篇文章介绍了下如何用 Python 剪辑视频&#xff0c;想回顾的同学可以拉到文章最下面&#xff0c;有历史链接。 有了上篇文章野狼disco的音频&#xff0c;今天就来带大家玩一下百度的API&#xff0c;如何借用百度 API 的语音识别功…

百度语音识别服务 —— 语音识别 REST API 开发笔记

在以前的项目中用到了百度语音识别服务&#xff0c;在这里做一个笔记。这里还是要和大家强调一下&#xff0c;最好的学习资料就是官网网站。我这里只是一个笔记&#xff0c;一方面整理了思路&#xff0c;另一方面方便以后我再次用到的时候可以快速回忆起来。 百度语音识别服务…

树莓派实现语音识别与语音合成——百度云语音识别API

本文采用百度云语音识别API接口&#xff0c;实现低于60s音频的语音识别&#xff0c;也可以用于合成文本长度小于1024字节的音频&#xff0c;此外采用snowboy离线语音唤醒引擎可实现离线语音唤醒&#xff0c;实现语音交互。基于本内容可实现语音控制小车&#xff0c;语音控制音箱…

项目:基于百度API智能语音家居控制系统

目录 开发平台/开发环境&#xff1a; windows 10、Linux、arm cortex A9(Exynos 4412)、ubuntu20.04、zigebee通信、摄像头外设、cortex-M0&#xff1b; 项目模块&#xff1a; 摄像头模块&#xff1b;qt界面及语音识别模块&#xff1b;qt客户端模块&#xff1b;服务器模块&am…

Python调用百度API进行语音识别

目录 1.作者介绍2.基于百度API的普通话识别2.1语音识别2.2百度API调用方法 3&#xff0e;实验3.1实验准备3.2实验结果 4.实验代码 1.作者介绍 高志翔&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2021级研究生 研究方向&#xff1a;机器视觉与人工智能 电…

百度语音识别API的简单应用

1. prepare 根据百度开发文档的提示可以知道&#xff0c;API仅能处理特定格式的语音文件。 由于底层识别使用的是pcm&#xff0c;因此推荐直接上传pcm文件。如果上传其它格式&#xff0c;会在服务器端转码成pcm&#xff0c;调用接口的耗时会增加。 语音识别仅支持以下格式 &am…

什么是CatGPT-使用效果如何-

个人使用效果&#xff0c;评分优&#xff0c;足以满足教学和填表。 程序媛借助CatGPT&#xff08;ChatGPT更佳&#xff09;&#xff0c;基本上可以秒杀不用此类工具的程序猿&#xff08;男&#xff09;&#xff01;&#xff01;&#xff01; 问&#xff1a;为什么使用AIGC能大幅…

OpenAI ChatGPT3.5 completion API 入门指南

官方介绍 ChatGPT 由 OpenAI 最先进的语言模型 gpt-3.5-turbo 提供支持。 使用 OpenAI API&#xff0c;您可以使用 GPT-3.5-turbo 构建自己的程序来做一些如下的事情&#xff1a; 起草电子邮件或其他书面文件编写 Python 代码回答关于一组文档的问题创建对话代理程序为你的软件…

英语二-电子邮件邀请短文写作

1. 邮件模板 Dear 邀请人, Hope you have a great day. I am writing this email to invite you to attend 主题. Please kindly find the following information for your reference: Time: 时间 Address: 地点 We hope that nothing will prevent you from coming, as…

怎样收智商税

智商税的历史源远流长&#xff0c;史上最著名的案例&#xff0c;是 1313 年起天主教会开始发售的“赎罪券”&#xff1a;教皇宣称教徒购买此券&#xff0c;可以赦免罪罚&#xff0c;其宣传是“金币投进柜子当啷一响时&#xff0c;灵魂就可以升天堂了”。此案例诠释了智商税的几…

AIGC周报|让AI来画《海贼王》;苹果限制员工使用ChatGPT;李彦宏:不担心大模型会让工作消失

AIGC&#xff08;AI Generated Content&#xff09;即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT&#xff0c;以及 DallE 2、Stable Diffusion 等文生图模型&#xff0c;都属于 AIGC 的典型案例&#xff0c;它们通过借鉴现有的、人类创造的内容来快速完成内容创作。 …

谷歌正式开放智能 AI 机器人 Bard 迎战 ChatGPT,附申请教程

随着 ChatGPT 掀起了 AI 时代的浪潮之后&#xff0c;微软必应 Bing Chat 机器人、Office 以及百度的“文心一言”等都已经离开实验室&#xff0c;正式在公众的赛道上比拼了。3月21日周二&#xff0c;美国科技巨头谷歌公司推出了 AI 聊天机器人 Bard 的测试版本&#xff0c;以期…

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--01 Introduction

01课程介绍Introduction 1) 两种LLM(Large Language Models) Base LLM&#xff1a;根据训练数据自动预测下一个单词。例如&#xff1a;给定"Once upon a time, there was a unicorn"&#xff0c;LLM会自动生成下面的文章"that lived in a magical forrest with…

计算机考研复试面试系列 计算机专业英语篇

计算机考研复试面试系列 计算机专业英语篇 在复习过程中&#xff0c;我用心查阅并整理了在考研复试面试中可能问到的大部分问题&#xff0c;并分点整理了答案&#xff0c;可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看&#xff0c;效率更高&#xff01; 此系列一共…

AI时代的三类人:探索掌握AIGC,引领未来的人才之路

&#xff08;本文阅读时间&#xff1a;6 分钟&#xff09; 1 AI时代&#xff1a;ChatGPT引领AIGC技术革命 对于那些热衷于探索新技术的小伙伴而言&#xff0c;ChatGPT早已超越了抽象的概念&#xff0c;我们对其能力已有所了解。那么&#xff0c;ChatGPT究竟能够做些什么呢&…

AGI 大模型创业时代的创业公司新形态:11 人的 Midjourney 不是偶然 | 同为开发绘画AI的团队,Midjourney是怎么取得今天的成就的呢?

同为开发绘画AI的团队,Midjourney是怎么取得今天的成就的呢? 目录 同为开发绘画AI的团队,Midjourney是怎么取得今天的成就的呢?</

Web开发课程实验(二):Servlet+DAO实现数据库基本交互

实验内容&#xff1a; 使用servletDAO实现基本数据库交互 具体要求 编写一个静态网页&#xff0c;网页命名&#xff1a;student.html 编写一个Servlet&#xff0c;命名&#xff1a;StudentServlet 创建hit数据库&#xff08;PostgreSQL或MySQL均可&#xff09;&#xff0c;其…

占有统治地位的Transformer究竟是什么

讲个有趣的小故事 我高二那年从乙班考入了甲班&#xff0c;对于那时的我 偏科英语最高只有108班级平均英语成绩125暴躁难为人女英语老师&#xff0c;使我上英语课时战战兢兢。英语老师很时尚&#xff0c;喜欢搞花里胡哨的词语让我们放松&#xff0c;也很尊重我虽然暴躁但维护着…

8 Surprising Things You Can Do With ChatGPT 你可以用 ChatGPT 做的 8 件令人惊讶的事情

If you’ve heard about ChatGPT and think it’s just a fancy chatbot, you might be underestimating the range of what it can do. Here are some surprising things you can do with ChatGPT, whether you want to write a resume or have it dungeon-master an epic rol…