SON DAKİKA

Nvdia

“NVIDIA Riva Çok Dilli ASR’yi Whisper ve Canary Mimarileri ile Dağıtma: Seçici NMT Devre Dışı Bırakma Yöntemleri”

NVIDIA, otomatik konuşma tanıma (ASR) modelleri geliştirerek sektördeki standartları belirleyen bir şirket olmuştur.

Önceki sürümlerinde, NVIDIA Riva, İngilizce-İspanyolca ve İngilizce-Japonyaca kod geçişi ASR modellerini destekleyen GPU hızlandırmalı konuşma ve çeviri AI mikro hizmetlerinden oluşmaktadır. Bu modeller, Conformer mimarisi üzerine inşa edilmiştir. Ayrıca, EMEA bölgesindeki (İngilizce, İspanyolca, Fransızca, İtalyanca, Almanca ve Ermeni) yaygın dilleri destekleyen bir model de Parakeet mimarisine dayanmaktadır.

Son günlerde, NVIDIA Riva 2.18.0 konteynerini ve SDK’sını tanıttı. Bu yeni sürümle birlikte şunları sunuyoruz:

  • Parakeet, akışkan çok dilli ASR desteği
  • OpenAI’nin Whisper-Large ve HuggingFace’in Distil-Whisper-Large modelleri için çevrimdışı ASR ve Herhangi-Dile İngilizce AST desteği
  • NVIDIA’nın Canary modelleri, çevrimdışı ASR, Herhangi-Dile İngilizce, İngilizce-Herhangi ve Herhangi-Herhangi AST desteği
  • Yeni bir <dnt> SSML etiketi, Megatron NMT modeline kapsayıcı metni çevirmemesi talimatını verir
  • Tercih edilen kelimelerin veya ifadelerin nasıl çevrileceğini belirten bir DNT sözlüğü

Otomatik konuşma çevirisi (AST), bir dildeki konuşmanın başka bir dile metne dönüştürülmesi işlemidir ve bu süreçte ilk dilde ara transkripsiyon yapılmaz.

NVIDIA Riva ile Multidilli ASR Desteği

Riva’nın Whisper desteği sayesinde çevrimdışı çok dilli ASR, daha fazla dilde ses kayıtlarını transkribe etme olanağı sunmaktadır. Whisper, desteklediği onlarca dilden birinden gelen sesi otomatik olarak İngilizceye çevirebilmektedir. Bu, sesi orijinal dilinde transkripte etmeden çevirme işlemi anlamına gelir.

config.sh scripti, Riva sunucusunu Whisper özellikleriyle başlatmak için gereken her şeyi sağlar. Aşağıdaki değişkenlerin belirtilmesi yeterlidir:

service_enabled_asr=true
asr_acoustic_model=("whisper") # ya da daha az bellek gereksinimi için "distil_whisper"
asr_acoustic_model_variant=("large") # varsayılan "" ile de çalışabilir
riva_model_loc=""

Canary yetenekleriyle bir Riva sunucusunu başlatmak istediğinizde, bu değişkenleri şu şekilde ayarlayın:

service_enabled_asr=true
asr_acoustic_model=("canary") 
asr_acoustic_model_variant=("1b") # veya daha hızlı bir tahmin için "0.6_turbo"
riva_model_loc=""

RMIR formatında modelleri indirip bu modelleri özel GPU mimarinize optimize edilmiş şekilde dağıtmak için riva_init.sh scriptini kullanın. Daha sonra Riva sunucusunu başlatmak için riva_start.sh scriptini çalıştırın.

Whisper ve Canary NIM Mikroservis Modelleri

NIM mikroservis versiyonları, çevrimdışı ASR ve AST için optimize edilmiş Whisper ve Canary modellerini sunmaktadır. Kendi sisteminizde bu mikroservisleri başlatmak için modelin açılış sayfasındaki Docker sekmesine gidin ve talimatları izleyin. Ayrıca, bir NGC API anahtarı oluşturmanız ve bu anahtarı çevresel değişken olarak, NGC_API_KEY olarak dışa aktarışınız gerektiğini unutmayın.

Whisper NIM mikroservisini başlatmak için gerekli docker run komutu şöyle olacaktır:

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 mikroservisini çalıştırmak için ise whisper-large-v3 yerine canary-1b veya canary-0-6-b-turbo yazarak docker run komutunu değiştirin.

Whisper ve Canary ile İnferans Demosu

Riva sunucusu başlatıldığında, bu sunucuya C++ ya da Python API’leri aracılığıyla tahmin çağrıları gönderebilirsiniz. Bu yazıda Python örnekleri üzerinde durulmaktadır.

Riva Python istemci modülünü içe aktarın ve Riva sunucusuna bağlanın:

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

Aşağıdaki gibi bir işlev tanımlayın ve Whisper veya Canary ile ses dosyalarını transkribe edin:

def run_ast_inference(audio_file, model, auth=auth, source_language='multi', target_language=None, print_full_response=False):
    assert model in ['whisper', 'canary']
    # Canary için çok dilli dil kodu çalışmaz, bu yüzden değiştirin
    if model == 'canary' and source_language == 'multi': 
        source_language = 'en-US'
    
    # Modelin mevcut olup olmadığını kontrol edin
    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'Hata: {model.capitalize()} ASR/AST mevcut değil'
    
    # Ses dosyasını oku 
    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 sürümünde, language_code parametresini "en-US" olarak ayarlamak zorundaydınız. Fakat Riva 2.18.0 ve sonraki sürümlerde, language_code='multi' ayarlanarak Whisper, giriş ses dosyasının dilini otomatik olarak tespit etmektedir. Öte yandan, Canary otomatik dil tespiti desteği sunmamaktadır ve 'multi' değerini kabul etmez.

Aşağıdaki demolar vasıtasıyla, İngilizce ve İsveççe alıntılar dinlenmiştir. Örneğin, İngilizce kaydı şu şekilde geçirebilirsiniz:

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

Bu işlem, aşağıdaki doğru transkripti verecektir:

Tüm insan doğası itibarıyla özgür ve onur ve haklar bakımından eşittir. O insanlığın akıl ve vicdanla donatılmış olarak, birbirine karşı kardeşlik ruhu ile hareket etmesi gerekir.

İsveççe kaydı geçtiğinizde şu şekilde olacaktır:

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

Bu işlemin sonucunda, aşağıdaki transkripti elde edersiniz:

Tüm insanlar özgür ve eşit olarak onur ve haklarla doğarlar. Akıl ve vicdan ile donatılmışlardır ve birbirine karşı kardeşlik ruhu içinde davranmaları gerektiğinin bilincindedirler.

Whisper’a herhangi bir dilden İngilizce AST yapmak istediğinizi belirtmek için target_language parametresini geçmelisiniz:

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

Bu, aşağıdaki çeviriyi verecektir:

Tüm insanlar özgür ve eşit olarak, onur ve haklarla dünyaya gelirler. Yanlarında akıl ve vicdan vardır ve kardeşlik ruhu içinde birbirlerine karşı hareket etmelidirler.

Bu transkriptonin, Evrensel İnsan Hakları Beyannamesinin 1. Maddesi’nin İngilizce versiyonu ile tam olarak aynı olması bekleniyordu. Çoğu açıdan, oldukça yakın bir çeviri olsa da, İsveççe ‘gentemot’ kelimesinin bu bağlamda ‘karşı’ olarak değil, ‘doğru’ anlamında kullanılması gerektiği vurgulamak gerekmektedir.

NVIDIA’nın Whisper uygulaması şu anda akışkan ASR veya AST, İngilizceden herhangi bir dile AST, ya da herhangi bir dilden herhangi bir dile AST desteklememektedir.

Canary ise çevrimdışı (fakat akıcı olmayan) ASR ve AST’yi desteklemektedir. Daha az dil tanıyor olmasına rağmen, İngilizceden herhangi bir dile ve herhangi bir dilden herhangi bir dile çeviri yapılmasına olanak sağlamaktadır.

Örneğin, Evrensel İnsan Hakları Beyannamesinin Almanca versiyonunun ses kaydını düşünelim:

Tüm insanlar özgür ve eşit onur ve haklar ile doğarlar. Akıl ve vicdan ile donanmışlardır ve kardeşlik ruhu ile birbiriyle ilişkide bulunmalıdırlar.

Bu kayıta Canary AST işlemini yapmak için:

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

Bu işlem, aşağıdaki İspanyolca çeviriyi verecektir:

Tüm insanlar onur ve haklar bakımından özgür ve eşit doğarlar. Akıl ve vicdan ile donanmışlardır ve kardeşlik ruhu içinde birbirleriyle bir arada durmalıdırlar.

Karşılaştırma için, UHRB’nin resmi İspanyolca versiyonu aşağıdaki gibidir:

Tüm insanlar özgür ve eşit onur ve haklarla doğarlar ve akıl ve vicdanla donatıldıkları için, birbirlerine karşı yansıyarak hareket etmelidirler.

DNT SSML Etiketleri ve Sözlükleri

Riva 2.17.0, <dnt> (yani “tercüme etme”) SSML etiketlerini tanıttı. Bir kelimeyi ya da ifadeyi <dnt> etiketleri ile çevrelemek, Riva’ya bu kelimeyi çevirmemesi talimatını verir.

Riva 2.18.0, DNT kavramını bir adım daha ileri götürerek tercih edilen çevirileri içeren tam sözlükleri yüklemenizi sağladı. Çevirmesini istemediğiniz kelimeler ve tercih edilen çeviriler için aşağıdaki örnekler verilmiştir.

Çeviri modelinin bir metnin belirli kısmını çevirmemesinin birkaç nedeni vardır:

  • Metin, genellikle hedef dilde çevrilmeden geçen bir özel isim içermektedir.
  • Hedef dil, kaynak dillerdeki kelime veya ifadeye karşılık gelen kesin bir eşdeğere sahip değildir.

Örneğin, anlaşılamayan İsveççe sıfat ‘lagom’ kelimesi çevrildiğinde anlamını kaybetmektedir. Ancak “tıpkı” veya “tamlayıcı” anlamına gelmektedir.

config.sh içerik dosyasında models_nmt alanını şu şekilde ayarlayıp belirtin:

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

Daha sonra, Riva istemci Python modülünü bir Python scriptinde, yorumlayıcısında veya dizininde içe aktarın ve Riva sunucusuna bağlanın. Aşağıdaki gibi bir fonksiyon tanımlayarak NMT tahmini gerçekleştirebilirsiniz:

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]

Aşağıdaki örnek, <dnt> SSML etiketlerini kullanarak Riva NMT’ye “lagom” ifadesini çevirmemesini belirtmektedir:

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'tÇeviri {i}: {translation}')

Bu işlem şöyle bir sonuç verir:

Çeviri 0: "Lagom" kelimesini İngilizce olarak nasıl söyleriz?

Kapitalized form kullanılmayabilir, ancak çevirinin isteğe göre üzerinde değişiklik yapılması gerektiği uzmanların ifadesidir.

Tercih edilen çevirileri belirlemek için, aşağıdaki gibi bir sözlük kullanabilirsiniz:

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'tÇeviri {i}: {translation}')

Sonuç olarak:

Çeviri 0: "Lagom" kelimesini İngilizce olarak nasıl söyleriz?

Aynı şeyi tercih edilen çevirilerle yapmak için, İsveççe cümlelerini aşağıdaki gibi çevrilecek:

Riva’ya İsvçevçe cümlesini verin:

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'tÇeviri {i}: {translation}')

Bu işlem şu şekilde sonuçlanır:

Çeviri 0: Getrenntschreibungen hat mein Leben ruiniert.

Bir olumsuz sonucudur; bunun gibi durumlarda daha iyi hale getirilmelidir.

Riva 2.18.0 itibariyle, megatron_any_any_1b modeli toplamda 1.6B parametre sunmakta ve 36 dilde ikili çeviri desteği sağlamaktadır. Örneğin, bu model Avrupa ve Latin Amerika İspanyolcasını ayrı diller olarak değerlendirir.

Ayrıca bu model, bazı dil kodlarının iki küçük harf + iki büyük harf kombinasyonu ile ifade edilmesini gerektirir. Örneğin, Avrupa İspanyolcası için 'es-ES', Latin Amerika İspanyolcası için ise 'es-US' kullanılırken, geleneksel ve basitleştirilmiş Çince için ise 'zh-CN' ve 'zh-TW' kullanılır. Bu sistem, İsvçevçe için 'sv' veya 'sv-SE' kullanılmasını sağlamaktadır.

NVIDIA’nın Riva Becerileri Hızlı Başlangıç kaynak klasörünü keşfederek NMT yetenekleri ile bir Riva sunucusu başlatabilirsiniz.

Kaynak

Nvdia Blog

Düşüncenizi Paylaşın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İlgili Teknoloji Haberleri