logo
产品简介 产品简介
基本概念 基本概念
平台新手指引 平台新手指引
计价模式 计价模式
开发者文档下拉
开放平台计价
定制服务计价
获取访问令牌 获取访问令牌
语音合成 语音合成
开发者文档下拉
接口说明
发音人列表
短文本合成 开发者文档下拉
Android SDK
iOS SDK
C++(Linux) SDK
RESTful API
Websocket API
长文本合成 开发者文档下拉
长文本合成API
离线合成 开发者文档下拉
模型文件说明
离线合成(普通版) Android SDK
离线合成(普通版) iOS SDK
离线合成(精品版) Android SDK
离线合成(精品版) iOS SDK
XML标签
SSML标签
语音合成时间戳功能
语音识别 语音识别
开发者文档下拉
音频格式说明
一句话识别 开发者文档下拉
RESTful API
Websocket API
Android SDK
iOS SDK
实时长语音识别 开发者文档下拉
Websocket API
Android SDK
iOS SDK
录音文件识别 开发者文档下拉
RESTful API
自学习工具 开发者文档下拉
热词
个性化模型
声音复刻 声音复刻
开发者文档下拉
定制模型 开发者文档下拉
RESTful API
Android SDK
iOS SDK
定制声音合成 开发者文档下拉
RESTful API
声音转换 声音转换
开发者文档下拉
发音人列表
Websocket API
Android SDK
iOS SDK
离线声音转换 离线声音转换
开发者文档下拉
发音人列表
Android SDK
iOS SDK
声纹识别 声纹识别
开发者文档下拉
RESTful API
语音评测 语音评测
开发者文档下拉
RESTful API
声音理解 声音理解
开发者文档下拉
RESTful API
协议规则 协议规则
开发者文档下拉
平台服务协议
平台通用规则
法律声明及隐私政策
服务等级协议SLA
常见问题 常见问题
开发者文档下拉
语音合成
语音识别

离线声音转换Android SDK

1.下载安装

项目地址: https://github.com/data-baker/VoiceConvertOffLine

2. Android Studio 集成 SDK(参考 demo)

1.1 将 voiceconvertoffline-release.aar 文件拷贝到 module 下的 libs 文件夹内,另在该 module 的 build.gradle 文件中添加上加载 aar 文件的配置信息。

      dependencies {
        implementation fileTree(dir: 'libs', include: ['*.aar'])
       … }
    

1.2 在 module 下 build.gradle 文件中添加 okhttp、gson 基础库包。

      dependencies {
        implementation 'com.squareup.okhttp3:okhttp:4.2.2'
        implementation 'com.google.code.gson:gson:2.8.6'
      }
    

或者将对应.jar/.aar 包添加至工程 module 下,lib 文件夹里。


注意:SDK 内使用了 okhttp、gson 所以需要开发者添加以这两个库,若工程内已 存在,无需重复添加。okhttp 请使用 4.x 版本,以免出现版本兼容 bug。


1.3 在 Module 的 AndroidManifest.xml 文件中添加权限。6.0 以上需要动态申请 RECORD_AUDIO 、WRITE_EXTERNAL_STORAGE 权限。

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    

1.4 关于混淆

SDK 中用到了 okhttp 和 gson,所以需要将这两个包的混淆代码添加上。具 体混淆代码可以去官方文档上查阅。如果项目中已经有这两个包的混淆代码,不 必重复添加。请加上我们 SDK 其他类的混淆代码,如下:

      -keep class com.baker.voiceconvert.offline.bean.** { *; }
      -keep public class com.baker.voiceconvert.offline.VoiceConvertOffLineManager{*;}
      -keep public class com.baker.jni.voice.convert.VoiceConvertEngine{*;}
      -keep public class com.baker.voiceconvert.offline.callback.OffLineConvertCallBack{*;}
      -keep public class com.baker.voiceconvert.offline.util.WriteLog{*;}
      -keep public class com.baker.voiceconvert.offline.callback.ConvertInnerCallBack{*;}
      -keep public class com.baker.voiceconvert.offline.util.ThreadPoolUtil{*;}
      -keep public class com.baker.voiceconvert.offline.util.HLogger{*;}
      

3. SDK 关键类

1. VoiceConvertOffLineManager:声音转换关键业务处理类,全局只需一个实例 即可。


2. OffLineConvertCallBack:声音转换业务回调类。您可以在这些个回调方法中 获取到当前转换的进度状态、转换后声音的播放状态和各类数据结果,或者 错误信息。注意回调方法都是运行在子线程的。

4. 调用说明

  • 3.1 实例化 VoiceConvertOffLineManager 类,得到 VoiceConvertOffLineManager 的实例。

    VoiceConvertOffLineManager manager = new VoiceConvertOffLineManager();
  • 3.2 初始化 SDK。

     manager.initVoiceConvertSDK(Context context, String clientId, String secret,OffLineConvertCallBack cb);

    初始化这一步会进行网络请求,做授权操作。所以在实际调用过程中,请将 此步骤尽可能提前调用,保障足够时间进行网络授权请求。离线设备授权仅第一 次需要联网激活,此后无需联网授权激活。

  • 3.3 离线声音转换支持 3 种转换场景,第一种是 SDK 内调用手机麦克风录音、转 换返回转换结果。第二种场景是接收 pcm 文件路径,sdk 读取文件进行转换,返 回转换结果。第三种场景是接收 pcm 字节流,SDK 收到数据完成转换,返回转换 结果。三种方式会实时返回转换结果,同时会将转换结果在 sd 卡中缓存成一个 pcm 文件,仅存在一个文件,后一次转换会覆盖前一次转换后结果的文件,故需 要接入方提前获取应用的 sd 卡读写权限。若使用第一种方式也需要接入方提前 获取应用的录音权限,同时录音原文件也会缓存一份,再次录音转换会覆盖前一 次录音备份文件。

    第一种场景(SDK 内调用手机麦克风录音转换):

    A. 需要应用取得录音权限、sd 卡读写权限。

    B. 调用 manager.startRecordAndConvert();开启 sdk 录音说话。录音开启成功后会回调 onReadyForConvert()方法。注意所有回调方法均运行在子线程中。录音 转换过程中,回调方法 onResult(byte[] audioData, int endFlag)会实时返回转换 结果。audioData 是转换后数据,endFlag==1 代表转换结束。

    C. 调用 manager.stopRecord(); 方法结束录音。转换完成时回调方法 onConvertCompleted()会执行。

    D. 然后可以调用 manager.play();对转换后声音进行播放。播放过程中的播放状态 回调方法详见表 4.2。若需要边转换边播放,可以考虑在 onResult(byte[] audioData, int endFlag)回调方法里面接收到转换后数据后自行实现播放逻 辑,不使用 sdk 自带播放器进行播放。

    E. 若要再次执行录音、转换、播放,请重复 B、C、D 步骤即可。

    第二种场景(接收声音文件路径转换):

    A. 需要应用取得 sd 卡读写权限。

    B. 调用 manager. startConvertByPCM(); 开启转换。Sdk准备好后会 回调 onReadyForConvert()方法。注意所有回调方法均运行在子线程中。

    C. 在 onReadyForConvert()回调方法执行后,调用 manager.convert(path);方法对声 音文件进行转换。转换过程中,回调方法 onResult(byte[] audioData, int endFlag) 会实时返回转换结果。audioData 是转换后数据,endFlag==1 代表转换结束。 转换完成时回调方法 onConvertCompleted()会执行。

    D. 然后可以调用 manager.play();对转换后声音进行播放。播放过程中的播放状态 回调方法详见表 4.2。也可根据自身需求,在 onResult(byte[] audioData, int endFlag)回调方法里面接收到转换后数据后自行实现播放逻辑,不使用 sdk 自带播放器进行播放。

    E.若要再次执行录音、转换、播放,请重复 B、C、D 步骤即可。

    第三种场景(接收声音字节流转换):

    A. 需要应用取得 sd 卡读写权限。

    B. 调 用 manager. startConvertByPCM(); 开 启 转 换 。 Sdk 准 备 好 后 会 回 调 onReadyForConvert()方法。注意所有回调方法均运行在子线程中。

    C. 在 onReadyForConvert() 回 调 方 法 执 行 后 , 可 多 次 调 用 sendData(byte[] audioData, int index);方法对音频流进行转换,index 是发包序号,从 0 开始计 数自增,最后一包 index 需(乘以-1)变负数。也可以所有数据发完后,最 后发一个空包,将 index 变负数后调用 sendData(null, -xx)方法发给 SDK。转换过程中,回调方法 onResult(byte[] audioData, int endFlag)会实时返回转换结 果。audioData 是转换后数据,endFlag==1 代表转换结束。转换完成时回调 方法 onConvertCompleted()会执行。

    D. 然后可以调用 manager.play();对转换后声音进行播放。播放过程中的播放状态 回调方法详见表 4.2。也可根据自身需求,在 onResult(byte[] audioData, int endFlag)回调方法里面接收到转换后数据后自行实现播放逻辑,不使用 sdk 自带播放器进行播放。

  • 3.4 在确定不再使用转换后,比如在页面销毁或者进程退出的地方,调用 manager. onRelease ()释放 SDK 资源。

5. 方法说明

4.1 VoiceConvertOffLineManager 基本调用方法说明

方法名 方法作用 说明
initVoiceConvertSDK(context, clientId, secret, callBack) 初始化SDK 必须调用此方法初始化 SDK,详见 3.2。clientId、secret等信息请从标贝配置平台获取。callBack 是OffLineConvertCallBack。
startRecordAndConvert() 开启录音转换 使用 sdk 内部唤起的录音,进行声音转换。开启成功后,onReadyForConvert()回调方法会执行。转换结果通过onResult(byte[] audioData, int endFlag)回调实时返回,转换完成后会执行 onConvertCompleted() 回调方法。
stopRecord() 结束录音 配合 startRecordAndConvert ( )方法使用,结束 sdk 录音转换。
play() 播放 调用 sdk 内播放器,播放转换后声音。三种转换方式转 换后,均可调用 sdk 内部播放器进行播放控制。
pause() 暂停 暂停 sdk 内播放器播放,调用 play()方法可恢复播放
setVadEnable() 设置开启VAD
stopPlay() 停止播放 停止 sdk 内播放器,并清除掉播放器内数据。
startConvertByPCM() 开启数据转换 文件或者音频数据流转换启动方法,此 2 种转换均需调 用此方法开启转换。开启成功后,onReadyForConvert() 回调方法会执行。
convert(String path) 文件转换方法 需要先调用 startConvertByPCM(),然后在收到onReadyForConvert()回调后,调用 convert (path)方法进 行音频文件转换。转换结果通过 onResult(byte[]audioData, int endFlag)回调实时返回,转换完成后会执行onConvertCompleted()回调方法。
sendData(byte[] audioData, int index) 音频字节流数据转换方法 需要先调用 startConvertByPCM(),然后在收到onReadyForConvert()回调后,多次调用 sendData(byte[]audioData, int index)方法进行音频流转换。index 是发包序号,从 0 开始计数自增,最后一包 index 需(乘以-1)变负数。也可以所有数据发完后,最后发一个空包,将index 变负数后调用 sendData(null, -xx)方法发给 SDK。转换结果通过 onResult(byte[] audioData, int endFlag)回 调实时返回,转换完成后会执行 onConvertCompleted()回调方法。
setSpeakerId(String speakerId) 设置目标声音模型名称 每次转换前可设置音色名称,默认音色是萝莉音 "Vc_luoli",音色列表见 4.3,例如:setSpeakerId(”Vc_luoli”);。
getOriginRecordFile() 获取原始录音文件 如果是通过 sdk 录音转换,可以通过这个方法拿到原始录音文件路径。每次录音都会覆盖前一次录音的原始文件,录音文件路径和文件名固定不变。若未录音调用此方法,也会返回路径,但是文件可能不存在。所以使用此路径时,建议检测文件是否存在。
getConvertResultFile() 获取转换后录音文件 无论哪种转换方式,每次转换后,sdk 都会将转换后的音频存储在一个文件中,可以通过此方法拿到转换后声 音文件。每次转换都会覆盖前一次转换的结果文件。此文件路径和文件名固定不变。
release() 释放 sdk 资源 在确定不再使用服务之后,比如页面销毁或者退出程序时,可以调用此方法回收 sdk 资源,避免内存泄漏等情况。

4.2 OffLineConvertCallBack 回调类方法说明

方法名 作用 说明
onReadyForConvert() 准备就绪 鉴权通过,准备就绪后回调,三种转换方式均会回调。所有回调方法均运行在子线程中。
onResult(byte[]audioData, int endFlag) 转换数据实时回调方法 若想自行处理转换后数据,可使用此回调方法中的数据。 endFlag == 1 代表转换结束。
onConvertCompleted() 转换完成回调 每次转换完成,均会有此回调
volumeChange(intvolume) 录音音量分贝值回调 如果通过 sdk 自带录音功能进行转换,这个回调会返回录 音过程中声音的分贝值,返回时间间隔 100ms。
onPlaying() 播放中回调 调用 sdk 内部播放器进行播放时,正在播放中状态回调。
onPaused() 播放暂停回调 调用 sdk 内部播放器进行播放时,暂停播放状态回调。
onPlayCompleted() 播放完成回调 调用 sdk 内部播放器进行播放时,播放完成回调。
onStopped() 停止播放回调 调用 sdk 内部播放器进行播放时,停止播放回调。
onError(String errorCode, String errorMessage) 转换出现错误回 调 String code 是错误码,错误码具体请参考以下错误码对照表。String message 是具体的错误信息日志。

4.3 离线转换音色列表

名字 voice name 参数(首字母大写) 支持采样率(Hz)
萝莉音 Vc_luoli 16K
大叔 Vc_dashu 16K
搞怪 Vc_gaoguai 16K
空灵 Vc_kongling 16K
霸王龙 Vc_bawanglong 16K
重金属 Vc_zhongjinshu 16K
机械音 Vc_jixieyin 16K

4.4 发生异常时返回的 code 对应表

错误码 含义 类别
22180001 无 SD 卡读写权限错误 SDK 内部错误码
22180002 离线 SDK 授权错误
22180003 离线 SDK 初始化相关错误
22180004 开始转换后激活授权失败
22180005 使用 sdk 自带 recorder 相关错误
22180006 使用 sdk 自带 Player 相关错误