Android之讯飞语音-文字转语音

                      

一、描述

在平时开发中,也许有的模块需要用到语音功能,特别是需要动态播放语音的,这时就需要把文字转换成语音进行播放了,当然如果只是固定的几个静态语音需要播放,可以直接用软件把文字转成语音生成MP3,之后在项目中直接播放音频即可,这里推荐朗读女。

二、使用教程

一,登陆讯飞开发平台

http://www.xfyun.cn/



二、创建一个应用



三、Sdk下载

选择好你需要的功能,有的免费的,这里就以在线语音合成作为示例。


Paste_Image.png

四、配置讯飞语音到AndroidStudio



(一)打开压缩包的内容,里面有个Lib,我们现在先进入lib

(二)复制arm64-v8a,armeanbi,armeabi-v7a存放到jniLibs目录中,把Msc.jar和Sunflower.jar存放到libs目录中。


需要复制的文件
存放位置,jniLibs Paste_Image.png


(三)添加需要的权限

    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
五、讯飞语音使用说明



(一)初始化讯飞语音,可以在Application类中执行,把“appid=”后面替换上你在讯飞上创建的应用对应的Appid。

public class MyApp extends Application {    @Override    public void onCreate() {        super.onCreate();        SpeechUtility.createUtility(getApplicationContext(), "appid=YOU_APPID");    }}

(二)语音工具类,调用speakText(要播放的语音文本)方法即可播放语音,如还需要配置一些其他属性,可自行添加。

package com.example.junwen.myapplication;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;

/**

  • 描述:语音播放工具类

  • 作者:卜俊文

  • 创建:2016/8/19 09:07

  • 邮箱:344176791@qq.com
    */
    public class AudioUtils {

    private static AudioUtils audioUtils;

    private SpeechSynthesizer mySynthesizer;

    public AudioUtils() {
    }

    /**

    • 描述:单例
    • 作者:卜俊文
    • 邮箱:344176791@qq.com
    • 创建时间: 2016/8/19 14:38
      */
      public static AudioUtils getInstance() {
      if (audioUtils == null) {
      synchronized (AudioUtils.class) {
      if (audioUtils == null) {
      audioUtils = new AudioUtils();
      }
      }
      }
      return audioUtils;
      }

    private InitListener myInitListener = new InitListener() {
    @Override
    public void onInit(int code) {
    Log.d(“mySynthesiezer:”, "InitListener init() code = " + code);
    }
    };

    /**

    • 描述:初始化语音配置
    • 作者:卜俊文
    • 邮箱:344176791@qq.com
    • 创建时间: 2016/8/19 14:38
      */
      public void init(Context context) {
      //处理语音合成关键类
      mySynthesizer = SpeechSynthesizer.createSynthesizer(context, myInitListener);
      //设置发音人
      mySynthesizer.setParameter(SpeechConstant.VOICE_NAME, “xiaoyan”);
      //设置音调
      mySynthesizer.setParameter(SpeechConstant.PITCH, “50”);
      //设置音量
      mySynthesizer.setParameter(SpeechConstant.VOLUME, “50”);

    }

    /**

    • 描述:根据传入的文本转换音频并播放

    • 作者:卜俊文

    • 邮箱:344176791@qq.com

    • 创建时间: 2016/8/19 14:39
      */
      public void speakText(String content) {
      int code = mySynthesizer.startSpeaking(content, new SynthesizerListener() {
      @Override
      public void onSpeakBegin() {

       } @Override public void onBufferProgress(int i, int i1, int i2, String s) { } @Override public void onSpeakPaused() { } @Override public void onSpeakResumed() { } @Override public void onSpeakProgress(int i, int i1, int i2) { } @Override public void onCompleted(SpeechError speechError) { } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { }

      });
      }
      }

(三)在MainActivity中直接调用方法播放语音,init方法也可以放在Aplication中初始化,自行封装。

  public void Speak(View view) {        AudioUtils.getInstance().init(MainActivity.this); //初始化语音对象        AudioUtils.getInstance().speakText("你好"); //播放语音    }
六、示例Demo



讯飞语音源代码

三、注意事项

如果有遇到空指针的问题,请检查一下你的初始化是否在Applicaiton中,Application类是否已经在清单文件注册了,没有初始化是会空指针的。

四、总结

这里总结了讯飞语音的使用说明,方便以后需要的时候,方便的查看。

欢迎关注我的微信公众号,分享更多技术文章。

##注意:jniLibs包跟代码包在同一层级(也可以把so文件写在libs库,参考https://blog.csdn.net/hizhangyuping/article/details/81169718)

###五、遇到的问题
####1.关于科大讯飞 SpeechSynthesizer.createSynthesizer(this, this);等于null问题
主要是在Manifest.xml文件中service另开了一个线程android:process=“com.xxx.xx”,当app启动的时候 会调用两次 Application的onCreate方法 但是科大讯飞的初始化只能初始化一次如果继续初始化 会出现SpeechSynthesizer.createSynthesizer(this, this);等于null的问题 这个时候你需要去判断 是否是当前应用的当前进程去做初始化了参考 https://blog.csdn.net/cly19940419/article/details/79269603
####2.关于多进程的使用
参考 https://blog.csdn.net/Simon_Crystin/article/details/70315106
####3.Android科大讯飞语音未按队列播报
参考 https://blog.csdn.net/wb_001/article/details/78561227
https://blog.csdn.net/p522947409/article/details/54286679
####4.Android自带的TextToSpeech报错 speak failed : not bound to tts engine
参考https://blog.csdn.net/xiaoguda1/article/details/80096811
####5.本文针对的是在线语音合成,需要外网,如果是内网要用的话需要用离线语音开发

更多相关文章

  1. 百度语音合成(TTS) 在Android的使用方法
  2. [置顶] 浅析android中的权限管理--用户安装的apk的uid,gid是如何
  3. Android(安卓)Spinner控件
  4. android vold初始化及sd卡挂载流程(转载)
  5. Android(安卓)PocketSphinx离线语音识别集成总结
  6. Android(安卓)TTS(Text To Speech)
  7. 将Android(安卓)Studio的设置恢复到初始化(清除所有的设置)
  8. unity语音聊天--亲加通讯云(Android/iOS)---android
  9. Android中提供的免费文字转语音功能TextToSpeech之快速入门用法(A

随机推荐

  1. Android标题栏进度条显示
  2. android中利用handler改变textView的内容
  3. QT For Android中,设置界面字体
  4. android makefile分析及build( 转载)
  5. Android 手机运营商及网络类型判断
  6. android中进行https连接的方式
  7. android短信开发
  8. Android获取系统顶部状态栏(Status Bar)
  9. android检查权限是否获取
  10. android:点击popupwindow以外区域 popupwi