8 Audio
8.1 DSP support
DSP 지원은 특정 i.MX 8QuadXPlus, i.MX 8QuadMax 그리고 i.MX 8M Plus SoC에서 제공된다.
8.1.1 HiFi 4 DSP framework
사용자 보드에서 HiFi 4 지원은 i.MX DSP User's Guide(IMXDSPUG)에 문서화되어 있다.
8.1.2 Sound Open Firmware
Sound Open Firmware는 HiFi 4 DSP 프레임워크에 대한 오픈 소스 대안이다. 사용자 보드에서 HiFi 4를 지원하려면, 공개 도메인에서 제공되는 SOF 프로젝트 문서 https://thesofproject.github.io를 참조한다.
툴체인, 지원되는 플랫폼, 바이너리 패키징 그리고 오디오 시나리오의 빠른 설정에 대한 자세한 내용은 SOF User Guide on NXP i.MX 8 platforms를 참조한다.
8.2 HDMI eARC support
eARC는 i.MX 8M Plus EVK 보드에서 지원된다.
이 절차는 imxaudioxcvr 카드를 통해 입력하고 wm8960audio 카드를 통해 재생되는 오디오를 활성화한다.
i.MX 8M Plus EVK 오디오 잭에 헤드셋이 연결되어 있는지 확인한다. 사용 방법은 다음과 같다:
- i.MX 8M Plus EVK에서 eARC 모드를 설정한다. 기본 모드는 SPDIF이다:
amixer -c 0 cset numid=1 2
- i.MX 8M Plus EVK에서 alsamixer를 사용하여 Headphone과 Playback 컨트롤을 wm8960-audio 카드의 최대 값으로 설정한다.
- i.MX 8M Plus EVK에서 imxaudioxcvr 카드로 오디오 녹음하고 wm8960audio 카드로 재생을 시작한다.
arecord -Dsysdefault:CARD=imxaudioxcvr -c2 -r48000 -fS32_LE - twav | aplay -Dsysdefault:CARD=wm8960audio
- TV에서 Digital Audio Out이 PCM인지 확인한다. 그런 다음, eARC mode를 ON으로 설정하고 i.MX 8M Plus EVK 잭에 연결된 헤드셋에서 오디오 출력을 확인한다. TV 설정은 다음 그림과 같아야 한다.
참고:
사용 방법은 Sony와 LG TV에서 테스트되었다.
eARC RX(i.MX 8M Plus EVK)에서 펌웨어는 HPD=high가 감지될 때까지 대기한다. 따라서, 위의 3과 4 단계에 설명 된대로 TV에서 eARC mode를 활성화하기 전에 i.MX 8M Plus에서 녹음과 재생을 시작해야 한다. 이렇게 하면 RX 측에서 동작을 더욱 예측할 수 있다. 또한, i.MX 8M Plus EVK에서 arecord … | aplay … 실행한 상태에서, 이어서 TV의 eARC mode를 OFF에서 ON으로 설정한다. TV에서 eARC mode가 ON으로 설정한 후 헤드셋에서 오디오가 들리는지 확인한다.
또한, HDMI 2.1 사양에 따라 완전한 eARC 기능을 활성화하려면, CEC 드라이버, DRM, HDMI/HDCP 컨트롤러 드라이버, EDID 그리고 eARC 드라이버 모듈 등 다양한 레이어와 모듈을 통합하는 시스템 레벨의 애플리케이션이 필요하다.
8.3 Low-power voice solution
8.3.1 Introduction
i.MX 8M Plus, i.MX 8M Mini 그리고 i.MX 93 플랫폼의 Cortex-M 코어는 저전력 음성 UI 솔루션을 위해 AsymmetricMultiprocessing(AMP) 아키텍처에 사용될 수 있다.
음성 활동 감지와 절전 해제 작업 엔진은 i.MX 8M과 i.MX 93의 최저 전력 코어를 사용하므로, Cortex-A 클러스터와 관련된 주변 장치가 대부분의 "active listening(활성 수신)" 시간 동안 절전 모드로 유지될 수 있다.
절전 해제 지시를 성공적으로 감지하면, Cortex-M 코어는 더 나은 음향 성능과 추가 음성 처리를 위해 Cortex-A 도메인을 절전 해제해야 한다.
이 솔루션에는 세 가지 구성 요소가 있다:
- Audio Front End(AFE)
- Linux 드라이버
- Cortex-M Image
참고:
i.MX 93의 Cortex-M 이미지는 아직 사용할 수 없다.
8.3.2 Standard voice solution
이전 섹션에서 설명한 저전력 음성 솔루션 외에도, 표준 음성 솔루션도 사용할 수 있다. 이 솔루션은 Cortex-M 이미지를 활용하지 않으므로, Linux 커널(드라이버와 ALSA 라이브러리를 사용해)에서 직접 마이크와 스피커 입력/출력을 사용한다. 또한 VIT 절전 해제(wake) 지시 감지 엔진(저전력 음성 솔루션의 VoiceSpot 대신)을 활용한다.
8.3.3 Audio Front End (AFE)
사람의 언어를 정확하게 감지하려면, 마이크의 오디오 신호가 에코, 노이즈 또는 기타 방해 없이 깨끗해야 한다. 이를 위해, 여러 개의 (보통)인터리브된 마이크 신호가 임베디드 디바이스로 입력되는 마이크 어레이가 일반적으로 사용된다. 그런 다음 이러한 복합 신호는 시그널 프로세서(일반적으로 오디오 프런트 엔드라고 하는)로 공급되어, 노이즈, 에코 그리고 기타 방해 요소를 필터링한다. 시그널 프로세서의 출력은 원하는 단일 채널의 깨끗한 마이크 오디오이며, 추가적인 처리(절전 해제 지시 감지와 자연어 처리)에 사용된다.
오디오를 Linux OS와 인터페이스하기 위해, Advanced Linux Sound Architecture(ALSA) 라이브러리가 사용된다. 다음 그림은 오디오 아키텍처를 보여준다.
AFE 코드는 GitHub에 있다: https://github.com/nxp-imx/nxp-afe/, Git tag: lf-5.15.52-2.1.0.
제공되는 AFE는 Yocto rootfs/unit_tests/nxp-afe/와 /usr/lib/nxp-afe/에 있다.
- /unit_tests/nxp-afe/afe: AFE 메인 애플리케이션
- /unit_tests/nxp-afe/TODO.md: 사용자 가이드 문서
- /unit_tests/nxp-afe/asound.conf: i.MX 8M Mini 기본 dtb에서 사용
- /unit_tests/nxp-afe/asound.conf_imx8mp: i.MX 8M Plus 기본 dtb에서 사용
- /unit_tests/nxp-afe/asound.conf_rpmsg_imx8mm: i.MX 8M Mini RPMsg dtb에서 사용
- /unit_tests/nxp-afe/asound.conf_rpmsg_imx8mp: i.MX 8M Plus RPMsg dtb에서 사용
- /unit_tests/nxp-afe/asound.conf_imx93: i.MX 93 기본 dtb에서 사용
- /usr/lib/nxp-afe/libdummyimpl.so: 더미 시그널 프로세서
- /usr/lib/nxp-afe/libdummyimpl.so.2.0: 더미 시그널 프로세서
AFE 외에도, Yocto BSP는 VoiceSeeker(멀티 마이크 음성 컨트롤 오디오 프런트 엔드 시그널 처리 솔루션), VoiceSpot(작은 메모리와 "Hey NXP" 음성 트리거 지시를 지원하는 MIPS 프로필 절전 해제 지시 엔진)와 로컬 음성 커맨드 인식을 위한 VIT를 통합한다. 이러한 제공은 GitHub(https://github.com/nxp-imx/imx-voiceui)에서 사용할 수 있다. 여기에는 다음을 포함한다:
- VoiceSeeker_wrapper 폴더에는 AFE 래퍼가 사용하는 공유 라이브러리를 생성하는 데 사용되는 코드가 포함되어 있다. nxp-afe 저장소에서 TODO.md를 확인한다.
- Voice_UI_Test_app 폴더에는 "voice_ui_app"라는 음성 UI 애플리케이션을 생성하는 데 사용되는 코드가 포함되어 있다. 이 애플리케이션에는 로컬 음성 커맨드 인식을 위한 VoiceSpot 절전 해제 지시 엔진과 VIT가 포함되어 있다. 이 애플리케이션은 음성 감지(절전 해제 지시와 음성 커맨드)를 위해 AFE의 출력을 사용한다.
해당 GitHub 저장소에서 VoiceSeeker 라이브러리와 Voice UI Test 애플리케이션을 빌드하는 방법을 설명하는 README 파일을 참조한다. 해당 파일이 빌드되면, 사용자는 다음 파일을 Yocto rootfs에 복사해야 한다:
- release/Config.ini를 /unit_tests/nxp-afe/에 복사한다.
- release/HeyNXP_1_params.bin을 /unit_tests/nxp-afe/에 복사한다.
- release/HeyNXP_en-US_1.bin을 /unit_tests/nxp-afe/에 복사한다.
- release/libvoiceseekerlight.so.2.0을 /usr/lib/nxp-afe/libvoiceseekerlight.so.2.0에 복사하고, libvoiceseekerlight.so를 libvoiceseekerlight.so.2.0로 심볼 링크한다.
- release/voice_ui_app를 /unit_tests/nxp-afe/에 복사한다.
그런 다음, 테스트를 수행하기 위해 /unit_tests/nxp-afe/TODO.md의 단계를 따른다. 일반적인 테스트 방법은 다음과 같다:
- ./voice_ui_app &
- ./afe libvoiceseekerlight &
- aplay test.wav &
- arecord -d10 -fS32_LE -r16000 -c1 voiceseeker_afe_on.wav
voice_ui_app 바이너리는 다음 VIT 커맨드를 활성화한다:
- MUTE
- NEXT
- SKIP
- PAIR DEVICE
- PAUSE
- STOP
- POWER OFF
- POWER ON
- PLAY MUSIC
- PLAY GAME
- WATCH CARTOON
- WATCH MOVIE
사용자가 "Hey NXP, power on"이라고 말하면, "Hey NXP"가 시스템을 절전 해제하고 "power on" 커맨드가 감지된다.
사용자가 절전 해제 지시 엔진을 선택하고, VIT 언어를 선택하거나 다른 설정을 구현할 수 있는 Config.ini라는 구성 파일이 있다. 표준 음성 솔루션의 일부이다.
$ cat /unit_tests/nxp-afe/Config.ini
[AFEConfig]
WWDectionDisable = 0
WakeWordEngine = VoiceSpot
DebugEnable = 0
RefSignalDelay = 3211
mic0 = 35.0, 15.15, 0.0
mic1 = 17.5, -15.15, 0.0
mic2 = -17.5, -15.15, 0.0
mic3 = -35.0, 15.15, 0.0
VoiceSpotModel = HeyNXP_en-US_1.bin
VoiceSpotParams = HeyNXP_1_params.bin
VITLanguage = English
- WWDectionDisable
절전 해제 지시와 커맨드 감지를 비활성화/활성화한다.
- 0 - 기본 값으로, 절전 해제 지시와 커맨드 감지를 활성화한다.
- 1 - 절전 해제 지시와 커맨드 감지를 비활성화한다. voice_ui_app에서 작동하지 않는다.
- WakeWordEngine
이 구성은 WWDectionDisable을 0으로 설정하는 것에 따라 달라진다. voice_ui_app에서 절전 해제 지시 감지를 위해 VoiceSpot나 VIT를 사용하는지 여부를 선택한다.
- VoiceSpot - 기본 값으로, VoiceSpot을 사용하여 절전 해제 지시 감지를 한다.
- VIT - VIT를 사용하여 절전 해제 지시 감지를 한다.
- DebugEnable
- 0 - 기본 값으로, 디버그 기록을 작성하지 않는다.
- 1 - RefSignalDelay 디버깅과 조정을 위해 AFE 입력/출력 스트림을 기록할 수 있다.
- RefSignalDelay
VoiceSeeker의 Acoustic Echo Cancellation(AEC)을 사용할 때, 레퍼런스 시그널 지연을 보정하는 데 사용된다. AEC 지원 라이브러리는 Flexera를 통해 제어된 액세스와 함께 제공된다. 자세한 내용은 voice@nxp.com으로 문의한다. - Mic coordinates
마이크의 XYZ 좌표(밀리미터 단위)이다. 좌표축의 원점은 편리하게 선택할 수 있다. - VoiceSpotModel/VoiceSpotParams
두 개의 파라미터는 WakeWordEngine을 "VoiceSpot"으로 설정하는 것에 따라 달라진다. VoiceSpot에서 사용하는 절전 해제 지시 모델과 파라미터를 지정하는 데 사용된다. - VITLanguage
이 구성은 WakeWordEngine을 "VIT"로 설정하는 것에 따라 달라진다. 절전 해제 지시와 커맨드를 감지하는 데 사용되는 VIT 언러를 선택한다.
- English - 기본 값으로, English를 사용한다.
- Mandarin - 설정하는 경우, 사용 가능한 VIT 절전 해제 지시와 커맨드가 Mandarin으로 나열된다.
- VIT Model generation online tool을 사용하면 새로운 VIT 모델을 생성하여 VIT 절전 해제 지시와 커맨드를 업데이트할 수 있다.
- 애플리케이션에서 새로운 VIT 모델을 고려하도록 하려면, ./vit/i.MX8M_A53/Lib/ 또는 /vit/i.MX9X_A55/Lib/에서 VIT 모델을 업데이트하고 Voice_ui_app를 다시 컴파일해야 한다.
- 저전력 또는 표준 구성에서 Voice_ui_app는 동일한 VIT 모델을 사용한다. 저전력 구성에서는, VIT가 음성 커맨드 모드에서만 사용되므로, VIT 절전 해제 지시 정보는 VIT 엔진에서 고려되지 않는다.
8.3.4 Linux drivers
음성 솔루션에서 사용하는 기본 Linux 드라이버는 다음과 같다:
- Loopback sound card: sound/drivers/aloop.c
- RPMsg sound card:
- sound/soc/fsl/fsl_rpmsg.c
- sound/soc/fsl/imx-pcm-rpmsg.c
- sound/soc/fsl/imx-rpmsg.c
8.3.5 Cortex-M Image
8.3.5.1 Application name
두 가지 다른 Cortex-M 애플리케이션이 있다.:
- low_power_voice, 여기서 Cortex-M은 VIT LPVAD 알고리즘을 실행한다. Linux OS가 일시 중단되면, Cortex-M은 음성 활동이 감지되는 즉시 Linux OS를 깨운다.
- low_power_wakeword는 VoiceSeeker와 VoiceSpot를 사용한다. Linux OS는 “Hey NXP” 절전 해제 지시가 인식될 때만 다시 시작한다.
두 애플리케이션 모두 i.MX 8M Mini와 i.MX 8M Plus용으로 제공된다. 그 결과 애플리케이션 이름은 아래와 같다:
- imx8mm_m4_TCM_low_power_voice.bin
- imx8mm_m4_TCM_low_power_wakeword.bin
- imx8mp_m7_TCM_low_power_voice.bin
- imx8mp_m7_TCM_low_power_wakeword.bin
8.3.5.2 Board setup
보드를 설정하려면, 다음 단계를 수행한다:
- 적절한 Cortex-M 애플리케이션이 SD 카드의 "boot" 파티션에 복사되었는지 확인한다. low_power_voice와 low_power_wakeword 애플리케이션은 공개 Yocto 빌드에 이미 존재해야 한다.
- 보드를 부팅하고, U-Boot 프롬프트에서 중지한 후 아래 커맨드를 실행한다:
- 적절한 디바이스 트리를 선택한다.
- i.MX 8M Mini:
setenv fdtfile imx8mm-evk-rpmsg-wm8524-lpv.dtb
- i.MX 8M Plus:
setenv fdtfile imx8mp-evk-rpmsg-lpv.dtb
- i.MX 8M Mini:
- Flash에서 TCM으로 Cortex-M 이미지를 로드하고, Linux OS를 부팅하기 전에 코어를 부팅한다.
setenv lpv 'fatload mmc 1:1 0x48000000 <application_name>; cp.b 0x48000000 0x7e0000 0x40000; bootaux 0x7e0000;' setenv bootcmd 'run lpv;'${bootcmd}
- 위의 변경 사항을 저장한다.
saveenv
- 적절한 디바이스 트리를 선택한다.
- 보드를 다시 부팅하면, Cortex-M이 Linux OS보다 먼저 자동으로 시작된다. 이는 Cortex-M 콘솔에서 확인할 수 있다.
- 적절한 ALSA 구성을 적용한다. Linux OS가 부팅된 후 콘솔에서 아래의 작업을 진행한다:
- i.MX 8M Mini:
cp /unit_tests/nxp-afe/asound.conf_rpmsg_imx8mm /etc/asound.conf
- i.MX 8M Plus:
cp /unit_tests/nxp-afe/asound.conf_rpmsg_imx8mp /etc/asound.conf
- i.MX 8M Mini:
- 오디오 애플리케이션(예: arecord, aplay, afe)을 시작하기 전에 오디오 루프백 드라이버를 로드한다. Linux OS 콘솔에서 아래의 작업을 진행한다:
modprobe snd-aloop
8.3.5.3 Execution
일단 시작하면, 사용자는 Cortex-M 애플리케이션을 제어하기 위한 직접적인 작업을 수행하지 않아도 된다. Linux 상태에 따라 적절한 작업을 자동으로 실행한다:
- Linux OS가 활성화된 경우: Cortex-M 애플리케이션은 데이터 펌프 역할을 하며, 마이크에서 오디오 데이터를 가져와 RPMsg를 통해 ALSA 드라이버에 제공한다.
- Linux OS가 일시 중지된 경우: 오디오 데이터는 (VIT LPVAD 또는 VoiceSeeker/VoiceSpot에 의해) Cortex-M에서 로컬로 처리된다. 데이터는 링 버퍼에도 저장된다. 음성이나 절전 해제 지시가 감지되면(애플리케이션에 따라 다름) Linux OS가 자동으로 다시 시작되고 링 버퍼의 데이터가 ALSA로 전송되며(따라서, Linux OS도 절전 해제 지시를 받음) 데이터 펌프가 다시 시작된다..
- Linux OS 일시 중: Cortex-M은 Linux OS를 일시 중지(suspend)하지 않고 다시 시작(resume)할 수 있는 가능성만 있다. 대신, 사용자 공간 작업을 통해 Linux OS를 일시 중지해야 합니다(일지 중지 결정은 음성만을 기준으로 할 수 없다. 또한 Linux OS에서 실행 중인 다른 모든 잠재적 사용자 애플리케이션도 고려해야 한다).
echo mem > /sys/power/state
8.3.6 Power consumption notes
공개 Yocto 릴리스를 사용하는 이러한 애플리케이션은 위에서 설명한 음성 UI 메커니즘을 사용하여 Linux OS를 일시 중지하고 음성 활동이나 절전 해제 지시에 깨어나지만 여전히 예상보다 훨씬 높은 전력 소비량을 보인다.
“Linux suspended” 상태 동안 가능한 한 낮은 전력 소비를 달성하려면, Cortex-M 애플리케이션과 Yocto 이미지 모두에서 일부 변경이 필요하다. 이러한 변경 사항은 Flexera를 통해 제어된 액세스로 제공된다. 자세한 내용은 NXP 담장자에게 문의한다.
'NXP i.MX SoC Family > i.MX Linux User`s Guide (IMXLUG)' 카테고리의 다른 글
i.MX Linux User's Guide (IMXLUG) - Security (0) | 2023.03.13 |
---|---|
i.MX Linux User's Guide (IMXLUG) - Graphics (0) | 2023.03.10 |
i.MX Linux User's Guide (IMXLUG) - Multimedia (0) | 2023.02.24 |
i.MX Linux User's Guide (IMXLUG) - Power Management (0) | 2023.02.24 |
i.MX Linux User's Guide (IMXLUG) - Enabling Solo Emulation (0) | 2023.02.24 |