本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

Java SDK

更新時間:2024-12-18 12:15

本文介紹如何使用Intelligent Speech Interaction一句話識別的Java SDK,包括SDK的安裝方法及SDK程式碼範例等。

注意事項

  • 在使用SDK前,請先閱讀介面說明,詳情請參見介面說明

  • 從2.1.0版本開始,原有nls-sdk-short-asr更名為nls-sdk-recognizer,升級時需確認已刪除nls-sdk-short-asr,並按編譯提示添加相應的回調方法。

下載安裝

  1. 從Maven伺服器下載最新版本SDK

    <dependency>
        <groupId>com.alibaba.nls</groupId>
        <artifactId>nls-sdk-recognizer</artifactId>
        <version>2.2.1</version>
    </dependency>

    解壓ZIP檔案,在pom目錄運行mvn package,會在target目錄產生可執行JAR:nls-example-recognizer-2.0.0-jar-with-dependencies.jar,將JAR包拷貝至目標伺服器,用於快速驗證及服務壓測。

  2. 服務驗證。

    運行如下代碼,並按提示提供相應參數。運行後在命令執行目錄產生logs/nls.log。

    java -cp nls-example-recognizer-2.0.0-jar-with-dependencies.jar com.alibaba.nls.client.SpeechRecognizerDemo
  3. 服務壓測。

    運行如下代碼,並按提示提供相應參數。其中阿里雲服務URL參數為: wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1 ,語音檔案為16k採樣率PCM格式檔案,並發數根據您的購買情況進行選擇。

    java -jar nls-example-recognizer-2.0.0-jar-with-dependencies.jar
    重要

    自行壓測超過2路並發會產生費用。

關鍵介面

  • NlsClient:語音處理用戶端,利用該用戶端可以進行一句話識別、即時語音辨識和語音合成的語音處理任務。該用戶端為安全執行緒,建議全域僅建立一個執行個體。

  • SpeechRecognizer:一句話識別處理類,通過該介面佈建要求參數,發送請求及聲音資料。非安全執行緒。

  • SpeechRecognizerListener:識別結果監聽類,監聽識別結果。非安全執行緒。

更多介紹,請參見Java API介面說明

重要

SDK調用注意事項:

  • NlsClient使用了Netty架構,NlsClient對象的建立會消耗一定時間和資源,一經建立可以重複使用。建議調用程式將NlsClient的建立和關閉與程式本身的生命週期結合。

  • SpeechRecognizer對象不可重複使用,一個識別任務對應一個SpeechRecognizer對象。例如,N個音頻檔案要進行N次識別任務,需要建立N個SpeechRecognizer對象。

  • SpeechRecognizerListener對象和SpeechRecognizer對象是一一對應的,不能將一個SpeechRecognizerListener對象設定到多個SpeechRecognizer對象中,否則不能將各識別任務區分開。

  • Java SDK依賴Netty網路程式庫,如果您的應用依賴Netty,其版本需更新至4.1.17.Final及以上。

程式碼範例

說明
  • 下載nls-sample-16k.wav

    樣本中使用的音頻檔案為16000 Hz採樣率,請在管控台中將AppKey對應專案的模型設定為通用模型,以擷取準確的識別效果。如果使用其他音頻,請設定為支援該音頻情境的模型,關於模型設定,請參見管理專案

  • 樣本中使用SDK內建的預設一句話識別服務的外網訪問服務URL,如果您使用阿里雲上海ECS,且需要使用內網訪問服務URL,則在建立NlsClient對象時,設定內網訪問的URL:

    client = new NlsClient("ws://nls-gateway-cn-shanghai-internal.aliyuncs.com/ws/v1", accessToken);
  • 調用介面前,需配置環境變數,通過環境變數讀取存取憑證。Intelligent Speech Interaction的AccessKey ID、AccessKey Secret和AppKey的環境變數名:ALIYUN_AK_IDALIYUN_AK_SECRETNLS_APP_KEY

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import com.alibaba.nls.client.protocol.InputFormatEnum;
import com.alibaba.nls.client.protocol.NlsClient;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizer;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizerListener;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizerResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 此樣本示範了:
 *      ASR一句話識別API調用。
 *      動態擷取Token。擷取Token具體操作,請參見:https://help.aliyun.com/document_detail/450514.html
 *      通過本地檔案類比即時資料流發送。
 *      識別耗時計算。
 */
public class SpeechRecognizerDemo {
    private static final Logger logger = LoggerFactory.getLogger(SpeechRecognizerDemo.class);
    private String appKey;
    NlsClient client;
    public SpeechRecognizerDemo(String appKey, String id, String secret, String url) {
        this.appKey = appKey;
        //應用全域建立一個NlsClient執行個體,預設服務地址為阿里雲線上服務地址。
        //擷取Token,實際使用時注意在accessToken.getExpireTime()到期前再次擷取。
        AccessToken accessToken = new AccessToken(id, secret);
        try {
            accessToken.apply();
            System.out.println("get token: " + accessToken.getToken() + ", expire time: " + accessToken.getExpireTime());
            if(url.isEmpty()) {
                client = new NlsClient(accessToken.getToken());
            }else {
                client = new NlsClient(url, accessToken.getToken());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static SpeechRecognizerListener getRecognizerListener(int myOrder, String userParam) {
        SpeechRecognizerListener listener = new SpeechRecognizerListener() {
            //識別出中間結果。僅當setEnableIntermediateResult為true時,才會返回該訊息。
            @Override
            public void onRecognitionResultChanged(SpeechRecognizerResponse response) {
                //getName是擷取事件名稱,getStatus是擷取狀態代碼,getRecognizedText是語音辨識文本。
                System.out.println("name: " + response.getName() + ", status: " + response.getStatus() + ", result: " + response.getRecognizedText());
            }
            //識別完畢
            @Override
            public void onRecognitionCompleted(SpeechRecognizerResponse response) {
                //getName是擷取事件名稱,getStatus是擷取狀態代碼,getRecognizedText是語音辨識文本。
                System.out.println("name: " + response.getName() + ", status: " + response.getStatus() + ", result: " + response.getRecognizedText());
            }
            @Override
            public void onStarted(SpeechRecognizerResponse response) {
                System.out.println("myOrder: " + myOrder + "; myParam: " + userParam + "; task_id: " + response.getTaskId());
            }
            @Override
            public void onFail(SpeechRecognizerResponse response) {
                //task_id是調用方和服務端通訊的唯一標識,當遇到問題時,需要提供此task_id。
                System.out.println("task_id: " + response.getTaskId() + ", status: " + response.getStatus() + ", status_text: " + response.getStatusText());
            }
        };
        return listener;
    }
    //根據位元據大小計算對應的同等語音長度
    //sampleRate僅支援8000或16000。
    public static int getSleepDelta(int dataSize, int sampleRate) {
        // 僅支援16位採樣。
        int sampleBytes = 16;
        // 僅支援單通道。
        int soundChannel = 1;
        return (dataSize * 10 * 8000) / (160 * sampleRate);
    }
    public void process(String filepath, int sampleRate) {
        SpeechRecognizer recognizer = null;
        try {
            //傳遞使用者自訂參數
            String myParam = "user-param";
            int myOrder = 1234;
            SpeechRecognizerListener listener = getRecognizerListener(myOrder, myParam);
            recognizer = new SpeechRecognizer(client, listener);
            recognizer.setAppKey(appKey);
            //設定音頻編碼格式。如果是OPUS檔案,請設定為InputFormatEnum.OPUS。
            recognizer.setFormat(InputFormatEnum.PCM);
            //設定音頻採樣率
            if(sampleRate == 16000) {
                recognizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
            } else if(sampleRate == 8000) {
                recognizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_8K);
            }
            //設定是否返回中間識別結果
            recognizer.setEnableIntermediateResult(true);
            //設定是否開啟語音檢測(即vad)
   recognizer.addCustomedParam("enable_voice_detection",true);
            //此方法將以上參數設定序列化為JSON發送給服務端,並等待服務端確認。
            long now = System.currentTimeMillis();
            recognizer.start();
            logger.info("ASR start latency : " + (System.currentTimeMillis() - now) + " ms");
            File file = new File(filepath);
            FileInputStream fis = new FileInputStream(file);
            byte[] b = new byte[3200];
            int len;
            while ((len = fis.read(b)) > 0) {
                logger.info("send data pack length: " + len);
                recognizer.send(b, len);
                //本案例用讀取本地檔案的形式類比即時擷取語音流,因為讀取速度較快,這裡需要設定sleep時間長度。
                // 如果即時擷取語音則無需設定sleep時間長度,如果是8k採樣率語音第二個參數設定為8000。
                int deltaSleep = getSleepDelta(len, sampleRate);
                Thread.sleep(deltaSleep);
            }
            //通知服務端語音資料發送完畢,等待服務端處理完成。
            now = System.currentTimeMillis();
            //計算實際延遲,調用stop返回之後一般即是識別結果返回時間。
            logger.info("ASR wait for complete");
            recognizer.stop();
            logger.info("ASR stop latency : " + (System.currentTimeMillis() - now) + " ms");
            fis.close();
        } catch (Exception e) {
            System.err.println(e.getMessage());
        } finally {
            //關閉串連
            if (null != recognizer) {
                recognizer.close();
            }
        }
    }
    public void shutdown() {
        client.shutdown();
    }
    public static void main(String[] args) throws Exception {
        String appKey = System.getenv().get("NLS_APP_KEY");
        String id = System.getenv().get("ALIYUN_AK_ID");
        String secret = System.getenv().get("ALIYUN_AK_SECRET");
        String url = System.getenv().getOrDefault("NLS_GATEWAY_URL", "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1");
        SpeechRecognizerDemo demo = new SpeechRecognizerDemo(appKey, id, secret, url);
        //本案例使用本地檔案類比發送即時資料流資料。
        demo.process("./nls-sample-16k.wav", 16000);
        //demo.process("./nls-sample.opus", 16000);
        demo.shutdown();
    }
}
  • 本頁導讀 (1, M)
  • 注意事項
  • 下載安裝
  • 關鍵介面
  • 程式碼範例
文檔反饋
phone 聯絡我們

立即和Alibaba Cloud在線服務人員進行交談,獲取您想了解的產品信息以及最新折扣。

alicare alicarealicarealicare