聲臨其境,輕鬆幾步教你把音訊變成3D環繞音
在音樂創作、音影片剪輯和遊戲等領域中,給使用者帶來沉浸式音訊體驗越來越重要。開發者如何在應用內打造3D環繞聲效?華為音訊編輯服務6.2.0版本此次帶來了空間動態渲染功能,可以將人聲、樂器等音訊元素渲染到指定的三維空間方位,支援靜態和動態渲染兩種模式,進一步提升應用中的音效體驗。開發者可以點選檢視以下Demo演示,瞭解整合效果並上手實驗功能特性。
開發實戰
1. 開發準備
開發者提前準備音樂素材,MP3格式最佳。其他音訊格式請參考“2.4”步驟轉換,影片格式請參考“2.5”步驟進行音訊提取。
1.1專案級build.gradle裡配置Maven倉地址:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 檔案頭增加配置:
1 | apply plugin: 'com.huawei.agconnect' |
1.3 應用級build.gradle裡配置SDK依賴:
1 2 3 | dependencies{ implementation 'com.huawei.hms:audio-editor-ui:{version}' } |
1.4在AndroidManifest.xml檔案中申請如下許可權:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <! - - 震動許可權 - - > <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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / / 將音訊檔案路徑 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”中的註冊形式如下:
1 2 3 4 5 6 | <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。新增好音訊,就可以進行音訊編輯、特效新增等操作,完成後匯出編輯音訊。
1 | HAEUIManager.getInstance().launchEditorActivity(this); |
2.4.如果音訊素材不是MP3格式,此步驟可以完成音訊格式轉換:
呼叫transformAudioUseDefaultPath介面進行音訊格式轉換,轉換後的音訊檔案匯出到預設路徑。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | / / 音訊格式轉換介面 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介面進行音訊格式轉換,轉換後的音訊檔案匯出到目標路徑。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | / / 音訊格式轉換介面 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如果素材是影片格式,可以呼叫extractAudio介面進行音訊提取,從影片中提取音訊檔案再匯出到指定目錄:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | / / outAudioDir提取出的音訊儲存的資料夾路徑,非必填 / / outAudioName提取出的音訊名稱,不帶字尾,非必填 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." ); } }); / / 取消音訊提取任務介面 HAEAudioExpansion.getInstance().cancelExtractAudio(); |
2.6呼叫getInstruments和startSeparationTasks介面進行伴奏提取。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | / / 獲取提取伴奏型別 ID ,後面將此 ID 傳給介面 HAEAudioSeparationFile haeAudioSeparationFile = new HAEAudioSeparationFile(); haeAudioSeparationFile.getInstruments(new SeparationCloudCallBack< List <SeparationBean>>() { @Override public void onFinish( List <SeparationBean> response) { / / 返回的資料,包括伴奏的型別 ID } @Override public void onError( int errorCode) { / / 失敗返回 } }); / / 設定要提取的伴奏引數 List instruments = new ArrayList<>(); instruments.add(“伴奏 id ”); haeAudioSeparationFile.setInstruments(instruments); / / 開始進行伴奏分離 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() {} }); / / 取消分離任務 haeAudioSeparationFile.cancel(); |
2.7呼叫applyAudioFile介面進行空間方位渲染。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | / / 空間方位渲染 / / 固定擺位 HAESpaceRenderFile haeSpaceRenderFile = new HAESpaceRenderFile(SpaceRenderMode.POSITION); haeSpaceRenderFile.setSpacePositionParams( new SpaceRenderPositionParams(x, y, z)); / / 動態渲染 HAESpaceRenderFile haeSpaceRenderFile = new HAESpaceRenderFile(SpaceRenderMode.ROTATION); haeSpaceRenderFile.setRotationParams( new SpaceRenderRotationParams( x, y, z, surroundTime, surroundDirection)); / / 擴充套件 HAESpaceRenderFile haeSpaceRenderFile = new HAESpaceRenderFile(SpaceRenderMode.EXTENSION); haeSpaceRenderFile.setExtensionParams(new SpaceRenderExtensionParams(radiusVal, angledVal)); / / 呼叫介面 haeSpaceRenderFile.applyAudioFile(inAudioPath, outAudioDir, outAudioName, callBack); / / 取消空間方位渲染 haeSpaceRenderFile.cancel(); |
完成以上步驟,就可以得到對應的空間動態渲染效果,在應用內輕鬆實現2D轉3D音效啦!這項功能還可以應用到企業會議以及運動康復領域,比如在展會上進行產品沉浸式展示、作為視障人群的方向感線索,為日常生活提供便利等。開發者們可以根據自己應用的實際需求選擇使用,如需瞭解更多詳情,請參考:
華為開發者聯盟音訊編輯服務官網; 獲取整合音訊編輯服務指導文件。
瞭解更多詳情>>
訪問華為開發者聯盟官網
獲取開發指導文件
華為移動服務開源倉庫地址:GitHub、Gitee
關注我們,第一時間瞭解 HMS Core 最新技術資訊~
相關文章
- 教你8步輕鬆上手kafka2022-12-27Kafka
- audition 音訊 聲音 變慢 減速 增加響度 增大音量2024-04-17音訊
- 華為音訊編輯服務實時變聲,大叔音怪獸音隨意變換2022-05-06音訊
- Java 把多個音訊拼接成一個2024-06-28Java音訊
- MIT又出新玩法,利用AI可輕鬆分離視訊中的樂器聲音2018-07-09MITAI
- 聲網 MetaKTV 技術揭祕之“聲臨其境”:3D 空間音效+空氣衰減+人聲模糊2022-02-243D
- 關於CakeWalk匯出音訊前幾秒聲音過大的問題2024-05-26音訊
- 輕鬆兩步,搭建斷點除錯 PHP 原始碼環境2021-04-24斷點除錯PHP原始碼
- 頭條號音訊專案,輕鬆日入200+2022-01-22音訊
- 輕鬆使用 Linux Equinox 桌面環境2020-01-03LinuxUI
- 簡單幾步,教你在mac電腦上輕鬆啟用懸停文字!2021-07-20Mac
- 【梟·音訊】聲隨意動——淺談《暗影火炬城》聲音設計2021-09-22音訊
- 如何查詢和關閉Safari的音訊聲音2021-10-09音訊
- “假聲音”也來了,手把手教你造一隻柯南的蝴蝶結變聲器2019-03-01
- FAQ-MT5193 atv調節聲音大小,不起作用,聲音無變化2019-06-19
- 一步一步教你實現iOS音訊頻譜動畫(二)2019-03-07iOS音訊動畫
- 一步一步教你實現iOS音訊頻譜動畫(一)2019-02-27iOS音訊動畫
- AR空間音訊能力,打造沉浸式聲音體驗2022-11-10音訊
- OpenAI:可從15秒的音訊中克隆出聲音2024-03-30OpenAI音訊
- 【秒懂音視訊開發】06_重識聲音2021-03-10
- win10 主機後置音訊沒聲音怎麼辦_win10主機背部音訊輸出無聲音解決方法2020-04-29Win10音訊
- RTC 科普視訊丨聊聊空間音訊的原理與其背後的聲學原理2022-05-03音訊
- 聲音還能向量化?阿里技術專家教你三步搭建一套聲紋系統2020-07-06阿里
- 如何把你的樹莓派變成一個 HiFi 音樂系統2021-03-26樹莓派
- win10錄屏如何錄製聲音_win10錄屏錄製聲音的步驟2022-01-22Win10
- 只聞其聲也能「看透」你,來自「聲音畫像師」的秘密2019-04-22
- 聲音洩露?可能被複制的“聲音DNA”2019-06-25
- CRI新音訊工作室設立、強化音訊(音樂、聲優等)製作業務2022-02-10音訊
- 如何基於實時聲紋變聲實現對聲音的“克隆”2022-03-19
- 公司網站修改聯絡人,輕鬆幾步完成2024-12-08網站
- 聲音魔法課2024-10-22
- android音視訊指南-處理音訊輸出的變化2019-03-01Android音訊
- next.js+koa2+antd環境輕鬆搭建2019-04-20JS
- Android Spotify 將可以輕鬆選擇想要的音樂2018-12-12Android
- 音訊演算法之小黃人變聲 附完整C程式碼2018-09-22音訊演算法C程式
- 只聞其聲也能「看透」你,來自「聲音畫像師」的祕密2019-04-22
- mirrord:輕鬆地將流量從生產環境映象到開發環境2022-03-08開發環境
- WIN10怎麼把音訊裁剪 WIN10系統如何裁剪音訊2020-11-11Win10音訊