百度语音合成中需要注意的两个小常识

来源:互联网 发布:星尘数据 编辑:程序博客网 时间:2024/06/16 17:12

语音合成(Text To Speech,TTS):将文本合成为语音,即声音文件。
去官网创建应用,,并下载SDK文件,解压后的压缩包中有一个官方的demo,其实按照这个demo来就行了,在这里需要注意的只有两个问题

**

1、关于assets中文件的一个读取

**
因为官方给的Eclipse版本中的,如果用Android Studio开发的话,那就要注意到这两者对于assets文件的的处理是不一样的。
百度语音识别这里PARAM_TTS_TEXT_MODEL_FILE、PARAM_TTS_SPEECH_MODEL_FILE、PARAM_TTS_LICENCE_FILE、loadEnglishModel(),这几个中都需要放入assets文件的一个路径,供它去读取,并且进行处理,但是如果直接用“file://android_asset/xxx”或者this.getClass().getResourceAsStream()都是不可取的,这里必须要先把assets中的文件放到存到本地,然后读本地存储路径,这里附一个自己已经做好的类

copyFilesFassets方法传入的两个参数是:"assets/bd_etts_speech_female.dat""/voicetest/bd_etts_speech_female.dat" public class CopyAssetsFile {    /**     *  从assets目录中复制整个文件夹内容       *  @param  context  Context 使用CopyFiles类的Activity      *  @param  oldPath  String  原文件路径  如:/aa       *  @param  newPath  String  复制后路径  如:xx:/bb/cc       */    public void copyFilesFassets(Context context,String oldPath,String newPath) {        try {            String fileNames[] = context.getAssets().list(oldPath);//获取assets目录下的所有文件及目录名              if (fileNames.length > 0) {//如果是目录                  File file = new File(newPath);                file.mkdirs();//如果文件夹不存在,则递归                  for (String fileName : fileNames) {                    copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);                }            } else {//如果是文件                File file=new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + newPath);                String  path = newPath.substring(0, newPath.lastIndexOf("/"));                getDirectory(path);                if(!file.exists()){                    file.createNewFile();                }                InputStream is =  context.getClass().getClassLoader().getResourceAsStream(oldPath);                FileOutputStream fos = new FileOutputStream(file);                byte[] buffer = new byte[1024];                int byteCount = 0;                while((byteCount = is.read(buffer)) != -1) {//循环从输入流读取 buffer字节                              fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流                  }                fos.flush();//刷新缓冲区                  is.close();                fos.close();            }        } catch (Exception e) {            // TODO Auto-generated catch block              e.printStackTrace();            //如果捕捉到错误则通知UI线程          }    }    //分级建立文件夹    public void getDirectory(String path){        //对path进行处理,分层级建立文件夹        String[]  s=path.split("/");        String str=Environment.getExternalStorageDirectory().getAbsolutePath();        for (int i = 0; i < s.length; i++) {            str=str+"/"+s[i];            File file=new File(str);            if(!file.exists()){                file.mkdir();            }        }    }}

**

2、libs中的文件

**
其实在官方文档也可以看到这样说的:
(1)、如与第三方库集成,至少要保留armeabi目录。如第三方库有7个架构目录,比语音识别SDK多出2个目录 mips和mips64,请将mips和mips64目录删除,剩下5个同名目录合并。
(2)、如第三方库仅有armeabi这一个目录,请将语音识别SDK的额外4个目录如armeabi-v7a删除,合并armeabi目录下的so。 即目录取交集,so文件不可随意更改所属目录。
因为在百度语音识别和合成中,需要进行两次SDK的集成,这两次中的libs中的文件只能取交集,也就是有相同的文件夹就把相同的文件夹中的内容合并为一个,如果一边有一边没有,那就把这类文件夹删除了

另,附上地址,里面包含了百度语音识别和合成整合后的demo:https://git.oschina.net/lee_vane/BaiduVoiceRecognition