百度语音合成(Android简单实现)

android之基于百度语音合讯飞语音识别的语音交互 app:http://fir.im/gval 这里面包含拨盘UI 开发平台:android studio 模拟一个  原始需求如下: 1)  在界面上,通过声音提示用户讲话; 2)  将语音内容转换为文字并存储。 例如:用户启动应用后,点击按键后,应用问“请问你在哪个国家”,5s后如果用户不回答,再问“请问你在哪个国家”,如果5s后,用户仍然不回答,不再询问。如果5s内用户回答, 阅读详情

1 简介

百度开发文档

https://ai.baidu.com/docs#/TTS-Android-SDK/top

本文实现了1种离线语言合成和多种在线语音合成。

百度语音合成需要经过以下几个步骤,先注册百度账号,再创建百度语音应用,然后下载百度语音的SDK(jar文件)、语音模型(dat文件)、NDK so库文件,接着将jar文件放在Project->app->libs目录下、dat文件放在Project->src->main->assets目录下、NDK so库文件放在Project->src->main->jniLibs目录下(如果目录不存在,手动建立即可),最后调用相应的方法即可。

注意:(1)要实现离线语音合成Android工程的包名必须与在创建的百度语音应用时输入的包名相同;

(2)需要实现将assets下的语音模型复制到SD卡上。

2 源代码

工程目录

2.1 java源代码

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.os.Handler;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.baidu.tts.auth.AuthInfo;
import com.baidu.tts.client.SpeechSynthesizer;
import com.baidu.tts.client.TtsMode;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    Button buttonSpeak = null;
    Button buttonStop = null;

    // 语言模型文件路径
    private String dirFile = Environment.getExternalStorageDirectory() + File.separator +"my_voice"+ File.separator ;
    private String textFilename = "bd_etts_text.dat";
    private String modelFilename ="bd_etts_speech_f7.dat";

    // 百度语言的账号
    private String appId = "17246190";
    private String appKey = "UfrBeadhzS2UhuDiGuPa8TlD";
    private String secretKey = "G73dYXjcEgZflVgWURVhAuVUM25nAuAT";

    // TtsMode.MIX; 离在线融合,在线优先; TtsMode.ONLINE 纯在线;
    private TtsMode ttsMode = TtsMode.MIX;

    // 设置语言合成器
    protected SpeechSynthesizer mSpeechSynthesizer = null;

    // 设置TAG
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化权限
        initPermission();

        // 初始化语言合成
        initTTS();

        // 初始化控件
        this.initView();
    }

    /**
     * 初始化控件
     */
    private void initView(){
        this.buttonSpeak = findViewById(R.id.speak);
        this.buttonSpeak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mSpeechSynthesizer.speak("Hello world !");
            }
        });

        this.buttonStop = findViewById(R.id.stop);
        this.buttonStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stop();
            }
        });
    }

    /**
     * 初始化语言合成
     */
    private void initTTS() {

        // 1. 获取实例
        this.mSpeechSynthesizer = SpeechSynthesizer.getInstance();
        this.mSpeechSynthesizer.setContext(MainActivity.this);

        // 2. 设置appId,appKey.secretKey
        int result = this.mSpeechSynthesizer.setAppId(appId);
        result = this.mSpeechSynthesizer.setApiKey(appKey, secretKey);
        System.out.println("https://ai.baidu.com/docs#/TTS-Android-SDK/top-错误码:" + result);

        // 3. 支持离线的话,需要设置离线模型
        boolean isMix = this.ttsMode.equals(TtsMode.MIX);
        if (isMix) {
            if(isDirExist(dirFile)){
                copyAssetsToSdcard(MainActivity.this, dirFile+textFilename, textFilename);
                copyAssetsToSdcard(MainActivity.this, dirFile+modelFilename, modelFilename);
            }
            // 设置语言模型
            mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, dirFile+textFilename);
            // 设置使用的语言模型
            mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, dirFile+modelFilename);

            // 检查离线授权文件是否下载成功
            AuthInfo authInfo = mSpeechSynthesizer.auth(this.ttsMode);
            // 文本模型文件路径 (离线引擎使用)
            if(authInfo.isSuccess()){
                print("授权成功!");
            }else {
                print("授权失败!");
            }
        }

        // 4. 以下setParam 参数选填。不填写则默认值生效
        // 设置在线发声音人: 0 普通女声(默认),本文仅仅设置了1种离线语言,其他的3中离线语言可以自己下载
        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");
        // 设置合成的音量,0-15 ,默认 5
        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "5");
        // 设置合成的语速,0-15 ,默认 5
        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");
        // 设置合成的语调,0-15 ,默认 5
        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");

        // 该参数设置为TtsMode.MIX生效。即纯在线模式不生效。
        // MIX_MODE_DEFAULT 默认 ,wifi状态下使用在线,非wifi离线。在线状态下,请求超时6s自动转离线
        // MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI wifi状态下使用在线,非wifi离线。在线状态下, 请求超时1.2s自动转离线
        // MIX_MODE_HIGH_SPEED_NETWORK , 3G 4G wifi状态下使用在线,其它状态离线。在线状态下,请求超时1.2s自动转离线
        // MIX_MODE_HIGH_SPEED_SYNTHESIZE, 2G 3G 4G wifi状态下使用在线,其它状态离线。在线状态下,请求超时1.2s自动转离线
        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);

        // 5. 初始化
        result = this.mSpeechSynthesizer.initTts(ttsMode);
        System.out.println("https://ai.baidu.com/docs#/TTS-Android-SDK/top-错误码:" + result);
    }

    private void stop() {
        print("停止合成引擎 按钮已经点击");
        int result = this.mSpeechSynthesizer.stop();
        System.out.println("https://ai.baidu.com/docs#/TTS-Android-SDK/top-错误码:" + result);
    }

    private void print(String message) {
        Log.i(TAG, message);
    }

    @Override
    protected void onDestroy() {
        if (this.mSpeechSynthesizer != null) {
            this.mSpeechSynthesizer.stop();
            this.mSpeechSynthesizer.release();
            this.mSpeechSynthesizer = null;
            print("释放资源成功");
        }
        super.onDestroy();
    }


    /**
     * 下面是android 6.0以上的动态授权
     * android 6.0 以上需要动态申请权限
     */
    private void initPermission() {
        String[] permissions = {
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.MODIFY_AUDIO_SETTINGS,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_SETTINGS,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.CHANGE_WIFI_STATE
        };

        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 dirPath 目录的路径
     * @return true代表目录存在
     */
    private boolean isDirExist(String dirPath){
        File dirFile = new File(dirPath);
        if(dirFile.exists()){
            return true;
        }else {
            return dirFile.mkdirs();
        }
    }

    /**
     * 复制Assets目录下的文件到SD卡
     * @param context 代表Activity.this
     * @param filePath 文件路径
     * @param fileName 文件名
     */
    private void copyAssetsToSdcard(Context context, String filePath, String fileName){
        File file = new File(filePath);

        // Determine if the file exists
        if (!file.exists()) {

            // Initial the stream
            InputStream inputStream = null;
            FileOutputStream fileOutputStream = null;

            try {
                inputStream = context.getResources().getAssets().open(fileName);
                fileOutputStream = new FileOutputStream(filePath);
                byte[] buffer = new byte[1024];
                int bufferSize = 0;
                // Copy the data
                while ((bufferSize = inputStream.read(buffer, 0, 1024)) >= 0) {
                    fileOutputStream.write(buffer, 0, bufferSize);
                }

                // Close the stream
                inputStream.close();
                fileOutputStream.close();

            } catch (IOException e) {
                Log.d("Baidu-TTS","Baidu-TTS write dat error!");
                e.printStackTrace();
            }
        }
    }
}
 

2.2 xml布局源代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        android:weightSum="3">

        <Button
            android:id="@+id/speak"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:lines="2"
            android:text="合成并播放"
            android:textSize="12dp" />

        <Button
            android:id="@+id/stop"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="2"
            android:lines="2"
            android:text="停止合成引擎"
            android:textSize="12dp" />

    </LinearLayout>

</LinearLayout>

2.3 xml的manifests文件的权限

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <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.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

百度语音报错 音频播放错误: {“errMsg“:“MediaError“,“errCode“:-99} 语音播报实现:https://www.kancloud.cn/wangking/uniapp/1924836 所用插件:https://ext.dcloud.net.cn/plugin?id=182 原因:创建了账号获取API Key/Secret Key未充钱 1、搜索地址:地址:https://ai.baidu.com/tech/speech/tts_online 2、登录账号 3、创建应用如下图 4、填写信息生成API Key/ Secret Key 4、创建完毕查看如下图 5、拿到API Ke 阅读详情

相关推荐

Android Studio下Android应用开发集成百度语音合成使用方法样例

转载请注明来源: http://blog.youkuaiyun.com/kjunchen/article/details/51093134 Android Studio下Android应用开发集成百度语音合成使用方法样例首先,语音合成是指将文本信息转换成声音。意思就是将文本转化为声音,让你的应用开口说话。国内在业内比较有名的第三方语音合成平台有百度语音和科大讯飞。

JunkChen 1万+

百度语音合成

1.在百度语音的控制台创建一个应用,输入应用名称、包名等信息 2.进入应用会看到sdk下载,进去后选择 语音合成–离在线融合SDK(这里只使用语音合成功能),下载该sdk 3.下载后打开里面是一个as的应用,可以自己运行然后看看代码逻辑。 4.将app–lib下的jar包拷贝到自己项目的app-lib下。然后鼠标右键添加到自己项目的库中 5.将app-src-main下的jniLibs整个...

早起看日落的博客 3899

ESP32使用百度语音合成 实现文字转语音播放

esp32 播放多个音频源的音频,例如播放本地flash的mp3,http或者蓝牙传来的音频流等。 一,简介 本次例程介绍更加简单的播放器初始化,并在播放器中添加http_stream和flash_tone_stream等输入流来实现 百度语音合成 与播放本地音频 的效果。 效果如视频: 二,播放器初始化 esp-idf提供了一套更加便捷的创建pipeline管道的api函数,接口在esp_audio.h中定义。使用这套api能更快的初始化一个音频处理管道。以下代码初始化一个播放音频的管道: 音频的处理.

杀手的博客 9652

Android中文语音合成(TTS)各家引擎对比

Android中文语音合成(TTS)各家引擎对比 Yao.GUET 2012-02-03,转载请注明出处:http://blog.youkuaiyun.com/Yao_GUET Android系统从1.6版本开始就支持TTS(Text-To-Speech),也就是我们所说的语音合成,不过遗憾的是系统默认的TTS引擎:Pico TTS,并不支持中文。 由此对于广大的炎黄子孙不得不安装我们自己的TTS引擎跟...

hyshucom 2511

Android集成百度TTS,实现离在线的中英语音合成

百度的离在线TTS,没有调用量限制,免费但是有QPS限制(是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准),增大QPS需要收费,所以对商用并不是很好友。如果想用完全免费的纯离线可参考我另一篇博客: 话不多说开始! 第一步:先从百度tts官网下载离在线融合SDK,网址:https://ai.baidu.com/sdk#tts,解压后最好先运行一下demo。 参考技术文档:https:/...

sunyFS的博客 5552

百度Android语音合成(TTS)SDK使用方法

语音合成是实现人机语音交互,建立一个有听和讲能力的交互系统所必需的关键技术。随着语 音技术的发展,百度自主研发了语音合成系统(TTS),功能是接受用户发送的文本,生成语音发 送给用户。

VoiceFans的专栏 6952

Android 开发 框架系列 百度语音合成

官方文档:http://ai.baidu.com/docs#/TTS-Android-SDK/6d5d6899 官方百度语音合成控制台:https://cloud.baidu.com/product/speech/tts 步骤一  申请授权 在百度语音控制台中申请使用语音合成的授权,填入相关数据后(注意:一定要选择Android填入正确的包名,不然可能会影响使用离线语音合成)。得到相应的AP...

qq_37217804的博客 2530

Android 基于百度语音的语音交互功能

项目里面用到了语音唤醒功能,前面一直在用讯飞的语音识别,本来打算也是直接用讯飞的语音唤醒,但是讯飞的语音唤醒要收费,试用版只有35天有效期。只好改用百度语音,百度语音所有功能免费,功能也比较简单实用,包括语音识别,语音合成和语音唤醒,正好可以组成一套完整的语音交互功能。效果图:首先是语音唤醒功能,说出关键词即可叫语音识别,唤醒成功会有语音提示,这里采用了百度语音的合成功能。然后百度语音识别会根据wi

AmazingUU的博客 1万+

Android百度语音合成Demo

private Context mContext; private MySpeechSynthesizerListener listener = new MySpeechSynthesizerListener(); private SpeechSynthesizer mSpeechSynthesizer; public TTSAction(Context context){ this.m

baidu_30371351的博客 965

Android 百度语音合成手把手教学

1、如何运行百度在线语音合成功能的demo 2、如何在自己项目中集成百度语音在线合成功能 3、如何申请key和创建应用请参考百度官方文档

Errol's Blog 1853

Android添加百度语音合成API使用(亲测踩坑)

今天要使我的app说话,因此要使用到语音合成,安卓自带的语音合成技术好像并不支持中文,因此采用国内的api,其中有百度,科大讯飞,文章是采用了百度的api,亲测踩坑之后已经可用。 1、注册开发者账号,百度开发者平台http://ai.baidu.com/tech/speech/tts,然后点击免费试用,里面可以有创建应用。 2、填写包名要写安卓项目的包名,注册之后会有AppID、AP...

水舞残枫的博客 985

使用app inventor快速开发安卓app(第一课,点击计数游戏)

1.输入网址:https://www.wxbit.com/,点击跳转,点击右上角“开始使用App Inventor2 汉化版按钮” 2.点击左上角新建项目,填写你第一个项目的名称:点击计数游戏 3.进入项目制作页面。 4.设想下项目的功能(屏幕上有一个按钮,一个标签,每点击一次,屏幕上的数字就会加1,并且发出相应的语音提示)。 如图绘制屏幕 左侧从组件面板将界面布局——垂直布局拖到工作面板的手机屏幕上,,在最右侧的组件属性设置为下图。 接下来将按钮和标签拖到工作面板并且设置组

godmanxu的博客 3271

java 离线语音合成_Android Studio百度离线语音合成集成

首先注册百度开发者平台,创建应用 01.png点击下一步,选择语音合成 02.png点击下一步,选择下载语音合成SDK 03.png 07.png下载完成之后输入包名,包名必须和程序的包名一致,包名可在清单文件中查看 ![06.png](http://upload-images.jianshu.io/upload_images/3786250-26509e86ba22c610.png?imageM...

weixin_29291863的博客 762

Unity接入百度语音合成安卓(android)SDK

一、注册百度云账号 选择语音技术,并且创建一个安卓应用,选择语音合成,领取免费配额 创建应用的时候,包名要跟Unity发布安卓时的包名保持一致,如果不一致,则会找不到我们写的脚本 二、下载百度语音合成Demo 我们所需的安卓库文件与jar包都在demo中 下载地址:https://console.bce.baidu.com/ai/?_=1599524377675&fromai=1#/ai/speech/app/detail~appId=1886795 三、创建一个新.

1343

某tts_online音频接口逆向

web加密参数:md5算法。

我不是码农的博客~~~ 635

Android平台百度SDK语音合成实现

语音合成技术,通常被称为Text-To-Speech(TTS),是一种将文本信息转换为语音信息的技术。这种技术广泛应用于各种智能系统,如智能手机助手、车载系统、阅读器等。通过语音合成,计算机能够模拟人类的发音,使得人机交互更加自然和便捷。百度语音合成SDK是一种基于百度AI平台的语音合成技术解决方案,它允许开发者将文本信息转换为人类可以理解的语音信息。SDK主要功能和特点包括但不限于以下几点:自然流畅的语音合成。

weixin_42263617的博客 1105

android通过百度语音合成实现文字转换成语音(TTS)详细教程?

android实现百度语音合成1.使用TextToSpeech朗读文字2.百度语音合成1.创建应用1.在百度开发者平台实现注册,并进行实名认证2.点击语音技术3.点击创建应用4.创建细节5.领取语音合成次数2.添加文件1.在lib中添加如图文件2.添加jniLibs文件夹3.添加assets文件(`重点,这里就是我前面一直出现错误的原因`)4.添加依赖3.修改auth.properties文件4.修改OnlineAPIActivity文件5.解释ApiServer文件中重要代码1.查看百度语音合成上传参数2

qq_45137584的博客 8277

pytorch转onnx转paddlepaddle

1.pt转onnx 可查看我之前的文章:https://blog.youkuaiyun.com/oyjwin/article/details/117778583?spm=1001.2014.3001.5501

oyjwin的博客 1461

vue实现语音合成功能,Android和wap端

vue项目需要实现小说朗读功能,wap端和Android APP端,wap端能使用的方法在Android端不能使用,需要使用原生Android的方法实现小说朗读功能。

ahualong1的博客 1697

使用Hyper-V使用下载下来的macOS安装引导安装macos

然后关闭工具返回安装界面选择第二个reinstall,选择119g那个硬盘。我的资源上传了:macOS Monterey on Hyper-V.7z。设置固件的启动顺序,引导安装盘放到第一位,mac安装110g放第二。选择disk utility格式化那个110g。下载解压的macos引导挂载到虚拟硬盘。其他设置安全禁用,检查禁用,集成都选中。新建一个虚拟硬盘装mac,110g。

viviliving的专栏 3024

3DGS 2025实战指南:从安装到训练全流程解析

本文提供了3D Gaussian Splatting (3DGS) 从零开始的完整实战指南。详细解析了使用gsplat库进行环境配置、依赖安装(包括pycolmap和fused-ssim)、数据准备与COLMAP处理、核心训练流程及参数调优,并探讨了2025年3DGS在动态场景、可控编辑等领域的最新进展,帮助开发者快速掌握这一前沿3D重建技术。

b3n4m5q6w7的博客 359
上一篇: 使用VueI18n.js实现国际化
下一篇: Vue和Vue-cli环境安装
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值