음성 기반 가상 어시스턴트, NVIDIA Riva와 Rasa로 구축해보세요!

Reading Time: 8 minutes

가상 어시스턴트는 이제 우리 일상의 일부가 됐습니다. 우리는 궁금한 거의 모든 것을 가상 어시스턴트에게 묻죠. 이들은 생활의 편리를 넘어 기업의 활동에도 엄청난 도움을 제공합니다. 일례로 온라인상의 가상 에이전트들은 복잡한 기술적 문제의 해결을 지원하고, 보험금 청구와 호텔 객실 예약 작업을 처리하죠. 완전 자동화 전화로 고객 관계 관리를 확장하기도 합니다. 이 같은 활용을 위해서는 프로덕션급의 강력한 음성 기반 가상 어시스턴트를 수억 명의 사용자에 맞춰 배포할 수 있어야 합니다.

자연스러움이 생명인 음성 인터페이스는 고품질의 인간/기계 인터페이스 실현을 좌우하는 핵심 요소로 자리잡았습니다. 그러나 여러 개발자들, 특히 대규모 배포를 꾀하는 전문가들에게 이는 여전한 기술적 난제로 남아 있죠.

프로덕션급 음성 기반 가상 어시스턴트의 성공적 배포를 위해서는 다음의 사항들이 반드시 뒷받침돼야 합니다.

  • 훌륭한 품질—품질은 사용자 경험과 직결됩니다. 음성 인터페이스는 다양한 언어와 사투리, 전문용어 등을 풍부하고 정확하게 이해할 수 있어야 하죠. 지적인 대화는 대개 말을 주고받는 횟수가 많고 고도로 맥락적입니다. 가상 어시스턴트는 이러한 대화의 복잡하고 역동적인 양상을 파악하고 정확한 의도, 분야, 맥락을 식별해야 성공적인 결과물을 도출할 수 있습니다.
  • 훌륭한 성능과 확장성—까다로운 품질 요건과 별개로 가상 어시스턴트는 정확한 대답을 실시간에 가깝게 제시해야 합니다. 인간은 겨우 200밀리초의 지연도 지각할 수 있으며, 이는 결국 사용자 경험의 저해로 이어집니다. 수억 명에 달하는 동시 사용자에게 가상 어시스턴트를 배포하다 보면 성능 트레이드오프(trade-off)로 지연 시간이 증가하는 경우가 발생하는데요. 대규모 배포 과정에서 지연 시간의 제어는 엔지니어를 괴롭히는 또다른 난제입니다.

이번 포스팅은 즉시 사용이 가능한 프로덕션급 가상 어시스턴트 솔루션인 NVIDIA Riva와 Rasa의 샘플 애플리케이션을 탐구합니다. 즉시 배포와 스케일링이 가능한 음성 기반 가상 애플리케이션을 손쉽게 구축하는 방법도 함께 소개합니다. 이와 더불어 Riva의 성능 시연을 통해 프로덕션급 기능도 살펴봅니다.

영상 1. 가상 어시스턴트의 시연 영상.

이번 가상 어시스턴트 시스템에는 다음의 구성 요소가 포함됩니다.

  • 대화 관리(DM)
  • 자동 음성 인식(ASR)
  • 자연어 처리(NLP) 또는 자연어 이해(NLU)
  • 문자 음성 변환 프로그램(TTS)

여기에서 NLU와 DM 기능은 Rasa, TTS와 ASR은 Riva가 담당합니다.

Rasa 개괄

Rasa는 텍스트와 음성 기반 AI 어시스턴트 구축을 위한 오픈 소스 머신 러닝 프레임워크입니다. 어시스턴트의 기본 업무는 크게 두 가지입니다.

  • 사용자 언어의 이해
  • 그에 상응하는 반응

Rasa 어시스턴트는 이 업무에 머신 러닝을 활용합니다. 사용자의 실제 대화를 학습해 주요 과업들을 대규모로 처리하는 고성능 어시스턴트를 구축하게 해주죠.

이 가상 어시스턴트는 Rasa NLU와 DM 기능을 활용합니다. 더 자세한 정보는 Rasa 다큐멘테이션을 참고하세요.

Riva 개괄

Riva는 대화형 AI 애플리케이션 구축을 위한 NVIDIA AI 음성 SDK입니다. Riva의 ASR과 TTS 기능을 활용해 가상 어시스턴트에 음성 인터페이스를 제공할 수 있죠. NVIDIA GPU 기반 Riva SDK는 최고 수준의 추론 시간과 처리량을 지원합니다.

이 가상 어시스턴트의 경우 ASR 솔루션은 지연 시간을 줄이면서 정확도와 처리량은 높여야 합니다. TTS는 커스터마이징이 가능한 음성 폰트를 저지연으로 지원해야 하죠. 두 가지 요건 모두를 훌륭히 충족하는 Riva는 음성 기반 가상 어시스턴트 구축을 위한 완벽한 도구입니다. Riva의 성능과 관련한 추가 정보를 NVIDIA Riva Speech Skills에서 확인하세요.

아키텍처 개괄

다음은 ASR과 TTS, NLU와 DM이 상호작용해 음성 기반 가상 어시스턴트를 생성하는 방식입니다. 그림 1은 이 가상 어시스턴트의 아키텍처를 보여줍니다.

그림1. Riva/Rasa 가상 어시스턴트와 Rasa NLU 아키텍처.

좌측에 보이는 클라이언트 애플리케이션은 웨더봇(weatherbot) 웹 애플리케이션입니다. 사용자가 음성으로 클라이언트 애플리케이션과 직접 상호작용하고 스피커로 답변을 받는 형식입니다.

발화된 질문은 Riva ASR 서비스를 호출해 전사됩니다. 전사가 완료된 텍스트는 Rasa 래퍼(wrapper)로 보내지고, Rasa DM과 Rasa NLU의 API를 호출해 적절한 다음 액션(action)이 결정되죠. Rasa DM은 선택된 액션에 의거해 경우에 따른 이행까지 담당합니다. Rasa 서버가 텍스트 형식으로 내놓는 응답은 gRPC 호출을 통해 Riva TTS 서버로 이동하며, 이에 상응하는 음성 대답이 사용자에게 발화 형태로 반환됩니다.

Riva AI 서비스와 Rasa는 GPU가 탑재된 시스템에 배포될 때 더욱 뛰어난 성능을 제공합니다.

가상 어시스턴트 구축하기

이번 포스팅에서는 날씨 분야의 가상 어시스턴트 구축 과정을 살펴봅니다. Rasa NLU와 DM을 활용한 챗봇의 구축보다는 Rasa NLU/DM과 Riva ASR/TTS를 통합해 음성 기반 가상 어시스턴트를 구축하는 방법에 주안점을 둔다는 사실을 잊지 마세요.

이 가상 어시스턴트에는 사용자 인터페이스가 필요하므로 파이썬 플라스크(Python Flask) 프레임워크를 사용해 간단한 웹사이트를 만들어줍니다.

이 솔루션과 코드에 대한 추가 정보는 Riva 다큐멘테이션가상 어시스턴트(와 Rasa) 섹션을 참고하세요.

필수 요건

가상 어시스턴트를 위해서는 먼저 Riva 서버가 정상적으로 작동 중이어야 합니다. Riva AI Services를 실행하고 gRPC 엔드포인트를 통해 접근 가능하게 만들려면 Riva 빠른 시작 가이드(Quick Start Guide)의 지시를 따르세요.

Rasa 어시스턴트에 Riva ASR 통합하기

이 섹션에서는 asr.py 파일에 있는 Riva ASR을 Rasa 어시스턴트에 통합합니다.  

Riva ASR은 스트리밍 또는 배치(batch) 모드로 사용 가능합니다. 스트리밍 모드는 연속적인 오디오 스트림을 캡처/인식해 전사 텍스트를 스트림 형식으로 생성합니다. 배치 모드는 설정된 길이만큼의 오디오 클립을 텍스트로 전사합니다. 본 활용 사례에서는 Riva ASR을 스트리밍 모드로 사용합니다.

코드 개괄

import grpc
import riva.modules.client.src.riva_proto.audio_pb2 as riimport riva.modules.client.src.riva_proto.riva_asr_pb2 as risrimport riva.modules.client.src.riva_proto.riva_asr_pb2_grpc as risr_srv

먼저 Riva 클라이언트의 필수 종속성을 가져오기 합니다.

class ASRPipe(object):
        def __init__(self):
        . . . .
        self.chunk = int(self.sampling_rate / 10) # 100ms
        self._buff = queue.Queue()
        self._transcript = queue.Queue()
        self.closed = False

ASRPipe 클래스를 생성해 Riva ASR 작업을 처리합니다. __init__ 메소드에서 오디오 스트림과 전사된 텍스트 스트림용으로 _buff _transcript 대기열을 각각 생성해줍니다.

    def start(self):
        . . . .
        self.channel = grpc.insecure_channel(riva_config["RIVA_SPEECH_API_URL"])
        self.asr_client = risr_srv.RivaSpeechRecognitionStub(self.channel)

start 함수를 호출해 Riva 서버에 gRPC 채널을 설정합니다.

    def fill_buffer(self, in_data):
        """Continuously collect data from the audio stream, into the
                      buffer."""
        self._buff.put(in_data)

가상 어시스턴트의 ASR은 일종의 백그라운드 프로세스입니다. 웹사이트가 사용자의 오디오에 상시적으로 귀를 기울여야 하기 때문이죠. 오디오 스트림에서 나오는 오디오를 오디오 버퍼 _buff에 지속적으로 추가하려면 fill_buffer함수를 호출합니다.

    def main_asr(self):
        . . . .
        config = risr.RecognitionConfig(
            encoding=ri.AudioEncoding.LINEAR_PCM,
            sample_rate_hertz=self.sampling_rate,
            language_code=self.language_code,
            max_alternatives=1,
            enable_automatic_punctuation=self.enable_automatic_punctuation        )
        streaming_config = risr.StreamingRecognitionConfig(
            config=config,
            interim_results=self.stream_interim_results)
        if self.verbose:
            print("[Riva ASR] Starting Background ASR process")
        self.request_generator = self.build_request_generator()
        requests = (risr.StreamingRecognizeRequest(audio_content=content)
                    for content in self.request_generator)
        def build_generator(cfg, gen):
            yield risr.StreamingRecognizeRequest(streaming_config=cfg)
            for x in gen:
                yield x
            yield cfg
        if self.verbose:
            print("[Riva ASR] StreamingRecognize Start")
        responses = self.asr_client.StreamingRecognize(build_generator(
                          streaming_config, requests))
        # Now, put the transcription responses to use.
        self.listen_print_loop(responses)

오디오를 확보한 뒤 main_asr함수로 전사본을 생성합니다.

main_asr함수에서 언어, 채널의 수, 오디오 인코딩, 샘플률 등 Riva ASR 호출에 필요한 구성 파라미터를 설정하세요. 다음으로 main_asr함수가 build_generator함수를 정의합니다. 이 함수는 Riva ASR StreamingRecognizeRequest 함수를 오디오 클립, ASR 구성과 함께 반복 호출하는 생성기입니다. 마지막으로 main_asr 이 Riva ASR StreamingRecognize 함수를 호출합니다. 이 함수는 중간/최종 전사본임을 나타내는 플래그가 포함된 텍스트 전사본의 스트림을 반환하며, 이것이 다시 호출자에게 반환됩니다.

Rasa 어시스턴트에 Riva TTS 통합하기

이 섹션에서는 tts.py 와 tts_stream.py파일에 있는 Riva TTS를 Rasa 어시스턴트와 통합합니다.

ASR과 마찬가지로 TTS 또한 스트리밍 또는 배치 모드로 사용 가능합니다. tts.py의 배치 모드는 텍스트를 인풋으로 가져와 오디오 클립을 생성합니다. ts_stream.py의 스트리밍 모드는 텍스트를 인풋으로 가져와 오디오 스트리밍을 생성합니다.  

코드 개괄

import grpc
import riva.modules.client.src.riva_proto.audio_pb2 as riimport riva.modules.client.src.riva_proto.riva_tts_pb2 as rttsimport riva.modules.client.src.riva_proto.riva_tts_pb2_grpc as rtts_srvfrom riva.tts.tts_processing.main_pronunciation import RunPronunciation

먼저 Riva 클라이언트의 필수 종속성을 가져오기 합니다.

class TTSPipe(object):
    def __init__(self):
        . . . .
        self._buff = queue.Queue()
        self._flusher = bytes(np.zeros(dtype=np.int16,
                              shape=(self.sample_rate, 1))) # Silence audio
        self.pronounce = RunPronunciation(pronounce_dict_path)

TTSPipe 클래스를 생성해 Riva TTS 작업을 처리합니다. __init__메소드에 _buff대기열을 생성해 인풋 텍스트를 보관합니다.

    def start(self):
        . . . .
        self.channel = grpc.insecure_channel(
                             riva_config["Riva_SPEECH_API_URL"])
        self.tts_client = rtts_srv.RivaSpeechSynthesisStub(self.channel)

 start 함수를 호출해 Riva 서버에 gRPC 채널을 설정합니다.

 def fill_buffer(self, in_data):
        """To collect text responses and fill TTS buffer."""
        if len(in_data):
            self._buff.put(in_data)

fill_buffer메소드를 호출해 오디오로 변환할 텍스트를 버퍼 _buff에 추가합니다.

    def get_speech(self):
        . . . .
        while not self.closed:
            if not self._buff.empty():  # Enter if queue/buffer is not empty.
                try:
                    text = self._buff.get(block=False, timeout=0)
                    req = rtts.SynthesizeSpeechRequest()
                    req.text = self.pronounce.get_text(text)
                    req.language_code = self.language_code
                    req.encoding = self.audio_encoding
                    req.sample_rate_hz = self.sample_rate
                    req.voice_name = self.voice_name
                    duration = 0
                    self.current_tts_duration = 0
                    responses = self.tts_client.SynthesizeOnline(req)
                    for resp in responses:
                        datalen = len(resp.audio) // 4
                        data32 = np.ndarray(buffer=resp.audio, 
                                    dtype=np.float32, shape=(datalen, 1))
                        data16 = np.int16(data32 * 23173.26)
                        speech = bytes(data16.data)
                        duration += len(data16)*2/(self.sample_rate*1*16/8)
                        self.current_tts_duration += duration
                        yield speech
                except Exception as e:
                    print('[Riva TTS] ERROR:', e)
       . . . .

get_speech메소드를 사용해 TTS를 실행합니다.

get_speech메소드에서 언어, 오디오 인코딩, 샘플률, 음성명 등 Riva TTS 호출에 필요한 구성 파라미터를 설정하세요. 다음으로 get_speech메소드가 Riva TTS SynthesizeOnline 메소드를 텍스트와 함께 인풋으로 호출하고, 생성된 오디오 스트림을 반환합니다. 이 응답 과정을 반복해 특정한 설정 기간 동안 산출된 아웃풋이 오디오 아웃풋으로 스트리밍됩니다.

일괄 통합하기

이제 NLU와 DM을 위한 Rasa 서버를 rasa.py파일과 함께 호출합니다.

class RASAPipe(object):    
    def __init__(self, user_conversation_index):
        . . . .
        self.user_conversation_index = user_conversation_index

NLU와 DM을 위한 Rasa 서버의 호출 일체를 처리할 RASAPipe 클래스를 생성합니다.

    def request_rasa_for_question(self, message):
        rasa_requestdata = {"message": message, 
                            "sender": self.user_conversation_index}
        x = requests.post(self.messages_url, json = rasa_requestdata)
        rasa_response = x.json()
        processed_rasa_response = self.process_rasa_response(rasa_response)
        return processed_rasa_response

이 클래스의 주요 함수는 request_rasa_for_question메소드입니다. 이 메소드는 사용자 인풋을 텍스트로 가져온 다음, 이 텍스트와 노출된 Rasa API의 발신자 ID로 Rasa를 호출합니다. 그리고 Rasa의 응답을 받아 호출자에게 반환하죠.

다음으로 chatbot.py파일에 설명된 대로 추론 파이프라인을 생성합니다.

class ChatBot(object):    def __init__(self, user_conversation_index, verbose=False):        self.id = user_conversation_index        self.asr = ASclass ChatBot(object):
    def __init__(self, user_conversation_index, verbose=False):
        self.id = user_conversation_index
        self.asr = ASRPipe()
        self.rasa = RASAPipe(user_conversation_index)
        self.tts = TTSPipe()
        self.thread_asr = None
        self.pause_asr_flag = False
        self.enableTTS = False

chatbot.py에는 ChatBot 클래스가 있습니다. 대화당 하나의 ChatBot 인스턴스가 존재하며, 이는 해당 대화의 ASR, TTS, Rasa 작업 일체의 처리를 담당합니다. ChatBot 클래스의 인스턴스가 생성되면 초기화 중에 ASR, Rasa, TTS 클래스의 인스턴스를 만들어줍니다.

        def server_asr(self):
        self.asr.main_asr()
    def start_asr(self, sio):
        self.thread_asr = sio.start_background_task(self.server_asr)

가장 먼저 호출되는 start_asr 메소드는 백그라운드 프로세스인 ASR이 처음부터 별도의 전용 스레드에서 작동할 수 있도록 해줍니다.

    def asr_fill_buffer(self, audio_in):        if not self.pause_asr_flag:            self.asr.fill_buffer(audio_in)    def def asr_fill_buffer(self, audio_in):
        if not self.pause_asr_flag:
            self.asr.fill_buffer(audio_in)
    def get_asr_transcript(self):
        return self.asr.get_transcript()

다음으로 asr_fill_buffer함수가 ASRPipe 인스턴스의 fill_buffer함수를 호출해 사용자의 인풋 오디오 스트림을 ASR 버퍼에 추가합니다. Riva ASR이 전사된 텍스트를 다시 스트리밍하기 시작하면 get_asr_transcript함수가 호출되어 전사된 텍스트를 호출자에게 반환합니다.

    def rasa_tts_pipeline(self, text):
        response_text = self.rasa.request_rasa_for_question(text)
        if len(response_text) and self.enableTTS == True:
            self.tts_fill_buffer(response_text)
        return response_text

전사된 텍스트와 더불어 rasa_tts_pipeline메소드를 호출합니다. 이 메소드는 Rasa와 Riva TTS 기능의 파이프라인화를 담당하는데요. 먼저 RASAPipe 인스턴스의 request_rasa_for_question메소드부터 호출합니다. 이를 통해 사용자의 인풋 텍스트를 Rasa로 전송하면 Rasa NLP와 Rasa DM이 적절한 액션을 결정하고, 응답을 텍스트 메시지 형식으로 반환합니다. 이 텍스트 메시지는 다시 tts_fill_buffer로 전달되어 호출자에게 반환됩니다.  

    def    def tts_fill_buffer(self, response_text):
        if self.enableTTS:
            self.tts.fill_buffer(response_text)
    def get_tts_speech(self):
        return self.tts.get_speech()

전에 호출해둔 tts_fill_buffer가 TTSPipe 인스턴스의 fill_buffer 메소드를 호출해 TTS 버퍼를 인풋 텍스트로 채웁니다. TTS가 오디오 스트림으로 준비되면 get_tts_speech메소드가 호출되고, 해당 오디오가 호출자에게 다시 스트리밍됩니다.

이렇게 Rasa와 TTS 기능을 파이프라인화해 하나의 간단한 메소드인 rasa_tts_pipeline이 만들어졌습니다.

가상 어시스턴트 시작하기

가상 어시스턴스 서버를 시작하기에 앞서 네트워크 구성(Network Configuration) 섹션의 지시에 따라 API 엔드포인트를 적절히 구성해야 합니다.

음성 기반 가상 어시스턴트를 시작하려면 데모 실행(Running the Demo) 섹션의 지시를 따르세요.

위의 단계를 수행하는 동안 Rasa 액션 서버와 Rasa 서버의 개별 컨테이너를 초기화합니다. 이 과정은 길고 복잡합니다. 보다 간단한 메소드에 대한 추가 정보는 Rasa 도커의 작성과 설치(Docker Compose Installation)를 참고하세요.

정확도 개선하기

지금까지 살펴본 음성 기반 가상 어시스턴트의 정확도를 개선하는 방법은 두 가지입니다.

Rasa 대화 주도 개발과 Rasa X

대화 주도 개발(CDD)은 사용자의 말을 경청하고, 이를 인사이트로 활용해 AI 어시스턴트를 개선하는 프로세스입니다. 훌륭한 AI 어시스턴트의 개발이 힘든 것은 사용자가 예측이 불가능한 말을 내뱉기 때문입니다. 그러나 모든 대화에서 사용자가 원하는 바를 정확히 짚어낼 수 있다면 승산이 있습니다. 대화형 AI 개발의 전 단계에서 CDD를 연습하면 가상 어시스턴트가 실제 사용자의 언어와 행위를 통해 학습하는 능력을 갖게 됩니다.  

Rasa X는 CDD 연습용 툴입니다. Rasa X로 진행하는 CDD 단계는 다음과 같습니다.  

  • 공유(Share): 사용자에게 프로토타입을 최대한 신속히 제공해 시험 사용하도록 합니다. 외부 채널을 통해 연결하는 방법 외에도 Rasa X에서 링크를 전송해 사용자와 프로토타입을 공유할 수 있습니다. 이를 활용하면 어시스턴트를 외부 채널에 연결하기도 전에 테스트 사용자에게 최대한 빨리 전달할 수 있습니다.
  • 검토(Review): 사용자가 여러분의 어시스턴트와 나눈 대화 내용을 주의 깊게 읽어보세요. 프로토타입 제작부터 생산에 이르는 전 단계에서 도움이 됩니다. Rasa X나 여러분이 연결한 채널 일체의 모든 대화가 대화창에 표시됩니다. 
  • 주석화(Annotation): 자체 NLU 모델을 실제 대화의 메시지에 기반해 개선합니다. 새로운 메시지가 도착할 때마다 사이드바에 배지(badge)가 등장해 처리할 새 데이터가 있음을 알려줍니다. 메시지에 ‘정확’이라 표시하고, 부정확한 응답을 수정하며, 실제 사용자가 어시스턴트에게 발화하는 내용을 반영한 데이터를 추가할 수 있습니다.
  • 검증(Test): 전문적인 팀이라면 애플리케이션 출하 전에 반드시 검증을 진행합니다. Rasa X에 실제 대화를 시험용으로 저장해 놓으면 대화의 성공 여부를 즉시 검증할 수 있습니다. Rasa X를 서버에 배포한 뒤에는 지속 통합(CI) 파이프라인을 구축해 검증을 자동화합니다. Rasa X의 통합형 버전 컨트롤(Integrated version control)이 검증 프로세스를 작동시키는 CI 파이프라인은 변경 사항이 전달될 때마다 자동 실행됩니다.
  • 추적(Track): 성공적인 대화와 그렇지 못한 대화를 식별해 어시스턴트의 성능을 평가합니다. 이 프로세스를 자동화하려면 활용 사례에 기반한 특정 액션에 Rasa X API로 자동 태그를 지정해줍니다. 서비스에 등록하거나 담당자와의 연결을 요청하는 사용자 등의 태그 표시기가 이에 해당합니다.
  • 정비(Fix): 각각의 단계를 거치며 파악한 어시스턴트의 성능과 오류 발생 지점을 바탕으로 정비를 진행하고, 반복 작업을 통한 개선을 꾀합니다.

CDD는 선형적인 프로세스가 아니며, 각 단계를 오가면서 작업이 진행됩니다. 제품과 설계, 개발 과정의 협업 프로세스를 통해 사용자의 요구를 파악하고자 하죠. 어시스턴트가 제대로 작동할 수 있게 사용자의 행위를 그에 맞추는 대신, 어시스턴트가 사용자의 요구에 맞춰가도록 만듭니다. 보다 자세한 정보는 Rasa X 설치 가이드(Rasa X Installation Guide)를 참고하세요.

NVIDIA TAO Toolkit

대부분의 경우, 구체적인 활용 사례에 맞춰 모델의 훈련과 조정, 최적화를 진행해야 합니다. 모델을 커스트마이징하면서 정확도를 높이는 가장 유의미한 방법은 사전 훈련된 Riva 모델에서 사용자의 커스텀 데이터와 NVIDIA TAO Toolkit를 이용해 전이 학습(transfer learning)을 진행하는 것입니다.

NVIDIA TAO Toolkit는 대규모의 훈련용 데이터세트나 AI에 대한 심층적인 지식이 없이도 사전 훈련된 모델을 사용자의 커스텀 데이터로 미세 조정할 수 있게 해주는 AI 모델 조정용 프레임워크입니다. 음성 인식과 자연어 이해, 문자 음성 변환에 이르는 대화형 AI 파이프라인에 필요한 여러 모델을 지원하죠.

TAO Toolkit의 가장 중요한 특징은 사전에 정의된 파이썬 스크립트를 활용해 AI/DL 프레임워크의 복잡성을 해소한다는 점입니다. 사용자는 미리 구축된 전용 도커 컨테이너에서 작업 일체를 실행합니다. 이 파이썬 스크립트는 지원 모델의 관련 분야와 분야별 작업에 따라 명확한 계층이 존재하도록 구성됩니다. 각 모델에서 TAO Toolkit는 데이터 준비와 훈련, 모델의 미세 조정, 추론을 위한 내보내기에 이르기까지 사용자가 따라야 할 작업의 순서를 조정합니다.  

더 자세한 정보는 TAO Toolkit 다큐멘테이션을 참고하세요.

결론 

지금까지 음성 기반 가상 어시스턴트를 구축하고 Riva ASR/TTS, Rasa NLP/DM과 통합하는 방법을 탐구했습니다. 또한 NVIDIA Riva SDK와 Riva ASR/TTS의 작동 방식도 살펴봤습니다.

Riva 다큐멘테이션에 더 많은 샘플 노트북애플리케이션이 준비되어 있으며, 이를 경험해볼 것을 권장합니다. Riva 포럼에 참여해 Riva 커뮤니티와 소통하세요. Rasa를 더 자세히 알아보고, Rasa 포럼과 함께하며 다른 개발자들이 구축 중인 모델도 만나보세요!

Discuss (0)

Tags

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다