[WWDC 정리] Customize on-device speech recognition
Tags: wwdc23, speechrecognition, ios, wwdc
Published: 2023-10-02 12:36:41

## Intro
- `Speech`: iOS에서 음성인식 기능을 위해 사용하는 프레임워크
- Siri 및 키보드 받아쓰기 기능과 동일한 기술을 사용하여 음성 지원 앱을 만들 수 있다.
- 하지만 개발을 할 때 기본 음성 인식 class를 그대로 사용하기엔(out of the box라는 표현을 사용) 모든 앱에 들어맞지는 않은 문제가 있음.
- 본 세션은 Speech 프레임워크의 음성 인식 모델의 원리를 설명하고, 각 앱에 맞도록 모델을 Custom하는 내용들을 다루고 있음.

## A Speech Recognition System: 음성 인식 시스템
!["사진"](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/35r4umchol7yqy2j5ojw.png)
- 음석 인식 시스템은 Acoustic Model안에 음성 데이터 주입
- Model은 phonetic representation(음성 표현) 생성


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g0hkjcv7vdr2675zd8t5.png)
- 음성 표현은 쓰여진 형식(필사본, transcription)으로 변환됨.
- 때때로 여러 음성 표현이 한 오디오 데이터에 맞거나
- 하나의 음성 표현이 다양한 transcription에 해당될 수 있음.
- 위 사진의 경우 여러개의 transcription 후보들이 나온 케이스. 이를 명확하게 구분할 방법이 필요
    - 이를 위해 **Language Model**사용

## Language Model: 언어 모델

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kx4l28va177huaqjlfry.png)
- Language Model은 주어진 단어가 연속적인 여러 단어의 뒤에 나올 가능성(우도, likelihood)을 예측
- 문장 전체에 적용하면 이 문장이 말이 안되는지 알 수 있게 함.
  - 우도: 확률의 반대 개념. 확률은 고정된 사건과 변화하는 확률 분포, 우도는 변하는 사건과, 고정된 확률 분포.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cagoglr18h4uvaihgvwh.png)
- 문장 전체에 적용하면 이 문장이 말이 안되는지 알 수 있게 함.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/os6glnhapykjjn6zmu0h.png)
- language model은 학습되는동안 모델이 노출된 사용 패턴에 근거해서 가능성이 낮은 후보 단어들을 제치도록 도와줌.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9u74n97lskbq9davfmpf.png)
- iOS 10부터 Speech 프레임 워크는 전체 과정을 캡슐화 함. 인터페이스 사용하기 쉬움.


## 체스 앱 예시

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t4hi2otd4s7sx110z6px.png)

- “Play the **<u>Albin</u>** counter gambit”
- misrecognized: “Play the **<u>album</u>** counter gambit”
- 잘못 인식한 이유: Language Model은 학습 과정에서 많은 음악 요청에 노출 되었음


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gs2cai6pceom0nufd9ou.png)


- 그래서 앨범 이름을 입력할 수 있는 “Play the album”로 인식
- 반대로 내가 선호하는 transcription이 나오지 않을 수 있음.
- 언어 모델의 동작을 추상화함으로써 Speech 프레임워크는 모든 앱들이 같은 모델을 사용하도록 강제함.
    - 다른 동작이 필요한 다른 도메인일지라도


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2rjuuyms9kxqigfsqgyu.png)

- iOS 17부터 SFSpeechRecognizer의 언어 모델 동작을 커스텀하는게 가능함
- 앱에 맞게 조정하고, 정확도를 향상시킬 수 있음


## 언어 모델 customization

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/718e78lib8hiafayqjr3.png)
1. 학습 데이터 만들기 (개발 과정에서 할 수 있음)
2. 앱에서 데이터를 준비하고, 인식 요청을 configure하고, 실행

## Data Generation
- 학습 데이터 구축 과정
- 높은 수준에서, 학습 데이터는 앱 사용자가 사용할 가능성이 높은 문장을 나타내는 텍스트 조각으로 구성
- 이는 모델이 이 문장을 예상하고, 올바르게 인식할 likelihood를 높임

## Speech Framework

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xn5sfkwfoncevfkr50zu.png)

- Speech 프레임워크는 학습 데이터의 컨테이너 역할을 하는 새로운 클래스 도입
    - 이는 결과 빌더 DSL을 사용해서 빌드됨.
- `PhraseCount` 객체: 정확한 구절이나 구절의 일부 제공.
    - 또한 샘플이 최종 데이터 셋이 **몇 번 표시**되어야하는지도 설명
    - 특정 구문에 다른 구문보다 더 큰 **가중치**를 부여하는데 사용 가능.
- 시스템에서 허용되는 데이터는 한정적이기 때문에, 전반적인 **학습 데이터** 예산과 **구문 데이터 강화**의 밸런스를 맞추어야 함.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q3knyxmvnvmxz085tq8v.png)



- `FCustomLanguageModelData.PhraseCountsFromTemplates`:
    - 규칙적인 패턴에 맞는 많은 샘플을 쉽게 만들기 위해서 템플릿을 이용할 수 있음.
    - ex) 체스의 움직임을 만드는 세 단어들의 클래스들
        - piece: 타겟. 이동해야하는 말
        - royal: 보드의 어느 쪽에서 플레이할지 정의하는 왕 말
        - rank: 이동해야할 랭크
        - → 모든 움직임의 가능성을 나타내는 데이터 샘플을 쉽게 만들 수 있음.
            - 10000개의 샘플을 모든 결과 데이터 샘플에 균등하게 얻음
    - 데이터 오브젝트가 만들어지면, 파일로 내보내고 에셋처럼 앱에 배포할 수 있음.
    

## Custom Pronunciations
- 앱에서 전문 용어를 사용하는 경우. 예를 들어 약 이름을 포함한 의료 앱의 경우
    - 철자와 발음을 모두 정의하고 해당 용어의 사용법을 정의하는 PhraseCount를 제공할 수 있음.
- 사전에 단어 등록
- 발음들은 X-SAMPA 문자열 형식으로 입력할 수 있음
- 각 locale들은 고유한 발음 기호의 하위 집합을 지원 (설명서 참조)
    - locale: 사용자 인터페이스에서 사용되는 언어, 지역설정, 출력 형식등을 정의하는 문자열.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t329hpbhomrjei95rh2s.png)



- 프랑스어 방언 Winawer을 이해할 수 있도록 변형

## Personalized Data
- Usage Patterns
    - 동일한 API로 앱이 런타임에 접근할 수 있는 데이터에 대해 학습할 수 있음.
    - 사용자가 학습하려는 체스의 공격과 방어에 초점을 맞추는 것처럼 사용자에게 특정 사용 패턴을 지원하기 위해 이 작업을 수행할 수 있음
- Names
    - 이름이 있는 엔티티들을 훈련할 수 있음
- Privacy
    - 앱이 사용자의 연락처에 대한 네트워크 플레이를 지원할 수 있음.
    - 개인 정보 보호가 가장 중요
    
- 예시: 커뮤니케이션 앱



- 커뮤니케이션 앱에서 통화내역에 표시되는 연락처 빈도에 따라 전화걸기 명령 강화 가능
    - 이러한 정보는 항상 기기에 남아있어야 함
    - 앱 내에서 메서드로 데이터 객체를 생성하고, 파일에 쓰고, 수집
        
        
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7d6fchhnj97zgqdjwl9a.png)


        
    


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gz0azwr2xamfh0awc8b2.png)



- 학습 데이터가 생성되면 단일 로캘에 바인딩 됨
- 단일 스크립트 내에서 여러 로캘 지원하려면 `NSLocalizedString`과 같은 표준 로컬라이제이션 기능을 사용하면 됨

- 앱에서 Model 사용
    

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yrml8pxpl2u9td30ak9h.png)
    
- 이전 단계에 생성한 파일을 받아들이고, 우리가 나중에 사용할 새로운 두 개의 파일을 만들기 위해 새로운 메서드 `prepareCustomLanguage`를 호출
      - 호출하는데에 시간 오래걸리기 때문에 메인 스레드에서 호출하고, 로딩화면과 같은 일부 UI뒤에 Latency를 숨기는 것이 좋음.
        

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/en74y2tju2lo84x9vfyk.png)


  - lmcustomization은 네트워크를 통해 사용자 지정 데이터를 전송하지 않으면서 지원
        

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uvo56z9bovnniyqm6kzf.png)



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ig60lnlml5qltz88gonk.png)