Separate Audio Sources in a Tap with Audio Editor Kit
Published: 2021-12-15 02:27:22

Audio Editor Kit from HMS Core provides the audio source separation function, which allows you to separate human voices, human voices from accompaniments, and human voices from musical instrument sounds. The image below shows the accompaniment separated from Dream it Possible.

![Image description](https://forum.xda-developers.com/attachments/png.5481077/)Let's see how to implement this function.

##Step 1 Prepare the File for Audio Source Separation

An MP3 audio file is recommended. If this is not possible, follow the instructions in step 2 to convert your audio file to an MP3 file. What if the accompaniment to be separated is in a video file? No worries. Just extract the video's audio first by referring to the instructions in step 2.

##Step 2 Integrate Audio Editor Kit​
**Development Practice​** 

***Preparations***
1.Configure the Maven repository address in the project-level 
 **build.gradle** file.

```
buildscript {
    repositories {
        google()
        jcenter()
        // Configure the Maven repository address for the HMS Core SDK.
        maven {url 'https://developer.huawei.com/repo/'}
    }
    dependencies {
        ...
        // Add the AppGallery Connect plugin configuration.
        classpath 'com.huawei.agconnect:agcp:1.4.2.300'
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        // Configure the Maven repository address for the HMS Core SDK.
        maven {url 'https://developer.huawei.com/repo/'}
    }
}
```
2.Add the following configuration under the declaration in the file header.
```
apply plugin: 'com.huawei.agconnect'
```
3.Add the build dependency on the Audio Editor SDK in the app-level **build.gradle** file.

```
dependencies{
    implementation 'com.huawei.hms:audio-editor-ui:{version}'
}
```
4.Apply for the following permissions in the **AndroidManifest.xml** file:

```
<!-- Vibrate -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- Microphone -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- Write into storage -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Read from storage -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Connect to Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Obtain the network status -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Obtain the changed network connectivity state -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
```

 **Code Development​** 
1.Create your app's custom activity and use it for selecting one or more audio files. Return their paths to the Audio Editor SDK in the following way

```
// Return the audio file paths to the audio editing screen.
private void sendAudioToSdk() {
    // Set filePath to the obtained audio file path.
    String filePath = "/sdcard/AudioEdit/audio/music.aac";
    ArrayList<String> audioList = new ArrayList<>();
    audioList.add(filePath);
    // Return the paths to the audio editing screen.
    Intent intent = new Intent();
    // Use HAEConstant.AUDIO_PATH_LIST provided by the Audio Editor SDK.
    intent.putExtra(HAEConstant.AUDIO_PATH_LIST, audioList);
    // Use HAEConstant.RESULT_CODE provided by the Audio Editor SDK as the result code.
    this.setResult(HAEConstant.RESULT_CODE, intent);
    finish();
}
```

2.Register the activity in the **AndroidManifest.xml** file as described in the following code. When you choose to import the selected audio files, the SDK will send an intent with the action value **com.huawei.hms.audioeditor.chooseaudio** to jump to the activity.
```
<activity android:name="Activity ">
<intent-filter>
<action android:name="com.huawei.hms.audioeditor.chooseaudio"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
```

3.Launch the audio editing screen. 

When you tap **Add audio** , the SDK will automatically call the activity defined earlier. Then you will be able to edit the audio and add special effects to the audio. After such operations are complete, the edited audio can be exported.
```
HAEUIManager.getInstance().launchEditorActivity(this);
```

4.Convert the audio file format that is not MP3 to MP3 (Optional)
Call transformAudioUseDefaultPath to convert the audio format and save the converted audio to the default directory.

```
// Convert the audio format.
HAEAudioExpansion.getInstance().transformAudioUseDefaultPath(context,inAudioPath, audioFormat, new OnTransformCallBack() {
   // Called to receive the progress which ranges from 0 to 100.
   @Override
   public void onProgress(int progress) {
   }
   // Called when the conversion fails.
   @Override
   public void onFail(int errorCode) {
   }
   // Called when the conversion succeeds.
   @Override
   public void onSuccess(String outPutPath) {
   }
   // Called when the conversion is canceled.
   @Override
   public void onCancel() {
   }
   });
// Cancel format conversion.
HAEAudioExpansion.getInstance().cancelTransformAudio();
```
Call **transformAudio** to convert the audio format and save the converted audio to a specified directory.

```
// Convert the audio format.
HAEAudioExpansion.getInstance().transformAudio(context,inAudioPath, outAudioPath, new OnTransformCallBack(){
    // Called to receive the progress which ranges from 0 to 100.
    @Override
    public void onProgress(int progress) {
    }
    // Called when the conversion fails.
    @Override
    public void onFail(int errorCode) {
    }
    // Called when the conversion succeeds.
    @Override
    public void onSuccess(String outPutPath) {
    }
    // Called when the conversion is canceled.
    @Override
    public void onCancel() {
    }
    });
// Cancel format conversion.
HAEAudioExpansion.getInstance().cancelTransformAudio();
```

5.Call **extractAudio** to extract audio from a video, which contains the accompaniment to be separated, to a specified directory. (Optional)

```
// outAudioDir (optional): path of the directory for storing the extracted audio.
// outAudioName (optional): name of the extracted audio, which does not contain the file name extension.
HAEAudioExpansion.getInstance().extractAudio(context,inVideoPath,outAudioDir, outAudioName,new AudioExtractCallBack() {
    @Override
    public void onSuccess(String audioPath) {
    Log.d(TAG, "ExtractAudio onSuccess : " + audioPath);
    }
    @Override
    public void onProgress(int progress) {
    Log.d(TAG, "ExtractAudio onProgress : " + progress);
    }
    @Override
    public void onFail(int errCode) {
    Log.i(TAG, "ExtractAudio onFail : " + errCode);
    }
    @Override
    public void onCancel() {
    Log.d(TAG, "ExtractAudio onCancel.");
    }
    });
// Cancel audio extraction.
HAEAudioExpansion.getInstance().cancelExtractAudio();
```

6.Call **getInstruments** and **startSeparationTasks** for audio source separation.

```
// Obtain the accompaniment ID using getInstruments and pass the ID to startSeparationTasks.
HAEAudioSeparationFile haeAudioSeparationFile = new HAEAudioSeparationFile();
haeAudioSeparationFile.getInstruments(new SeparationCloudCallBack<List<SeparationBean>>() {
    @Override
public void onFinish(List<SeparationBean> response) {
// Called to receive the separation data including the accompaniment ID.
}
    @Override
    public void onError(int errorCode) {
        // Called when an error occurs during separation.
}
});
// Set the parameter for separation.
List instruments = new ArrayList<>();
instruments.add ("accompaniment ID")
haeAudioSeparationFile.setInstruments(instruments);
// Start separating.
haeAudioSeparationFile.startSeparationTasks(inAudioPath, outAudioDir, outAudioName, new AudioSeparationCallBack() {
    @Override
    public void onResult(SeparationBean separationBean) { }
    @Override
    public void onFinish(List<SeparationBean> separationBeans) {}
    @Override
    public void onFail(int errorCode) {}
    @Override
    public void onCancel() {}
});
// Cancel audio source separation.
haeAudioSeparationFile.cancel();
```
After completing these steps, you can get the accompaniment you desire. To create something similar to the demo, you can use a video editing program to synthesize the accompaniment with images and lyrics.

##References​

For more details, you can go to:
Audio Editor Kit [official website](https://developer.huawei.com/consumer/en/hms/huawei-audio-editor/?ha_source=hms1)
Audio Editor Kit [Development Documentation page](https://developer.huawei.com/consumer/en/doc/development/Media-Guides/introduction-0000001153026881?ha_source=hms1), to find the documents you need
[Reddit](https://www.reddit.com/r/HMSCore/) to join our developer discussion
[GitHub](https://github.com/HMS-Core/hms-audio-editor-demo) to download AudioEditor Kit sample codes
[Stack Overflow](https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Votes) to solve any integration problems