
百度语音合成(Android简单实现)
发布日期:2021-05-20 00:22:15
浏览次数:12
分类:精选文章
本文共 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 }; ArrayListtoApplyList = 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文件的权限
本文通过模块化的结构详细介绍了百度语音合成的实现方法,涵盖了从接入百度开放平台到语音模型的下载与应用的整体流程。开发者可以根据自身需求选择适当的语音合成模式(如纯在线或离线融合模式),这将极大地提高开发效率和应用的语音交互体验。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月12日 20时26分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Vue路由跳转如何传递一个对象过去?
2019-03-17
sockjs-node/info?t=1462183700002 报错解决方案
2019-03-17
解决VS Code保存时候自动格式化
2019-03-17
SAP 修改物料价格那些事
2019-03-17
FI 替代相关 OSS Note 要点记录
2019-03-17
二十八、进阶之history模式及路由守卫
2019-03-17
Problem K: 三角形数
2019-03-17
蓝桥杯---试题 算法提高 欧拉函数(数学)
2019-03-17
自动化中支付软件的支付键盘定位问题,看过这篇文章少走许多的弯路!
2019-03-17
Math中的小算法
2019-03-17
自定义Seekbar样式
2019-03-17
Hidden treasures of the Rust ecosystem
2019-03-17
【Rust投稿】从零实现消息中间件(6)-CLIENT
2019-03-17
Rust异步浅谈
2019-03-17