logo
产品简介 产品简介
基本概念 基本概念
平台新手指引 平台新手指引
计价模式 计价模式
开发者文档下拉
开放平台计价
定制服务计价
获取访问令牌 获取访问令牌
语音合成 语音合成
开发者文档下拉
接口说明
发音人列表
在线合成 开发者文档下拉
Android SDK
iOS SDK
C++(Linux) SDK
RESTful API
Websocket API
长文本语音合成API
离线合成 开发者文档下拉
离线合成 Android SDK
离线合成 iOS SDK
语音识别 语音识别
开发者文档下拉
一句话识别 开发者文档下拉
RESTful API
Websocket API
实时长语音识别 开发者文档下拉
Websocket API
录音文件识别 开发者文档下拉
RESTful API
SDK文档 开发者文档下拉
Android SDK
iOS SDK
声音复刻 声音复刻
开发者文档下拉
定制模型 开发者文档下拉
RESTful API
Android SDK
iOS SDK
语音合成 开发者文档下拉
RESTful API
声音转换 声音转换
开发者文档下拉
Websocket API
Android SDK
iOS SDK
协议规则 协议规则
开发者文档下拉
平台服务协议
平台通用规则
法律声明及隐私政策
服务等级协议SLA
常见问题 常见问题
开发者文档下拉
语音合成
语音识别

声音转换Android SDK

概述

本 SDK 旨在使开发者更方便的接入标贝科技的变声功能。里面内置了录音功能,免去开发者实现录音的功能。

SDK 下载地址

下载地址: https://github.com/data-baker/BakerVoiceConvertAndroid

SDK 使用说明

  • 1. 导入依赖
    implementation 'com.squareup.okhttp3:okhttp:4.8.0' //访问网络请求
    implementation 'com.google.code.gson:gson:2.8.6' //Json对象序列号
    implementation 'androidx.core:core:1.3.2' //检测录音权限
  • 2. 导入SDK
    • aar包导入: 先将 SDK 和 Demo 下载到本地。 将 aar 文件夹下的 voiceconvert-release.aar 拷贝到项目 libs 目录下。并将 build.gradle 文件进行如下配置。
      implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    • 源码导入: 在 AndroidStudio 中选择 File -> New -> Import Module 选择源码中的 voiceconvert 文件夹导入即可。并将 build.gradle 文件进行如下配置。
      implementation project(path: ':voiceconvert')
  • 3. 运行流程图
  • 4. 示例代码
    • 申请录音权限
      if (Build.VERSION.SDK_INT > 23) {
      int resultCode = ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);
          if (resultCode != PERMISSION_GRANTED) {
              ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSION_REQ_CODE);
          }
      }
      
      @Override
      public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          if (requestCode == PERMISSION_REQ_CODE) {
      	int result = grantResults[0];
              if (result == PERMISSION_GRANTED) {
                  log("权限获取成功");
              }
          }
      }
      
    • 鉴权
      VoiceConvertManager.getInstance().auth(
              "clientId",
              "clientSecret", new AuthCallback() {
                  @Override
                  public void onResult(boolean result) {
                      if (result) {
                          //鉴权成功
                      } else {
                          //鉴权失败
                      }
                  }
              }
      );
    • 调用 SDK 开始录音方法
      VoiceConvertManager.getInstance().startRecord(new SpeechCallback() {
          @Override
          public void canSpeech() {
              //此时可以说话了
          }
      });
    • 音频返回处理
      VoiceConvertManager.getInstance().setAudioCallBack(new AudioOutPutCallback() {
          @Override
          public void onAudioOutput(byte[] audioArray, boolean isLast, String traceId) {
              //audioArray 就是返回的音频序列,可自行对其进行处理,示例代码功能为先存到本地,然后进行播放,可运行Demo体验。
              try {
                  if (bufferedSink == null) {
                      File file = new File(mVCFilePath);
                      if (file.exists()) {
                          file.delete();
                      }
                      bufferedSink = Okio.buffer(Okio.sink(file));
                  }
                  bufferedSink.write(audioArray);
                  if (isLast) {
                      bufferedSink.close();
                      bufferedSink = null;
                      //最后一包已经收到,可以开始播放
                      startPlay();
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      });
      
      /**
       * 播放音频示例代码
       */
      private void startPlay() {
          int iMinBufSize = AudioTrack.getMinBufferSize(SAMPLE_RATE,
                  AudioFormat.CHANNEL_OUT_MONO,
                  AudioFormat.ENCODING_PCM_16BIT);
          audioTrack = new AudioTrack.Builder()
                  .setAudioAttributes(new AudioAttributes.Builder()
                          .setUsage(AudioAttributes.USAGE_MEDIA)
                          .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                          .setLegacyStreamType(AudioManager.STREAM_MUSIC)
                          .build())
                  .setAudioFormat(new AudioFormat.Builder()
                          .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                          .setSampleRate(SAMPLE_RATE)
                          .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
                          .build())
                  .setTransferMode(AudioTrack.MODE_STREAM)
                  .setBufferSizeInBytes(iMinBufSize)
                  .build();
          audioTrack.play();
          try {
              File file = new File(mVCFilePath);
              BufferedSource bufferedSource = Okio.buffer(Okio.source(file));
              byte[] tempByteArray = new byte[1024];
              int len = 0;
              while ((len = bufferedSource.read(tempByteArray)) != -1) {
                  audioTrack.write(tempByteArray, 0, len);
              }
              //声音播放完毕
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
    • 全局异常处理
      VoiceConvertManager.getInstance().setErrorCallback(new ErrorCallback() {
          @Override
          public void onError(String errorCode, String errorMessage, String traceId) {
          //此方法回调全局的错误信息,开发人员应该时刻关注此方法的日志
          }
      });
    • 直接传入文件进行声音转换
      String filePath = "xxx";
      VoiceConvertManager.getInstance().startRecordFromFile(filePath);
    • 自行录音往 SDK 发送音频
      首先设置对网络接口调用的监听,当网络接口打开时,才可进行音频数据发送。
      注意:变声目前只支持采样率16k位深16bit的音频数据。
      VoiceConvertManager.getInstance().setWebSocketOnOpen(new WebSocketOpenCallback() {
          @Override
          public void onResult(boolean result) {
              if (result) {
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          startRecord();
                      }
                  }).start();
              } else {
                  //建立网络连接失败,请关注错误回调接口信息
              }
          }
      });
      
      private void startRecord() {
          Utils.log("开始录音");
          isRecording = true;
          int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                  AudioFormat.CHANNEL_IN_MONO,
                  AudioFormat.ENCODING_PCM_16BIT);
          AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
                  SAMPLE_RATE,
                  AudioFormat.CHANNEL_IN_MONO,
                  AudioFormat.ENCODING_PCM_16BIT,
                  bufferSizeInBytes * 2);
          audioRecord.startRecording();
          //通过改变 isRecording 的值来停止录音
          while (isRecording) {
      	byte[] tempArray = new byte[10240];
              audioRecord.read(tempArray, 0, tempArray.length);
              VoiceConvertManager.getInstance().sendAudio(tempArray, false);
          }
          VoiceConvertManager.getInstance().sendAudio(new byte[]{}, true);
      }

SDK 调用说明

  • 鉴权
    void auth(String clientId, String clientSecret, AuthCallback callback);
    参数名 类型 含义
    clientId String 购买服务时申请的clientId
    clientSecret String 购买服务时申请的clientSecret
    AuthCallback 回调类型 void onResult(boolean result)
    对鉴权接口的结果回调,true代表鉴权成功,false代表鉴权失败。只有鉴权成功后才能进行后续操作。

  • 设置音色
    void setVoiceName(String voiceName);
    参数名 类型 含义
    voiceName String 音色名称,默认音色"Vc_jiaojiao"

  • 设置开启VAD,非必调用
    void setVadEnable(boolean bool);
    参数名 类型 含义
    bool Boolean true代表启动服务端vad功能,默认false。如果启动系统会根据输入音频进行检测,过滤环境噪音。否则直接将原始输入音频进行转换。默认false。

  • 设置音频是否对齐 ,非必调用
    void setAudioAlign(boolean bool);
    参数名 类型 含义
    bool Boolean true代表输出音频与输入音频进行对齐,默认false。即开启vad时会保留静音部分,false丢弃静音部分。 默认false。

  • 开始录音
    void startRecord(SpeechCallback speechCallback);
    参数名 类型 含义
    speechCallback SpeechCallback void canSpeech();
    此方法回调说明内部接口连接成功,可以开始录音了。可以在此回调方法中进行录音开始的界面显示。

  • 停止录音
    void stopRecord();
    停止 SDK 内部录音。在停止录音后,一般还需要过一段时间才能收到音频返回的最终包。

  • 音频实时返回
    void setAudioCallBack(AudioOutPutCallback callBack);
    注意!无论是使用 SDK 内部录音转换还是自己传入音频进行转换,转换后的音频都是从此方法中回调输出。
    参数名 类型 含义
    callback AudioOutPutCallback 对音频处理结果进行回调

    AudioOutPutCallback
    回调方法参数 类型 含义
    audioArray byte[] pcm音频字节序列。
    isLast boolean 是否是最后一包,true代表是最后一包,音频返回完毕。
    traceId String 本次声音转换唯一标识id,如果转换效果出现问题,反馈问题时请带上此信息。

  • 直接传入文件进行声音转换
    void startRecordFromFile(String filePath);
    参数名 类型 含义
    filePath String 文件路径

  • 与后台接口建立连接成功回调
    setWebSocketOnOpen(Callback callback)
    参数名 类型 含义
    result Boolean true代表连接已经打开,打开成功后才能调用发送音频方法
    false代表失败

  • 发送音频
    void sendAudio(byte[] byteArray, boolean isLast); 注意!此方法发送的音频只能是16k采样率16bit位深的pcm音频。
    参数名 类型 含义
    audioArray byte[] 音频字节序列
    isLast Boolean 是否是最后一包

  • 全局错误回调
    void setErrorCallback(ErrorCallback callback);
    参数名 类型 含义
    callback ErrorCallback 此方法为全局的异常信息回调。

    ErrorCallback
    参数名 类型 含义
    errorCode String 错误码
    errorMessage String 错误信息
    traceId String 针对每次变声的唯一标识

错误码

错误码 含义
19100001 无token,请先进行鉴权
19100002 网络请求出错
19100003 读取文件异常