快去自定义|

穆里流风

园龄:4年3个月粉丝:1关注:1

安卓项目整合科大讯飞离线语音合成服务

 

首先有一定基础的可以直接按照科大讯飞的Android SDK文档进行操作,在此主要记录整合过程中的一些问题以及大致的解决方法,官方操作文档地址

1.创建自己的测试Demo

  • 讯飞开放平台地址,在此进行账号注册登录

  • 点击进入控制台创建应用

    • 第一次进入不能直接创建自己测试应用,需要进行实名认证,认证时长不固定,很快的啦

    • 按照以下创建应用

  • 建好之后点击所建应用按照自己的需求进行选择,我选的是离线语音合成普通版(现在好像是要逐步下线)

  • 选择自己想要的版本点击下载进入SDK下载界面,下载的压缩包内有Demo可以进行学习,即将停止维护的SDK只能回到旧版进行下载,下载就是选中然后点下载就下载好了,现在还是比较推荐试用新版Aikit进行语音合成,但是点数需要买(O(∩_∩)O)

    • 文件目录如下

  • AS中导入sample,将原目录res文件夹内容复制到sample的assets文件夹中,具体项目目录如下

2.遇到的第一个问题

  •     Build file 'E:\It\workspace\OM\Android_aisound1144_4857f909\sample\mscV5PlusDemo\build.gradle' line: 1
        
        A problem occurred evaluating root project 'mscV5PlusDemo'.
        > Plugin with id 'com.android.application' not found.
        
        * Try:
        > Run with --stacktrace option to get the stack trace.
        > Run with --info or --debug option to get more log output.
        > Run with --scan to get full insights.
        > Get more help at https://help.gradle.org.
        BUILD FAILED in 3s
    
  • build.gradle文件内容

    •    apply plugin: 'com.android.application'
         android {
             compileSdkVersion 30
             buildToolsVersion "30.0.3"
         
             defaultConfig {
                 applicationId "com.iflytek.mscv5plusdemo"
                 minSdkVersion 16
                 targetSdkVersion 30
             }
             buildTypes {
                 release {
                     minifyEnabled false
                     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
                 }
             }
             sourceSets {
                 main {
                     jniLibs.srcDirs = ['libs']
                 }
             }
             allprojects {
                 repositories {
                     google()
                     mavenCentral()
                 }
             }
         }
         dependencies {
             implementation files('libs/Msc.jar')
             implementation 'androidx.legacy:legacy-support-v4:1.0.0'
         }
         
      
  • 找不到咱就引入

    • buildscript {
          repositories {
              google()
              jcenter()
          }
          dependencies {
              //版本号请根据自己的gradle插件版本号自行更改
              classpath 'com.android.tools.build:gradle:3.4.0'
          }
      }
      

3.好消息,问题解决啦,新的问题出现啦

  •       Build file 'E:\It\workspace\OM\Android_aisound1144_4857f909\sample\mscV5PlusDemo\build.gradle' line: 1
          
          A problem occurred evaluating root project 'mscV5PlusDemo'.
          > org/gradle/initialization/BuildCompletionListener
          
          * Try:
          > Run with --stacktrace option to get the stack trace.
          > Run with --info or --debug option to get more log output.
          > Run with --scan to get full insights.
          > Get more help at https://help.gradle.org.
          Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.
          You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
          For more on this, please refer to https://docs.gradle.org/8.2/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.
          BUILD FAILED in 1s
    
    
  • 网上研究了一下,应该是Gradle和jdk版本不匹配的问题

    • 太好啦,是匹配的版本,我们有救啦!

4.太好啦,运行的时候又出问题啦

  • 太好啦,运行的时候又出问题啦

  • E:\It\workspace\OM\Android_aisound1144_4857f909\sample\mscV5PlusDemo\src\main\java\com\iflytek\mscv5plusdemo\AsrDemo.java:314: ����: -source 1.7 �в�֧�� lambda ���ʽ
            runOnUiThread(() -> {
                             ^
      (��ʹ�� -source 8 ����߰汾������ lambda ���ʽ)
    
  • 看样子好像还是和jdk的版本有点关系,在gradle指定下试试?

    •     compileOptions {
              sourceCompatibility JavaVersion.VERSION_1_8
              targetCompatibility JavaVersion.VERSION_1_8
          }
      
  • 太好啦!成功啦!

5.运行成功!看看效果

  • 6.整合到自己的项目

    • TTSDemo改一下下写成工具类方便调用

      • public class TTSVoice {
            // 语音合成对象
            private SpeechSynthesizer mTts;
            // 默认本地发音人
            public static String voicerLocal = "xiaoyan";
            //缓冲进度
            private int mPercentForBuffering = 0;
            //播放进度
            private int mPercentForPlaying = 0;
            // 引擎类型
            private String mEngineType = SpeechConstant.TYPE_LOCAL;
        
            public TTSVoice(Context context) {
                mTts = SpeechSynthesizer.createSynthesizer(context, mTtsInitListener);
            }
        
            public void playVoice(Context context, String tts) {
        
                // 设置参数
                if (null == mTts) {
                    return;
                }
                setParam();
                int code = mTts.startSpeaking(tts, mTtsListener);
                if (code != ErrorCode.SUCCESS) {
                    ToastUtil.showOne(context, "语音合成失败,错误码: " + code);
                }
            }
        
        
            /**
             * 初始化监听。
             */
            private InitListener mTtsInitListener = new InitListener() {
                @Override
                public void onInit(int code) {
                    Log.d("=============", "InitListener init() code = " + code);
                    if (code != ErrorCode.SUCCESS) {
                    } else {
                    }
                }
            };
        
            /**
             * 合成回调监听。
             */
            private SynthesizerListener mTtsListener = new SynthesizerListener() {
        
                @Override
                public void onSpeakBegin() {
                    //showTip("开始播放");
                }
        
                @Override
                public void onSpeakPaused() {
        //            showTip("暂停播放");
                }
        
                @Override
                public void onSpeakResumed() {
        //            showTip("继续播放");
                }
        
                @Override
                public void onBufferProgress(int percent, int beginPos, int endPos,
                                             String info) {
                    // 合成进度
                    mPercentForBuffering = percent;
        //            showTip(String.format(getString(R.string.tts_toast_format),
        //                    mPercentForBuffering, mPercentForPlaying));
                }
        
                @Override
                public void onSpeakProgress(int percent, int beginPos, int endPos) {
                    // 播放进度
                    mPercentForPlaying = percent;
        //            showTip(String.format(getString(R.string.tts_toast_format),
        //                    mPercentForBuffering, mPercentForPlaying));
                }
        
                @Override
                public void onCompleted(SpeechError error) {
        //            if (error == null) {
        //                showTip("播放完成");
        //            } else if (error != null) {
        //                showTip(error.getPlainDescription(true));
        //            }
                }
        
                @Override
                public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
                    // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
                    // 若使用本地能力,会话id为null
                    if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                        String sid = obj.getString(SpeechEvent.KEY_EVENT_AUDIO_URL);
                    }
        
                    //实时音频流输出参考
        			/*if (SpeechEvent.EVENT_TTS_BUFFER == eventType) {
        				byte[] buf = obj.getByteArray(SpeechEvent.KEY_EVENT_TTS_BUFFER);
        				Log.e("MscSpeechLog", "buf is =" + buf);
        			}*/
                }
            };
        
            /**
             * 参数设置
             */
            private void setParam() {
                // 清空参数
                mTts.setParameter(SpeechConstant.PARAMS, null);
                //设置合成
                //设置使用本地引擎
                mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
                //设置发音人资源路径
                mTts.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
                //设置发音人
                mTts.setParameter(SpeechConstant.VOICE_NAME, voicerLocal);
                //mTts.setParameter(SpeechConstant.TTS_DATA_NOTIFY,"1");//支持实时音频流抛出,仅在synthesizeToUri条件下支持
                //设置合成语速
                mTts.setParameter(SpeechConstant.SPEED, "80");
                //设置合成音调
                mTts.setParameter(SpeechConstant.PITCH, "50");
                //设置合成音量
                mTts.setParameter(SpeechConstant.VOLUME, "100");
                //设置播放器音频流类型
                mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
                //	mTts.setParameter(SpeechConstant.STREAM_TYPE, AudioManager.STREAM_MUSIC+"");
        
                // 设置播放合成音频打断音乐播放,默认为true
                mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");
        
                // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
                mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
        
                mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/tts.wav");
            }
        
            //获取发音人资源路径
            private String getResourcePath() {
                StringBuffer tempBuffer = new StringBuffer();
                String type = "tts";
                if (mEngineType.equals(SpeechConstant.TYPE_XTTS)) {
                    type = "xtts";
                }
                //合成通用资源
                tempBuffer.append(ResourceUtil.generateResourcePath(MESApplication.getContext(), ResourceUtil.RESOURCE_TYPE.assets, type + "/common.jet"));
                tempBuffer.append(";");
                //发音人资源
                tempBuffer.append(ResourceUtil.generateResourcePath(MESApplication.getContext(), ResourceUtil.RESOURCE_TYPE.assets, type + "/" + voicerLocal + ".jet"));
                return tempBuffer.toString();
            }
        }
        
      • 启动文件

        • public class MESApplication extends Application {
          
              public static Context context
          
              @Override
              public void onCreate() {
                  super.onCreate();
                  context = this;
                  ExceptionHandler.init(this);
                  DBManager.getInstance().init(this);
                  CrashReport.initCrashReport(getApplicationContext(), "XXX", true);
                  SpeechUtility.createUtility(context, SpeechConstant.APPID + "=XXXXXX");
                  NetworkManager.getDefault().init(this);
              }
          
              public static Context getContext() {
                  return context;
              }
          }
          
      • 相应的libs目录以及assets目录的内容也同样也要复制过来啦!

    • 大功告成!试了一下可以,但是企业用的话还是需要购买点位

还有一点就是如果你的安卓机是有语音合成引擎且支持你需求的语言的话其实安卓是有自己的语音合成API的,用不着花钱去买这个,都做了一下尝试体验其实是差不多的,但有可能新出的AIkit更好,由于钱包光光就没有尝试了。

本文作者:穆里流风

本文链接:https://www.cnblogs.com/sxljy/p/18736341

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   穆里流风  阅读(37)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起