23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
온디바이스(On-device) 음성인식은 음성 데이터를 로컬에서 처리함으로써 효율성을 극대화하는 기술입니다.
특히, 에이닷 통화 요약 서비스에서 온디바이스 음성인식이 도입될 경우, 기존 서버 기반 처리 방식의 지연 시간과 연산 비용 문제를 극복할 수 있는 중요한 전환점이 될 것입니다.
이번 글에서는 현재의 음성인식 처리 방식과 온디바이스 음성인식이 제공할 수 있는 개선점, 그리고 이를 위한 개발 과정을 다룹니다.
에이닷 통화 요약 서비스는 사용자와의 통화 내용을 텍스트로 변환하여 요약을 제공하는 과정에서 빠른 응답성과 높은 처리 효율을 동시에 충족해야 하는 도전 과제를 안고 있습니다.
현재 서버 기반 음성인식 구조는 높은 정확성을 제공하지만, 지연시간과 연산 비용 측면에서 한계를 가지고 있습니다.
이러한 문제를 해결하기 위해 온디바이스 음성인식 기술이 도입되고 있으며, 이는 서비스의 근본적인 변화를 예고합니다.
현재 에이닷 통화 요약 서비스는 위의 그림에서 볼 수 있듯이, 서버 기반 음성인식 구조를 따르고 있습니다. 이 과정은 다음과 같이 진행됩니다:
통화 녹음 파일 생성: 사용자 단말에서 통화가 종료되면, 통화 녹음 파일이 생성됩니다.
에이닷 전화 서버로 업로드: 생성된 녹음 파일은 에이닷 전화 서버로 업로드됩니다.
음성인식 서버로 전달: 업로드된 파일은 음성인식 서버로 전달되어 텍스트로 변환됩니다.
결과 반환 및 파일 삭제: 변환된 텍스트 결과는 에이닷 전화 서버로 다시 전달되고, 원본 녹음 파일은 즉시 삭제됩니다.
이러한 구조는 안정적인 운영을 위해 설계되었지만, 지연 시간 문제를 발생 시킬 수 있습니다.
통화가 종료된 이후에 멀티미디어 파일이 네트워크를 통해 업로드되고, 이후 음성인식이 진행되기 때문에 파일이 일정 이상의 지연은 불가피합니다.
특히 긴 통화의 경우에는 사용자가 느끼게되는 지연 시간은 더 길어 질 수 있습니다.
온디바이스 음성인식 기술이 도입되면, 기존의 서버 기반 구조는 위 그림처럼 다음과 같이 변화 합니다:
로컬 음성인식 수행: 통화 녹음 파일이 생성되지 않고, 사용자 단말에서 바로 음성을 텍스트로 변환합니다.
텍스트만 서버로 전송: 음성인식 결과 텍스트만 에이닷 전화 서버로 전송되며, 음성 파일 자체는 단말을 벗어나지 않습니다.
또 다른 면으로 연산 비용 문제 해결도 중요합니다. 현재 에이닷 통화 요약 서비스는 하루 1,000만 건의 통화와 피크 시간대 120만 건의 통화를 처리하고 있습니다.
이런 많은 양의 음성을 끊김 없이 처리하기 위해서 대규모 GPU 리소스가 필요하며, 이는 상당한 연산 비용을 초래합니다.
온디바이스 음성인식은 이러한 비용을 줄일 대안으로도 검토되고 있습니다.
On-device ASR SDK는 EPD(End Point Detector), FSA(Finite State Automata), ASR로 구성되어 있습니다.
각 모듈들은 유기적으로 연결되어 최적화 되어 있기 때문에 별도의 추가 작업 없이 통합된 형태를 개발자가 바로 사용할 수 있습니다.
입출력 특징
여러 채널에 대한 입력으로 확장 가능하도록 설계되었으며, 채널별 음성은 상황에 따라 다른 길이의 sample chunk 단위로 분할하여 SDK에 입력됩니다.
모든 채널의 데이터가 SDK에 한번에 동시에 입력되며, 인식 결과는 입력된 chunk 데이터를 처리하는 중에라도 음성 segment에 대한 인식결과가 나오면
채널별로 ASR 결과 text를 callback으로 가져올 수 있습니다.
EPD 모듈
SDK 내부의 EPD 모듈을 통해서 10 msec 해상도로 음성 구간의 검출 여부를 판단하며, 음성 구간이 검출되면 해당 구간을 ASR의 입력으로 전달합니다.
이러한 이유로 EPD end point가 검출되어야 ASR 처리 후 결과를 반환할 수 있습니다.
경우에 따라 입력 chunk의 길이가 큰 경우 chunk 단위 처리로 인한 인식 결과에 대한 latency가 존재할 수 있습니다.
개발한 SDK에서는 이러한 latency를 줄이기 위해서, 음성 구간이 검출 되어 인식 결과가 반환되면 바로 인식결과를 가져올 수 있도록 callback API를 개발하여 사용하도록 했습니다.
또한 입력 음성 길이에 따른 ASR 연산 속도를 최적화하기 위해서 EPD는 음성 구간이 너무 길어지지 않도록 튜닝되어 있습니다.
ASR 모듈
ASR 모듈은 SDK의 핵심 모듈로 가장 많은 연산량을 차지하고 있습니다.
ASR 모델은 앞뒤 문맥을 충분히 고려하고 연산 효율을 최대로 하기 위해서 batch 단위로 프로세싱을 하고 있습니다.
따라서 한번에 처리해야 할 데이터가 많은 경우에 최대 효율을 낼 수 있고, 실시간으로 입력을 처리해야 하는 경우에도 발화 종료 이후 결과를 얻는데까지의 latency가 수 초 단위로 처리 속도가 빠른 편입니다.
FSA 모듈
FSA는 인식률이 낮을 수 있는 특정 단어(이름, 전문 용어 등)에 대한 인식 정확도를 높여서 사용자 편의를 높이는 역할을 수행하는데, FSA 단어리스트는 ASR 호출 시에 업데이트가 가능합니다.
따라서 개발자는 FSA 기능을 사용하여 인식률이 낮은 단어 리스트를 추가함으로 타겟 서비스에 따른 인식률 최적화가 가능합니다.
또한 개별 사용자별로 단어 리스트를 추가하면 사용자별 인식률을 최적화시킬 수도 있습니다.
SDK 특징
개발한 SDK는 ASR, EPD, FSA를 한번에 페키징하여 간단한 API를 제공하기 때문에 서비스를 위한 프로젝트에 적용 시 개발자가 쉽게 사용할 수 있는 장점을 가집니다.
특히 EPD 모듈이 SDK 내부에 통합되어 있어서 개발자가 음성 segmentation에 대한 추가 작업 없이 바로 사용 가능합니다.
On-device ASR SDK는 tensorflow lite를 이용하여 개발하였고, android와 ios에 대한 라이브러리를 제공할 수 있습니다.
android와 iOS 모두 ASR, EPD, FSA 라이브러리들을 패키징하여 AAR (Android Archive package)포맷과 framework 포맷으로 제공하고, 라이브러리 사이즈는 14MB 미만으로 모바일 환경에서 동작할 수 있습니다.
서버에서 온디바이스로 전환할 경우, 제한된 하드웨어 리소스와 메모리 환경으로 인해 일정 수준의 성능 저하가 일반적으로 발생합니다.
하지만 이번 프로젝트에서는 사용자가 이러한 성능 차이를 전혀 체감하지 못할 수준의 열화만을 허용하는 것을 최우선 목표로 삼았습니다.
이를 달성하기 위해 서버향(Server-side)과 동일한 구조와 모델 사이즈로 시작하여, 성능과 속도를 동시에 최적화하는 작업을 진행했습니다.
모델 구조는 Listen, Attend and Spell (LAS) 구조를 그대로 적용했습니다. LAS는 인코더-디코더 기반으로 동작하며, 높은 정확도와 안정성을 자랑하는 모델입니다.
인코더(Encoder): 오디오 입력을 처리하고 고차원의 특성(feature)을 추출하는 부분.
디코더(Decoder): 인코더에서 나온 정보를 바탕으로 최종 텍스트를 예측하는 부분.
온디바이스 환경에서는 속도가 중요한 만큼, 인코더와 디코더의 모델 사이즈를 조절하며 최적의 성능-속도 균형을 찾는 작업을 수행했습니다.
모델 최적화 과정에서 주요 초점은 효율성과 속도였습니다.
구조 상에서 초록색(Encoder 관련) 및 오렌지색(Decoder 관련) 부분은 모델 변수(parameter)가 포함된 영역으로, 이 부분에 대해 상황에 맞춘 양자화(Quantization) 기술을 적용했습니다.
양자화는 모델의 연산 복잡도를 줄이고 메모리 사용량을 최적화할 수 있는 대표적인 방법으로, 특히 온디바이스 환경에서 필수적인 기술입니다.
현재까지 진행된 작업을 통해, 서버향 모델과 동일한 구조와 모델 사이즈에서 시작하여 성능 저하를 최소화하고 사용자 경험을 유지하는 데 주력하고 있습니다.
앞으로도 인코더와 디코더의 효율적 설계, 양자화 범위 확장 등을 통해 보다 최적화된 온디바이스 음성인식기를 구현하는 것이 최종 목표입니다.
음성인식 모델의 핵심 모듈 중 하나인 인코더(Encoder)는 입력 음성 신호를 처리하여 디코더가 활용할 수 있는 고차원 표현을 생성합니다.
인코더 설계는 모델 성능의 상당 부분을 좌우하기 때문에, 더 나은 성능과 효율성을 위해 다양한 구조를 탐구하고 적용해왔습니다.
이번 프로젝트에서는 트랜스포머에서 시작해 브랜치포머와 강화된 브랜치포머까지, 여러 구조를 실험하며 성능을 극대화하고자 했습니다.
트랜스포머 (Transformer)
트랜스포머는 Vaswani et al.(2017)의 논문, "Attention is All You Need"에서 처음 제안된 네트워크입니다.
이 구조는 RNN 기반 모델에서 발생하는 병렬 처리의 한계를 극복하고, 멀티헤드 어텐션(Multi-Head Attention) 메커니즘을 통해 효율적으로 글로벌 정보를 캡처합니다.
병렬 처리: 입력 데이터 전체를 동시에 처리하므로 학습 및 추론 속도가 빠릅니다.
멀티헤드 어텐션: 입력 시퀀스의 다양한 관계를 동시에 학습하여 정보 표현력을 극대화합니다.
음성인식 응용: 주로 대규모 데이터셋에서 강력한 성능을 발휘하며, 2020년 이전까지 음성인식 모델의 표준으로 자리 잡았습니다.
음성 데이터의 로컬 패턴(예: 음소 간 연속성)을 효과적으로 모델링하지 못한다는 점에서 한계를 보였습니다. 이를 해결하기 위해 더 세부적인 구조가 필요해졌습니다.
컨포머 (Conformer)
Gulati et al.(2020)의 논문, "Conformer: Convolution-augmented Transformer for Speech Recognition"에서 제안된 컨포머는
트랜스포머의 글로벌 모델링 능력에 컨볼루션 레이어를 추가하여 로컬 정보를 강화한 구조입니다.
Convolution Module: 음성 데이터의 시간적 연속성과 로컬 패턴을 학습하도록 설계.
Macaron Network: 일반 FFN(feed-forward network)을 대체하며, 정보 처리 과정을 양방향으로 개선.
상호 보완적 구조: 멀티헤드 어텐션으로 글로벌 정보를 처리하고, 컨볼루션 모듈로 로컬 패턴을 학습.
컨포머는 트랜스포머 대비 상세한 음성 신호의 시간적 특성을 더 잘 모델링하며, 음성인식 분야에서의 새로운 표준으로 자리 잡았습니다.
올해 서버향 모델에서 컨포머를 채택하여 정확도를 높였습니다.
브랜치포머 (Branchformer)
브랜치포머는 Peng et al.(2022)의 논문, "Branchformer: Parallel MLP-Attention Architectures to Capture Local and Global Context for Speech Recognition"에서 제안된 구조입니다.
브랜치포머는 글로벌 정보와 로컬 정보를 별도로 처리한 후 병합하는 방식을 채택하여 성능을 개선한 모델입니다.
정보 분리 및 병합: 글로벌 정보는 멀티헤드 어텐션으로, 로컬 정보는 MLP를 통해 처리.
효율적 병합: 두 정보를 병합하는 과정에서 각 정보의 중요도를 동적으로 조정.
적용성: 컨포머보다 적은 연산량으로 더 높은 성능을 발휘.
브랜치포머는 컨포머 대비 효율성과 성능의 균형을 유지하며, 대규모 음성 데이터셋에서도 뛰어난 성능을 보였습니다.
강화된 브랜치포머 (Enhanced Branchformer)
강화된 브랜치포머(Enhanced Branchformer)는 기존 브랜치포머의 병합 모듈에 컨포머의 마카롱 네트워크(Macaron Network)를 적용하여 개발된 구조입니다.
이를 통해 정보 통합의 정밀성을 더욱 강화했습니다.
Macaron Network 적용: 병합 모듈에서 양방향 정보를 처리하여 모델링 효율성을 높임.
연산 효율성 유지: 브랜치포머의 장점을 그대로 계승하면서도 더 세밀한 정보 처리가 가능.
실험 결과, 강화된 브랜치포머는 음성인식 정확도에서 컨포머와 브랜치포머를 모두 상회하였으며, 온디바이스 환경에서도 우수한 성능을 발휘하였습니다.
단계별 접근온디바이스 음성인식 모델을 개발함에 있어 중요한 단계 중 하나는 효율적 학습과 최적화입니다.
본 프로젝트에서는 두 가지 주요 학습 단계를 통해 모델을 구축하고 압축하며, 온디바이스 환경에 적합한 형태로 최적화하였습니다.
1단계: 스크래치 트레이닝(Scratch Training)
첫 번째 단계는 스크래치 트레이닝으로, 모델의 랜덤 초기화부터 시작하여 전 과정을 학습하는 방식입니다.
이 단계에서는 모든 가중치를 처음부터 학습하며, 모델이 데이터를 최대한 학습할 수 있도록 설정합니다.
서버향(Server-side) 모델의 경우: 스크래치 트레이닝을 통해 완성된 모델은 FP16(16-bit 부동소수점) 형식으로 변환되어 바로 서빙(serving) 환경에 적용됩니다.
FP16은 모델의 메모리 사용량을 줄이고 계산 속도를 높일 수 있는 최적화 기술로, 서버 환경에 적합합니다.
2단계: Knowledge Distillation을 통한 모델 압축
온디바이스 환경에서는 모델의 경량화가 필수적입니다. 이를 위해 두 번째 단계로 Knowledge Distillation(지식 증류)을 적용하였습니다.
티처(Teacher) 모델: 스크래치 학습 단계에서 학습된 완전한 모델을 사용하며, 이 모델은 학습 과정 동안 고정됩니다.
스튜던트(Student) 모델: 온디바이스 환경에 맞게 최적화된 경량화 모델입니다.
Knowledge Distillation 과정에서 가장 주목한 부분은 디코더(Decoder)입니다.
디코더는 전체 연산에서 상당한 비중을 차지하며, 성능 열화와 속도에 큰 영향을 미칩니다.
이를 해결하기 위해 디코더의 레이어 수를 기존 6개에서 3개로 절반으로 줄였습니다.
효율성: 디코더를 줄이는 작업은 모델의 전체 파라미터 수로 따지면 약 10% 미만의 감소지만, 속도 측면에서는 약 20%의 개선을 이루어냈습니다.
성능 열화 최소화: 여러 번의 실험과 시행착오를 거쳐 디코더를 줄이는 것이 가장 안정적이고 효율적인 압축 전략임을 확인하였습니다.
Knowledge Distillation 과정을 통해 경량화된 모델은 온디바이스 환경에서도 서버향 모델에 근접한 성능을 유지하면서도 속도를 대폭 개선하였습니다.
이는 사용자 경험을 유지하면서도 효율성을 극대화할 수 있는 가장 적합한 방식으로 평가됩니다.
Knowledge Distillation에서 초기값 설정의 중요성
Knowledge Distillation은 대규모 티처(Teacher) 모델에서 학습한 지식을 작은 스튜던트(Student) 모델에 전이하여 경량화된 모델을 생성하는 데 핵심적인 기술입니다.
이 과정에서 초기값 초기화(Initialization)는 모델 성능에 중요한 영향을 미칩니다.
본 글에서는 초기값 설정 전략의 두 가지 사례를 통해 성능 차이를 분석하고, 적절한 초기화가 가져오는 효과를 설명합니다.
Knowledge Distillation에서는 스튜던트 모델의 초기값 설정이 최종 성능에 결정적 역할을 할 수 있습니다. 이번 실험에서는 두 가지 초기화 전략을 비교했습니다.
첫번째 방법 은 1번 레이어 부터 한층씩 건너서 초기값을 가져오는 방법이고, 두번째 방법인 는 0번 레이어 부터 한층씩 건너서 초기값을 가져오는 방법입니다.
두가지 방법은 크게 차이가 없어 보이지만 최종적인 학습 결과는 그렇지 않습니다.
첫번째 방법은 티처 모델의 성능에서 AOS 테스트에서는 조금 개선되지만 iOS 테스트에서 조금 열하된 성능을 보입니다.
반면 두번째 방법은 AOS 테스트는 거의 유사한 인식률을 보이지만 iOS 테스트에서는 성능이 개선되고 있습니다.
위 실험 결과는 Knowledge Distillation 과정에서 초기값 설정이 단순히 시작 조건에 그치지 않고, 최종 모델 성능과 직접적으로 연결된다는 것을 보여줍니다.
서버향과 최대한 동일한 성능을 가지는 온디바이스 음성인식기를 개발하기로한 최초의 목적과는 조금 다른 목표를 달성하게 되었습니다.
현재 상용 서비스 모델과는 다른 인코더 구조를 사용하게 되었고, 최적화로 인해 오히려 개선된 성능을 가지게 되었습니다.
위 표와 같이 최초에 상용 서비스의 Conformer 모델을 온디바이스용으로 변환 시켰을때 0.02%라는 아주 작은 손실을 달성했습니다.
여기서 E-Branchformer를 적용하면서 인식률이 오히려 개선되었고, 모델이 조금 더 커졌지만 속도를 유지했습니다.
최종적으로 Knowledge Distillation 을 적용하면서 성능과 속도, 모델 크기가 모두 개선된 모델을 얻을 수 있었습니다.
작성자
반성민 (sungmin.ban@sk.com)
황성수 (sshwang@sk.com)
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.