DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

Jackson for HMS Core

Posted on

Separate Audio Sources in a Tap with Audio Editor Kit

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 descriptionLet'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/'}
    }
}
Enter fullscreen mode Exit fullscreen mode

2.Add the following configuration under the declaration in the file header.

apply plugin: 'com.huawei.agconnect'
Enter fullscreen mode Exit fullscreen mode

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}'
}
Enter fullscreen mode Exit fullscreen mode

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" />
Enter fullscreen mode Exit fullscreen mode

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();
}
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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
Audio Editor Kit Development Documentation page, to find the documents you need
Reddit to join our developer discussion
GitHub to download AudioEditor Kit sample codes
Stack Overflow to solve any integration problems

Top comments (0)

All DEV content is created by the community!

Hey, if you're landing here for the first time, you should know that this website is a global community of folks who blog about their experiences to help folks like you out.

Sign up now if you're curious. It's free!