博客
关于我
百度语音合成(Android简单实现)
阅读量:671 次
发布时间:2019-03-17

本文共 6253 字,大约阅读时间需要 20 分钟。

百度语音合成Android开发文档

简介

本文针对百度语音合成Android开发提供详细指导。文档涵盖了离线语言合成和多种在线语音合成的实现方法,适用于 developers 开发与百度合作的语音合成功能。


源代码

以下是本文的核心实现源代码,涵盖了Java和XML布局两个主要部分。

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;public class MainActivity extends AppCompatActivity {    // 定义按钮对象    Button buttonSpeak = null;    Button buttonStop = null;    // 定义语音合成相关路径    private String dirFile = Environment.getExternalStorageDirectory().getPath() + 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类型    private TtsMode ttsMode = TtsMode.MIX;    // 定义语音合成器    private SpeechSynthesizer mSpeechSynthesizer = null;    private static final String TAG = "MainActivity";    // 获得Activity生命周期方法    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initPermission();        initView();        initTTS();    }    // 初始化权限    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
toApplyList = new ArrayList<>(); for (String perm : permissions) { if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) { toApplyList.add(perm); } } if (!toApplyList.isEmpty()) { ActivityCompat.requestPermissions(this, toApplyList.toArray(new String[0]), 123); } } // 初始化界面控件 private void initView() { buttonSpeak = findViewById(R.id.speak); buttonSpeak.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mSpeechSynthesizer.speak("Hello world !"); } }); buttonStop = findViewById(R.id.stop); buttonStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stop(); } }); } // 初始化语音合成功能 private void initTTS() { mSpeechSynthesizer = SpeechSynthesizer.getInstance(); mSpeechSynthesizer.setContext(this); int result = mSpeechSynthesizer.setAppId(appId); result = mSpeechSynthesizer.setApiKey(appKey, secretKey); System.out.println("错误码:" + result); boolean isMix = this.ttsMode.equals(TtsMode.MIX); if (isMix) { if (isDirExist(dirFile)) { copyAssetsToSdcard(this, dirFile + textFilename, textFilename); copyAssetsToSdcard(this, dirFile + modelFilename, modelFilename); } mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, dirFile + textFilename); mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, dirFile + modelFilename); } else { // 其他模式需自行处理离线模型 } AuthInfo authInfo = mSpeechSynthesizer.auth(this.ttsMode); if (authInfo != null && authInfo.isSuccess()) { System.out.println("授权成功!"); } else { System.out.println("授权失败!"); } } // 停止语音合成 private void stop() { int result = mSpeechSynthesizer.stop(); System.out.println("错误码:" + result); } // 打印日志 private void print(String message) { Log.i(TAG, message); } //销毁方法 @Override protected void onDestroy() { if (mSpeechSynthesizer != null) { mSpeechSynthesizer.stop(); mSpeechSynthesizer.release(); mSpeechSynthesizer = null; print("释放资源成功"); } super.onDestroy(); } // 复制Assets目录下的文件到SD卡 private void copyAssetsToSdcard(Context context, String filePath, String fileName) { File file = new File(filePath); if (!file.exists()) { file.mkdirs(); } try { InputStream inputStream = context.getResources().getAssets().open(fileName); FileOutputStream fileOutputStream = new FileOutputStream(filePath); byte[] buffer = new byte[1024]; while ((bufferSize = inputStream.read(buffer, 0, 1024)) >= 0) { fileOutputStream.write(buffer, 0, bufferSize); } inputStream.close(); fileOutputStream.close(); } catch (IOException e) { Log.d("Baidu-TTS", "Baidu-TTS write dat error!"); e.printStackTrace(); } } // 检查目录是否存在 private boolean isDirExist(String dirPath) { File dirFile = new File(dirPath); if (dirFile.exists()) { return true; } else { return dirFile.mkdirs(); } } // 获取权限回调 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); }}

2. XML布局源代码

3. Android.Manifest文件的权限


本文通过模块化的结构详细介绍了百度语音合成的实现方法,涵盖了从接入百度开放平台到语音模型的下载与应用的整体流程。开发者可以根据自身需求选择适当的语音合成模式(如纯在线或离线融合模式),这将极大地提高开发效率和应用的语音交互体验。

转载地址:http://ysgqz.baihongyu.com/

你可能感兴趣的文章
文件结束符EOF
查看>>
Latex 错误集合
查看>>
利用VNC进行Windows和Linux之间的复制
查看>>
Python的一个报错——OSError: [Errno 22] Invalid argument
查看>>
Python中什么时候用logger.debug, info, error
查看>>
Python的内置函数(四十一)、 index()
查看>>
Python的内置函数(四十二)、 numel()
查看>>
python中的os.path.dirname与os.path.dirname(__file__)的用法
查看>>
Python 代码占多行
查看>>
cuda error:device-side assert triggered
查看>>
TypeError: string indices must be integers
查看>>
Building wheel for opencv-python (PEP 517) ... /
查看>>
卷积神经网络的工程技巧总结
查看>>
OSError: [Errno 22] Invalid argument: ‘D:\test\x07‘
查看>>
Python的内置函数(十六)、strip()
查看>>
Python字符串操作之字符串分割与组合
查看>>
MATLAB截断数组
查看>>
tf.parse_single_example()
查看>>
tensorflow为什么要用placeholder()
查看>>
latex表示极限
查看>>