2

教你在“狼人杀”中实现变声效果

 2 years ago
source link: https://segmentfault.com/a/1190000040794222
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

教你在“狼人杀”中实现变声效果

上一期我们介绍了如何使用华为音频编辑服务实现歌曲伴奏的分离,这一期我们将为大家介绍如何在社交游戏App中实现变声效果。

在狼人杀游戏中,如果用户可以选择自己想要的声音进行变声处理,不仅给游戏发言环节增加了趣味性,同时满足了部分用户不想曝光自己真实声音的需求。
我们来看一段狼人杀游戏中上警环节的发言变声。

发言台词:我是预言家,昨天晚上验了3号,TA是狼人,警徽给我,我来带队

查看Demo演示请移步华为开发者联盟网站HMS Core论坛:

https://developer.huawei.com/...

华为音频编辑服务(Video Editor Kit)支持根据指定的声音类型(大叔、萝莉、女声、男声、怪物等)对音频素材做变声处理。

下面我们就一起来实操一下如何接入华为音频编辑服务,实现变声效果。

1.1项目级build.gradle里配置Maven仓地址

buildscript {
    repositories {
        google()
        jcenter()
        // 配置HMS Core SDK的Maven仓地址。
        maven {url 'https://developer.huawei.com/repo/'}
    }
    dependencies {
        ...
        // 增加agcp插件配置。
        classpath 'com.huawei.agconnect:agcp:1.4.2.300'
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        // 配置HMS Core SDK的Maven仓地址。
        maven {url 'https://developer.huawei.com/repo/'}
    }
} 

1.2 文件头增加配置

apply plugin: 'com.huawei.agconnect'

1.3 应用级build.gradle里配置SDK依赖

dependencies{
    implementation 'com.huawei.hms:audio-editor-ui:{version}'
}

1. 4在AndroidManifest.xml文件中申请如下权限

<!--震动权限-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--麦克风权限-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--写存储权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--读存储权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--网络状态权限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--网络状态变化权限-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

2.代码开发

2.1创建您应用自定义的activity界面,用于选择音频,并将该音频文件路径用如下方式返回给音频编辑SDK。

// 将音频文件路径List返回给音频编辑页面
private void sendAudioToSdk() {
    // 获取到的音频文件路径 filePath
    String filePath = "/sdcard/AudioEdit/audio/music.aac";
    ArrayList<String> audioList = new ArrayList<>();
    audioList.add(filePath);
    // 将音频文件路径返回给音频编辑页面
    Intent intent = new Intent();
    // 使用sdk提供的HAEConstant.AUDIO_PATH_LIST
    intent.putExtra(HAEConstant.AUDIO_PATH_LIST, audioList);
    // 使用sdk提供的HAEConstant.RESULT_CODE为结果CODE
    this.setResult(HAEConstant.RESULT_CODE, intent);
    finish();
}

2.2在UI界面导入音频时,SDK会发送一个action值为com.huawei.hms.audioeditor.chooseaudio的intent以跳转到该activity。因此,该activity“AndroidManifest.xml”中的注册形式如下

<activity android:name="Activity "> 
<intent-filter> 
<action android:name="com.huawei.hms.audioeditor.chooseaudio"/> 
<category android:name="android.intent.category.DEFAULT"/> 
</intent-filter> 
</activity>

2.3启动音频编辑页面,点击“添加音频”,SDK会主动调用2.1定义的activity。添加完音频,就可以进行音频编辑、特效添加等操作,完成后导出编辑的音频

HAEUIManager.getInstance().launchEditorActivity(this);

2.4音频格式转换。

    调用transformAudioUseDefaultPath接口进行音频格式转换,转换后的音频文件导出到默认路径。
// 音频格式转换接口
HAEAudioExpansion.getInstance().transformAudioUseDefaultPath(context,inAudioPath, audioFormat, new OnTransformCallBack() {
    // 进度回调(0-100)
    @Override
    public void onProgress(int progress) {
    }
    // 转换失败
    @Override
    public void onFail(int errorCode) {
    }
    // 转换成功
    @Override
    public void onSuccess(String outPutPath) {
    }
    // 取消转换
    @Override
    public void onCancel() {
    }
    });
// 取消转换任务接口
HAEAudioExpansion.getInstance().cancelTransformAudio();

调用transformAudio接口进行音频格式转换,转换后的音频文件导出到目标路径。

// 音频格式转换接口
HAEAudioExpansion.getInstance().transformAudio(context,inAudioPath, outAudioPath, new OnTransformCallBack(){
    // 进度回调(0-100)
    @Override
    public void onProgress(int progress) {
    }
    // 转换失败
    @Override
    public void onFail(int errorCode) {
    }
    // 转换成功
    @Override
    public void onSuccess(String outPutPath) {
    }
    // 取消转换
    @Override
    public void onCancel() {
    }
    });
// 取消转换任务接口
HAEAudioExpansion.getInstance().cancelTransformAudio();

2.5 调用文件接口实现变声功能

    private ChangeSoundCallback callBack = new ChangeSoundCallback() {
        @Override
        public void onSuccess(String outAudioPath) {
            // 处理成功
        }
        @Override
        public void onProgress(int progress) {
            // 进度回调处理
        }
        @Override
        public void onFail(int errorCode) {
            // 处理失败
        }
        @Override
        public void onCancel() {
            // 取消处理
        }
    };

• 调用applyAudioFile接口进行变声。

    // 变声
    HAEChangeVoiceFile haeChangeVoiceFile = new HAEChangeVoiceFile();
    // 设置变声的类型
    haeChangeVoiceFile.changeSoundTypeOfFile(SoundType.AUDIO_TYPE_SEASONED);
    // 调用接口
    haeChangeVoiceFile.applyAudioFile(inAudioPath, outAudioDir, outAudioName, callBack);
    // 取消变声任务
    haeChangeVoiceFile.cancel();

2.6调用流式接口实现音频文件的变声处理,最终结果需要开发者自行设置

    // 变声
    HAEChangeVoiceStream haeChangeVoiceStream = new HAEChangeVoiceStream();
    // 设置音频的格式参数,返回设置结果res(注:当res为HAEErrorCode.SUCCESS时才可进行后续操作)
    int res = haeChangeVoiceStream.setAudioFormat(BIT_DEPTH, CHANNEL_COUNT, SAMPLE_RATE);
    //设置变声类型,返回设置结果changeRes(注:当res为HAEErrorCode.SUCCESS时才可进行后续操作)
    int changeRes = haeChangeVoiceStream.changeSoundType(SoundType.AUDIO_TYPE_SEASONED);
    // 对pcm数据(buffer)进行变声操作,返回变声后的pcm数据(resultByte)
    while(buffer!=null){
        byte[] resultByte = haeChangeVoiceStream.applyPcmData(buffer);
    }
    // 变声结束后释放资源
    haeChangeVoiceStream.release();

往期回顾:
华为音频编辑服务带你一键伴奏分离!

如您想了解更多详情,请参考:

华为开发者联盟音频编辑服务官网

获取开发音频编辑服务指导文档

获取开发指导文档:

Android SDK集成文档

iOS SDK集成文档

Web SDK集成文档

快应用SDK集成文档

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解 HMS Core 最新技术资讯~


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK