虛擬偶像的歌聲原來是這樣生成的!

来源:https://www.cnblogs.com/hmscore/archive/2022/07/27/16523468.html
-Advertisement-
Play Games

HMS Core音頻編輯服務(Audio Editor Kit)6.6.0版本上線,新增歌聲合成能力。通過歌詞和曲調,結合不同的曲風讓機器也能生成真實度極高的歌聲。支持字級別輸入歌詞進行音素轉換,生成對應歌詞的歌聲,可靈活調整音高、滑音、呼吸音、顫音等細節參數,讓歌聲更真實。 歌聲合成服務可廣泛應用 ...


HMS Core音頻編輯服務(Audio Editor Kit)6.6.0版本上線,新增歌聲合成能力。通過歌詞和曲調,結合不同的曲風讓機器也能生成真實度極高的歌聲。支持字級別輸入歌詞進行音素轉換,生成對應歌詞的歌聲,可靈活調整音高、滑音、呼吸音、顫音等細節參數,讓歌聲更真實。

歌聲合成服務可廣泛應用於音視頻創意製作、影音娛樂、音樂教育、虛擬偶像等領域。例如,在音樂創作或短視頻創意編輯時,歌聲合成服務可以助力用戶自由創作合成歌曲,使創作更加豐富多彩。在虛擬偶像領域,通過歌聲合成,可以讓虛擬人擁有特定音色歌唱能力,使其形象更生動。在音樂游戲或者歌唱教育中,歌聲合成可以迅速生成標準參考聲音,提高音頻製作效率節省人力成本。

歌聲合成效果

聽到了歌聲合成媲美真人的歌唱效果,是否迫不及待想上手使用了呢,以下是歌聲合成的具體集成方法。快來親自集成試試吧!

1.開發準備

1.1註冊成為開發者

在開發應用前需要在華為開發者聯盟網站上註冊成為開發者並完成實名認證,具體方法請參見帳號註冊認證

1.2創建項目及應用

參見創建項目,然後在項目下創建應用完成應用的創建,特殊配置如下:

選擇平臺:選擇“Web”。

1.3打開相關服務

使用Audio Editor Kit服務需要您在AppGallery Connect上打開Audio Editor Kit服務開關,具體操作步驟請參見打開服務開關

2.歌聲合成功能集成

2.1同步介面(流式)

2.1.1獲取access_token鑒權信息

使用開發者聯盟界面獲得的客戶端ID以及對應密鑰,發送HTTPS POST請求,獲取查詢access_token。獲取方式請參見客戶端模式(Client Credentials)。

2.1.2根據access_token調用同步介面(流式)

通過以上步驟獲取的access_token信息,發送HTTPS POST調用同步介面(流式)。

示例代碼(Java)如下所示:

其中requestUrl = "https://audioeditor-api-drcn.cloud.huawei.com/v1/audioeditor/gateway/ai/ttsing/sync"。

/**
     * 調用同步介面(流式)
     * @param accessToken 根據clientId和密鑰獲取的token
     * @throws Exception IO異常
     */
    private static void syncTask(String accessToken) throws Exception {
        // 設置請求header
        PostMethod postMethod = new PostMethod(requestUrl);
        postMethod.setRequestHeader("Content-Type","application/json;charset=utf-8");
        postMethod.setRequestHeader("X-Request-ID","9af1aeda-531b-407a-80b4-65b40ef77bd6");
        postMethod.setRequestHeader("X-Package-Name","com.huawei.demo");
        postMethod.setRequestHeader("X-Country-Code","cn");
        postMethod.setRequestHeader("HMS-APPLICATION-ID","123456");
        postMethod.setRequestHeader("certFingerprint","xxxxx");
        postMethod.setRequestHeader("Authorization","Bearer " + accessToken);
        // 設置請求body
        Map<String, Object> bodyMap = new HashMap<>();
        Map<String, Object> dataMap = new HashMap<>();
        Map<String, Object> configMap = new HashMap<>();
        // filePath是MusicXML文件路徑(含文件名、尾碼)
        String lyricFilePath = "filePath";
        dataMap.put("lyric", FileUtils.readFileToString(new File(lyricFilePath), "UTF-8"));
        dataMap.put("language", "chinese");
        configMap.put("type", 1);
        configMap.put("outputEncoderFormat", 0);
        bodyMap.put("data", dataMap);
        bodyMap.put("config", configMap);
        RequestEntity requestEntity = new StringRequestEntity(JSONObject.toJSONString(bodyMap),"application/json" ,"UTF-8");
        postMethod.setRequestEntity(requestEntity);

        HttpClient httpClient = new HttpClient();
        int ret = httpClient.executeMethod(postMethod);
        if (ret == 200) {
            Header responseHeader = postMethod.getResponseHeader("content-type");
            if ("application/octet-stream".equals(responseHeader.getValue())) {
                InputStream rpsContent = postMethod.getResponseBodyAsStream();
                // filePath是要保存文件的路徑(含文件名、尾碼)
                String filePath = "filePath";
                FileUtils.copyInputStreamToFile(rpsContent, new File(filePath));
            } else {
                String errorString = postMethod.getResponseBodyAsString();
                System.out.println(errorString);
            }
        } else {
            System.out.println("callApi failed: ret =" + ret + " rsp=" + postMethod.getResponseBodyAsString());
        }
    }

2.2非同步介面

2.2.1創建非同步任務

通過access_token信息,發送HTTPS POST創建歌聲合成非同步任務。

  /**
     * 調用創建非同步任務介面
     * @param accessToken 根據clientId和密鑰獲取的token
     * @throws Exception IO異常
     */
    private static void creatAsyncTask(String accessToken) throws Exception {
        // 設置請求header
        PostMethod postMethod = new PostMethod(requestUrl);
        postMethod.setRequestHeader("Content-Type","application/json;charset=utf-8");
        postMethod.setRequestHeader("X-Request-ID","9af1aeda-531b-407a-80b4-65b40ef77bd6");
        postMethod.setRequestHeader("X-Package-Name","com.huawei.demo");
        postMethod.setRequestHeader("X-Country-Code","cn");
        postMethod.setRequestHeader("HMS-APPLICATION-ID","123456");
        postMethod.setRequestHeader("certFingerprint","xxxxx");
        postMethod.setRequestHeader("Authorization","Bearer " + accessToken);
        // 設置請求body
        Map<String, Object> bodyMap = new HashMap<>();
        Map<String, Object> dataMap = new HashMap<>();
        Map<String, Object> configMap = new HashMap<>();
        // filePath是MusicXML文件路徑(含文件名、尾碼)
        String lyricFilePath = "filePath";
        dataMap.put("lyric", FileUtils.readFileToString(new File(lyricFilePath), "UTF-8"));
        dataMap.put("language", "chinese");
        configMap.put("type", 1);
        configMap.put("outputEncoderFormat", 0);
        bodyMap.put("data", dataMap);
        bodyMap.put("config", configMap);
        RequestEntity requestEntity = new StringRequestEntity(JSONObject.toJSONString(bodyMap),"application/json" ,"UTF-8");
        postMethod.setRequestEntity(requestEntity);

        HttpClient httpClient = new HttpClient();
        int ret = httpClient.executeMethod(postMethod);
        String rpsContent = postMethod.getResponseBodyAsString();
        if (ret == 200) {
            System.out.println(rpsContent);
        } else {
            System.out.println("callApi failed: ret =" + ret + " rsp=" + rpsContent);
        }
    }

2.2.2查詢非同步任務狀態

通過access_token信息,發送HTTPS POST查詢歌聲合成非同步任務狀態。

  /**
     * 調用查詢非同步任務狀態介面
     * @param accessToken 根據clientId和密鑰獲取的token
     * @throws Exception IO異常
     */
    private static void queryAsyncTaskInfo(String accessToken) throws Exception {
        // 設置請求header
        PostMethod postMethod = new PostMethod(requestUrl);
        postMethod.setRequestHeader("Content-Type","application/json;charset=utf-8");
        postMethod.setRequestHeader("X-Request-ID","9af1aeda-531b-407a-80b4-65b40ef77bd6");
        postMethod.setRequestHeader("X-Package-Name","com.huawei.demo");
        postMethod.setRequestHeader("X-Country-Code","cn");
        postMethod.setRequestHeader("HMS-APPLICATION-ID","123456");
        postMethod.setRequestHeader("certFingerprint","xxxxx");
        postMethod.setRequestHeader("Authorization","Bearer " + accessToken);
        // 設置請求body
        Map<String, Object> bodyMap = new HashMap<>();
        // taskId對應的值是創建非同步任務時返回的任務ID(taskId)
        bodyMap.put("taskId", "taskId");
        RequestEntity requestEntity = new StringRequestEntity(JSONObject.toJSONString(bodyMap),"application/json" ,"UTF-8");
        postMethod.setRequestEntity(requestEntity);

        HttpClient httpClient = new HttpClient();
        int ret = httpClient.executeMethod(postMethod);
        String rpsContent = postMethod.getResponseBodyAsString();
        if (ret == 200) {
            System.out.println(rpsContent);
        } else {
            System.out.println("callApi failed: ret =" + ret + " rsp=" + rpsContent);
        }
    }

2.2.3取消非同步任務

通過access_token信息,發送HTTPS POST取消非同步任務。

  /**
     * 調用取消非同步任務介面
     * @param accessToken 根據clientId和密鑰獲取的token
     * @throws Exception IO異常
     */
    private static void cancelAsuncTask(String accessToken) throws Exception {
        // 設置請求header
        PostMethod postMethod = new PostMethod(requestUrl);
        postMethod.setRequestHeader("Content-Type","application/json;charset=utf-8");
        postMethod.setRequestHeader("X-Request-ID","9af1aeda-531b-407a-80b4-65b40ef77bd6");
        postMethod.setRequestHeader("X-Package-Name","com.huawei.demo");
        postMethod.setRequestHeader("X-Country-Code","cn");
        postMethod.setRequestHeader("HMS-APPLICATION-ID","123456");
        postMethod.setRequestHeader("certFingerprint","xxxxx");
        postMethod.setRequestHeader("Authorization","Bearer " + accessToken);
        // 設置請求body
        Map<String, Object> bodyMap = new HashMap<>();
        // taskId對應的值是創建非同步任務時返回的任務ID(taskId)
        bodyMap.put("taskId", "taskId");
        RequestEntity requestEntity = new StringRequestEntity(JSONObject.toJSONString(bodyMap),"application/json" ,"UTF-8");
        postMethod.setRequestEntity(requestEntity);

        HttpClient httpClient = new HttpClient();
        int ret = httpClient.executeMethod(postMethod);
        String rpsContent = postMethod.getResponseBodyAsString();
        if (ret == 200) {
            System.out.println(rpsContent);
        } else {
            System.out.println("callApi failed: ret =" + ret + " rsp=" + rpsContent);
        }
    }

除了歌聲合成能力,音頻編輯服務還提供音頻基礎編輯、AI配音伴奏提取、空間渲染、變聲降噪等豐富的音頻處理能力,為全球開發者提供性能優異、簡單易用、開放性強的介面,幫助開發者輕鬆高效構建應用音頻編輯能力。

瞭解更多詳情>>

訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHubGitee

關註我們,第一時間瞭解 HMS Core 最新技術資訊~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註:文中有個易混淆的地方"事務" sql事務,即每次資料庫操作生成的事務,這個事務trx_id只在undolog里存儲,同時undolog維護了此事務是否完成的狀態。 日誌持久化事務,為了保證redolog和binlog的一致性而用的Mysql內部獨立維護的2PC提交事務。這個xid只有在redol ...
  • 1. 獲取指定首碼的key 需求描述: Redis中有大量以xxx開頭的key,在不使用keys命令的情況下,如何快速獲取這些首碼的key 解決方案: redis自帶的scan命令可以解決這個問題 2. SCAN命令 SCAN是一個基於游標的迭代器。這意味著在每次調用該命令時,伺服器都會返回一個更新 ...
  • 1、行轉列 源數據: 目標數據: 數據準備 -- 建表插入數據 drop table if exists time_temp; create table if not exists time_temp( `year_col` int not null comment '年份', `month_col ...
  • 2022年7月26日,Taier1.2版本正式發佈! 本次版本發佈更新功能: 新增工作流 新增OceanBase SQL 新增Flink jar任務 數據同步、實時採集支持臟數據管理 Hive UDF 控制台UI升級 租戶綁定簡化 新版本的使用文檔已在社區中推送,大家可以隨時下載查閱,歡迎大家體驗新 ...
  • 現如今 Redis 變得越來越流行,幾乎在很多項目中都要被用到,不知道你在使用 Redis 時,有沒有思考過,Redis 到底是如何穩定、高性能地提供服務的? 我使用 Redis 的場景很簡單,只使用單機版 Redis 會有什麼問題嗎? 我的 Redis 故障宕機了,數據丟失了怎麼辦?如何能保證我的... ...
  • 實戰案例 1.搭建mysql服務 下載mysql [root@localhost ~]# wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm [root@localhost ~]# rpm -Uvh my ...
  • 四大組件 Activity 實現步驟 繼承 Activity 或其子類,實現以下方法: //第一次創建時回調 protected void onCreate(Bundle savedInstanceState); //啟動時回調 protected void onStart(); //再次啟動時回調 ...
  • 前言: ​ 從64位開始,iOS引入了Tagged Pointer技術,用於優化NSNumber、NSDate、NSString等小對象的存儲。 Tagged Pointer主要為瞭解決兩個問題: 記憶體資源浪費,堆區需要額外的開闢空間 訪問效率,每次set/get都需要訪問堆區,浪費時間, 而且需要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...