• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 對話式人工智能

    使用 Whisper 和 Canary 架構部署 NVIDIA Riva 多語種 ASR,同時選擇性地停用 NMT

    NVIDIA 持續開發自動語音識別 (ASR) 模型,這些模型在業內樹立了基準。

    早期版本的 NVIDIA Riva 是一種適用于 ASR TTS NMT 的 GPU 加速語音和翻譯 AI 微服務的集合,支持基于 Conformer 架構的英語-西班牙語和英語-日語代碼交換 ASR 模型,以及基于 Parakeet 架構的支持 EMEA 地區多種語言(即英國英語、歐洲西班牙語、法語、意大利語、標準德語和亞美尼亞語)的模型。

    最近,NVIDIA 發布了 Riva 2.18.0 容器和 SDK ,以不斷改進其語音 AI 模型。在此新版本中,我們現在提供以下服務:

    • 支持 Parakeet,即多語言流式傳輸 ASR
    • 支持 OpenAI 的 Whisper-Large 和 Hugging Face 的 Distil- Whisper-Large 模型,適用于離線 ASR 和任意英語 AST
    • NVIDIA Canary 模型適用于離線 ASR、Any-to-English、English-to-Any 和 Any-to-Any AST
    • 新的 <dnt> SSML 標簽,用于告知 Megatron NMT 模型不要翻譯所包含的文本
    • 新的 DNT 字典,可告知 Megatron NMT 模型如何翻譯指定的單詞或短語

    自動語音翻譯 (AST)是將一種語言的語音翻譯為另一種語言的文本,而無需以第一種語言進行中間轉錄。

    NVIDIA 還發布了 Whisper 和 Canary ( 1B 0.6B-Turbo ) 的 NIM 微服務實現,可為離線 ASR 和 AST 提供優化的模塊化便攜支持。NVIDIA Riva 將繼續為串流和離線用例支持其他 SOTA 模型和新架構,例如 ASR-Translation (AST) 模型、S2S 功能和多語種模型。

    在本文的演示中,我們重點介紹用于離線 ASR 和 AST 的 Whisper 和 Canary,以及使用 <dnt> SSML 標簽和 DNT 字典選擇性地停用和編輯 Megatron NMT。

    Riva 多語種離線 ASR,支持 Whisper 和 Canary 離線 ASR

    Riva 新增了對離線多語種 ASR 的 Whisper 支持,使您能夠以數 十種 語言 轉錄錄音內容。Whisper 還可以自動將任何支持 語言 的音頻翻譯成英語,而無需使用源 語言 轉錄音頻,并隨后將轉錄翻譯成英語。

    NGC Riva 技能快速入門 資源文件夾中包含的 config.sh 腳本提供了啟動具有 Whisper 功能的 Riva 服務器所需的一切。確保已按指示設置以下變量:

    service_enabled_asr=true
    asr_acoustic_model=("whisper") # or "distil_whisper" for lower memory requirements
    asr_acoustic_model_variant=("large") # the default "" will probably also work
    riva_model_loc="<path/to/model/files/outside/container>"

    要啟動具有 Canary 功能的 Riva 服務器,請按如下所示設置這些變量:

    service_enabled_asr=true
    asr_acoustic_model=("canary")
    asr_acoustic_model_variant=("1b") # or "0.6_turbo" for faster inference
    riva_model_loc="<path/to/model/files/outside/container>"

    運行同一目錄中提供的 riva_init.sh 腳本,以下載 RMIR 格式的模型,并部署針對您的特定 GPU 架構優化的模型版本。然后運行 riva_start.sh 腳本以啟動 Riva 服務器。

    此外,還提供 NIM 微服務版本的 Whisper 和 Canary( 1B 0.6B-Turbo )。要在您自己的系統上啟動 Whisper 或 Canary NIM 微服務,請選擇模型登陸頁面的 Docker 選項卡,然后按照說明操作。在此過程中,您必須生成 NGC API 密鑰 ,并將其導出為環境變量 NGC_API_KEY

    以下是 Whisper NIM 微服務的 docker run 命令:

    docker run -it --rm --name=riva-asr \
       --runtime=nvidia \
       --gpus '"device=0"' \
       --shm-size=8GB \
       -e NGC_API_KEY \
       -e NIM_HTTP_API_PORT=9000 \
       -e NIM_GRPC_API_PORT=50051 \
       -p 9000:9000 \
       -p 50051:50051 \
       -e NIM_TAGS_SELECTOR=name=whisper-large-v3 \
       nvcr.io/nim/nvidia/riva-asr:1.3.0

    要改為運行 Canary NIM 微服務,請在 docker run 命令中將 whisper-large-v3 替換為 canary-1bcanary-0-6b-turbo,無論使用何種 ASR 或 AST 模型,以這種方式在您自己的系統上運行 NIM 微服務都會使終端掛起。您必須完全使用不同的終端或不同的接口,才能使用 Whisper 或 Canary NIM 微服務運行推理。否則,此過程與使用安裝了經典 Riva SDK 的 Riva 服務器進行推理相同。

    啟動 Riva 服務器后,您可以使用 C++ Python API 向其提交推理調用。我們在本文的其余部分中使用了 Python 示例。

    導入 Riva Python 客戶端模塊并連接到 Riva 服務器,如下所示:

    import riva.client
    import riva.client.proto.riva_asr_pb2 as riva_asr
    uri = 'localhost:50051'
    auth = riva.client.Auth(uri=uri)

    接下來,像下面這樣定義一個函數,使用 Whisper 或 Canary 轉錄音頻文件:

    def run_ast_inference(audio_file, model, auth=auth, source_language='multi', target_language=None, print_full_response=False):
        assert model in ['whisper', 'canary']
     
        # The 'multi' language code doesn't work with Canary, so change it
        if model == 'canary' and source_language == 'multi':
            source_language = 'en-US'
         
        # Ensure that the ASR/AST model is available
        model_available = False
        client = riva.client.ASRService(auth)
        config_response = client.stub.GetRivaSpeechRecognitionConfig(riva_asr.RivaSpeechRecognitionConfigRequest())
        for model_config in config_response.model_config:
            model_name = model_config.model_name
            if model in model_name and 'offline' in model_name:
                model_available = True
                break
        assert model_available == True, f'Error: {model.capitalize()} ASR/AST is not available'
         
        # Read in the audio file
        with open(audio_file, 'rb') as fh:
            data = fh.read()
     
        config = riva.client.RecognitionConfig(
            language_code=source_language,
            max_alternatives=1,
            enable_automatic_punctuation=True,
            model=model_name,
        )
     
        if target_language is not None:
            riva.client.add_custom_configuration_to_config(config, f'target_language:{target_language}')
            riva.client.add_custom_configuration_to_config(config, 'task:translate')
     
        response = client.offline_recognize(data, config)
         
        if print_full_response:
            print(response)
        else:
            print(response.results[0].alternatives[0].transcript)

    對于 Riva 2.17.0 版本的 Whisper,您必須將調用 riva.client.RecognitionConfig 時的 language_code 參數設置為 "en-US",而不管轉錄的音頻文件使用哪種語言。

    同樣,如果您想讓 Whisper 轉錄或翻譯特定語言,您需要通過如下調用傳入 source_language 參數:

    riva.client.add_custom_configuration_to_config(config, f'source_language:{source_language}')

    對于 Riva 2.18.0 及更高版本,在調用 riva.client.RecognitionConfig 時設置 language_code='multi' 可啟用 Whisper 自動檢測輸入音頻文件的語言。另一方面,Canary 不支持語言自動檢測,也不會接受 language_code 參數的 'multi' 值。

    在下面的演示視頻中,我們中的一位播放了自己閱讀《世界人權宣言》第 1 條的英語和瑞典語錄像。Whisper 和 Canary ASR 和 AST 的后續說明參考了該視頻中使用的錄制內容。

    1 Riva 多語種 ASR (結合 Whisper 和 Canary 進行離線 ASR 演示)

    將英語錄制內容傳遞至推理函數,否則需使用以下默認參數:

    response = run_ast_inference('udhr-english.wav', model='whisper')

    這將生成以下準確的轉錄:

    All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.

    依次將瑞典語錄制內容傳遞至推理函數,否則需使用以下默認參數:

    response = run_ast_inference('udhr-swedish.wav', model='whisper')

    這將生成以下準確的轉錄:

    Alla m?nniskor ?r f?dda fria och lika i v?rde och r?ttigheter. De ?r utrustade med f?rnuft och samvete och b?r handla gentemot varandra i en anda av broderskap.

    要讓 Whisper 執行任意英語 AST,請傳遞 target_language 參數和 source_language 參數 (如果需要),傳遞形式為 由兩個小寫字母組成的語言代碼 ,或將語言代碼與由兩個大寫字母組成的國家 地區代碼組合,并用破折號將兩者分開。要獲取給定國家 地區的雙字母代碼,請按如下所示使用 pycountry Python 模塊:

    pycountry.countries.search_fuzzy('<Country Name>')

    例如,您可以獲取瑞典語音頻文件的英文轉錄,如下所示:

    response = run_ast_inference('udhr-swedish.wav', model='whisper', target_language='en-US')

    這將產生以下轉換:

    All people are born free and equal in value and rights. They are equipped with reason and conscience and should act against each other in a spirit of brotherhood.

    理想情況下,此翻譯文本應與《世界人權宣言》第 1 條的英文版本相同。在大多數情況下,它已經足夠接近了。然而,雖然瑞典語的介詞“gentemot”的意思可能是“反對”,但在這種情況下,應將其翻譯為“朝”。

    在撰寫本文時,Riva 的 Whisper 實現不支持 ASR 或 AST、英語對任意 AST 或任意 AST 串流。

    Canary 同樣支持離線 (但不支持流式傳輸) ASR 和 AST。雖然與 Whisper 相比,它識別的語言更少,但支持英語對任意和任意對任意 AST。

    例如,可以考慮錄制德語版的《世界人權宣言》第 1 條的錄音:

    Alle Menschen sind frei und gleich an Würde und Rechten geboren. Sie sind mit Vernunft und Gewissen begabt und sollen einander im Geist der Brüderlichkeit begegnen.

    對該錄制文件運行 Canary AST,如下所示:

    response = run_ast_inference('udhr-german.wav', model='canary', source_language='de-DE', target_language='es-US')

    dy to help. Please provide the and so I can begin the task

    Todos los hombres nace libres e iguales en dignidad y derechos, dotados de razón y conciencia y deben enfrentarse en el espíritu de la fraternidad.

    為便于比較,以下是《世界人權宣言》第一條的官方西班牙語版本:

    Todos los seres humanos nacen libres e iguales en dignidad y derechos y, dotados como están de razón y conciencia, deben comportarse fraternalmente los unos con los otros.

    <dnt> SSML 標簽和字典,用于選擇性地停用 NMT 并提供首選翻譯

    Riva 2.17.0 引入了 <dnt> (即“請勿翻譯”) SSML 標簽。將單詞或短語圍繞在一組 <dnt> 標簽中告知 Riva 不要將其翻譯。

    2 Riva SSML

    Riva 2.18.0 進一步提升了 DNT 概念,使您能夠上傳首選翻譯的整個詞和短語字典,包括完全不翻譯的詞語。對于您不希望翻譯的詞語和首選翻譯,可以考慮瑞典語和德語的示例,因為我們中的一個人除了講英語之外還講這些語言。

    您可能不希望翻譯模型翻譯部分輸入文本的原因有以下幾個:

    • 文本包含正確的名稱,該名稱在源語言中具有含義,但通常不會翻譯為目標語言。
    • 目標語言缺乏與源語言中給定單詞或短語的精確等價物。

    眾所周知,瑞典語形容詞“lagom”很難翻譯成英語,但它的意思大概是“ 不太多,不太少,沒錯 ”。很奇怪,dictionary.com 將“lagom”的定義列為英語借詞。更令人好奇的是,它將“lagom”描述為英語中的名詞,而在瑞典語中,它嚴格來說是一個形容詞。

    在“Riva Skills Quick Start”資源文件夾中包含的 config.sh 腳本的 models_nmt 字段中,按如下所示設置和取消注釋:

    service_enabled_nmt=true
    "${riva_ngc_org}/${riva_ngc_team}/rmir_nmt_megatron_1b_any_any:${riva_ngc_model_version}"

    接下來,在 Python 腳本、解釋器或 notebook 中導入 Riva 客戶端 Python 模塊,并連接到 Riva 服務器。現在,您可以定義如下函數以運行 NMT 推理:

    def run_nmt_inference(texts, model, source_language, target_language, dnt_phrases_dict=None, auth=auth):
        client = riva.client.NeuralMachineTranslationClient(auth)
        resp = client.translate(texts, model, source_language, target_language, dnt_phrases_dict)
        return [translation.text for translation in resp.translations]

    以下代碼示例展示了如何使用 <dnt> SSML 標簽告訴 Riva NMT 不要翻譯“lagom”。

    input_strings = [
        'Hur s?ger man <dnt>"lagom"</dnt> p? engelska?'
    ]
     
    model_name = 'megatronnmt_any_any_1b'
    source_language = 'sv'
    target_language = 'en'
     
    translations = run_nmt_inference(input_strings, model_name, source_language, target_language)
    for i, translation in enumerate(translations):
        print(f'\tTranslation {i}: {translation}')

    這將生成以下結果:

    Translation 0: How to say "lagom" in English?

    理想情況下,譯文應為:“How does one say ‘lagom’ in English?”或“How do you say ‘lagom’ in English?”

    您可以使用 dnt_phrases_dict 字典獲得相同的結果:

    input_strings = [
        'Hur s?ger man "lagom" p? engelska?'
    ]
     
    dnt_phrases_dict = {"lagom": "lagom"}
     
    model_name = 'megatronnmt_any_any_1b'
    source_language = 'sv'
    target_language = 'en'
     
    translations = run_nmt_inference(input_strings, model_name, source_language, target_language)
    for i, translation in enumerate(translations):
        print(f'\tTranslation {i}: {translation}')

    同樣,這也會產生相同的結果:

    Translation 0: How to say "lagom" in English?

    對于首選翻譯,可以考慮使用瑞典語名詞“s?rskrivning”和對應的德語“Getrenntschreibung”。這些詞語沒有直接的英語翻譯。

    英語以外的大多數日耳曼語言 (包括瑞典語和德語) 廣泛使用合成詞,尤其是名詞輔助詞 (用作形容詞的名詞)。在瑞典語和德語中,名詞輔助詞及其修改的名詞構成合成詞。這兩種語言中都存在一種傾向 (部分原因是受英語的影響,部分原因是排版師認為用連字符結束一行在美學上沒有吸引力),即分離詞語,而根據現行語法規則,這些詞語應合并在一起。

    “S?rskrivning”和“Getrenntschreibung”的字面意思都是“單獨編寫”或“單獨拼寫”,它們分別是對應這一趨勢的瑞典語和德語單詞及其示例。

    您可以讓 Riva 將瑞典語句子“S?rskrivningar f?rst?rde mitt liv”(大致而言,“S?rskrivningar【即,s?rskrivning 的復數形式】ruined my life”) 翻譯為德語,具體如下。以下示例使用字典指明首選的翻譯版本,即“S?rskrivningar”和“Getrenntschreibungen”。

    input_strings = [
        'S?rskrivningar f?rst?rde mitt liv.'
    ]
     
    dnt_phrases_dict = {"S?rskrivningar": "Getrenntschreibungen"}
     
    model_name = 'megatronnmt_any_any_1b'
    source_language = 'sv'
    target_language = 'de'
     
    translations = run_nmt_inference(input_strings, model_name, source_language, target_language)
    for i, translation in enumerate(translations):
        print(f'\tTranslation {i}: {translation}')

    這將生成以下結果:

    Translation 0: Getrenntschreibungen hat mein Leben ruiniert.

    在本示例中,輔助動詞形式應為“haben”而非“hat”,因為源文本中的“s?rskrivningar”和翻譯文本中的“Getrenntschreibungen”均為復數名詞,否則,此翻譯就足夠準確。

    從 Riva 2.18.0 開始,megatron_any_any_1b 模型現在由 1.6B 個參數組成,總共為 36 種語言提供雙向翻譯支持,比之前的版本多 4 種。例如,此模型將歐洲和拉丁美洲西班牙語與簡體中文和繁體中文一起視為單獨的語言。

    因此,該模型現在要求將某些語言代碼表示為兩個小寫字母(之前的標準語言代碼),然后是破折號和兩個大寫字母(代表國家/地區)。

    在此系統下,歐洲和拉丁美洲的西班牙語分別編碼為 'es-ES''es-US',而簡體中文和繁體中文分別編碼為 'zh-CN''zh-TW'。語言不需要同時使用語言和國家代碼仍然支持該模式。例如,您可以通過將 'sv''sv-SE' 傳入適當的參數,讓 Riva 將瑞典語用作源語言或目標語言。

    探索 NGC 的 Riva Skills Quick Start 資源文件夾,啟動具有 NMT 功能的 Riva 服務器。

    ?

    0

    標簽

    人人超碰97caoporen国产