2011년 10월 27일 목요일

렌더스크립트(Renderscript)를 소개합니다.


이 글은 그래픽, 성능 튜닝, 소프트웨어 아키텍쳐에 정통한 안드로이드 엔지니어 R. Jason Sams가 작성하였습니다. - Tim Bray (Introducing Renderscript의 번역입니다.)

렌더스크립트는 이전에 자세히 다룬적 없는 허니컴의 새 핵심 기능입니다. 여기선 이를 두 부분으로 나누어 설명할텐데요. 이 글은 렌더 스크립트에 대한 짧은 개론입니다. 간단한 예제와 더 기술적인 글을 다음에 하겠습니다.

렌더스크립트는 고성능 3D 렌더링과 컴퓨팅 연산에 맞춘 새 API입니다. 렌더 스크립트의 목적은 저수준에서 얻은 고성능의 API를 안드로이드 개발자에게 주는 겁니다. 자신의 애플리케이션 성능을 최적화려 기계 수준까지 작업하는게 익숙한 개발자를 대상으로 합니다. 렌더 스크립트는 개발자에게 3종의 기본 도구를 제공합니다. 하드웨어 가속되는 간단한 3D 렌더링 API, CUDA와 유사한 개발자 친화적인 연산 API, C99와 흡사한 언어입니다.

렌더스크립트는 유튜브와 책 앱을 화려하게 했습니다. 허니컴 타블렛에 탑재된 첫 라이브 배경화면도 이 API를 이용했죠.

디바이스에서 네이티브 코드를 수행함으로서 성능향상을 얻습니다. 기존의 NDK와는 달리 이 해법은 플랫폼을 가리지 않습니다. 렌더스크립트 용 개발언어는 C99를 확장한 언어입니다. 이 언어는 개발할 땐 장비와 무관하게 컴파일되어 애플리케이션 패키징됩니다. 앱이 수행될 때 이 스크립트를 기계 코드로 컴파일하여 장비에 최적화합니다. 개발 중에 특정 머신의 아키텍쳐로 고정하는 문제를 제거한 거죠.

렌더스크립트는 기존 플랫폼의 고수준 렌더링 API와 언어를 대체하는 것이 목표가 아닙니다. 기존 API의 능력 밖의 성능이 필요한 중요 코드에 쓰려는 겁니다.

CPU냐 GPU냐? 이런 대립적인 얘기를 하지 않는것이 흥미로울 지도 모릅니다. 장비에서 실시간으로 수행될 곳이 정해지기 때문에 어디에서 수행되는 것인지는 의미가 없습니다. 간단한 스크립트는 작업을 GPU에서 연산하죠. 더 복잡한 스크립트는 CPU에서 하고요. CPU는 적합한 GPU와 다른 가속기가 없는 상황에서도 언제나 제대로 동작하게 해주는 대체제이기도 합니다. 그래서 렌더스크립트는 개발자들에게 투명합니다. 일반적으로 작은 스크립트는 이 후에 더 다양한 영역에서 수행될 수 있어요. 지금 당장은 단순히 CPU를 더 꽂아 CPU 리소스를 더 활용할 수 있죠.



위 비디오는 렌더스크립트 예제를 동작시켜 타블렛의 HDMI out 출력을 캡쳐한 것입니다. (고화질 버전은 유튜브에 있습니다.) 이 비디오는 단순 무식하게 물리 시물레이션 중인 900개의 입자를 볼 수 있습니다. 이 계산 스크립트는 매 프레임 동작하며 자동으로 양쪽 코어 (CPU, GPU)를 활용합니다. 물리 시물레이션이 끝나면 이어 그래픽 스크립트가 렌더링을 합니다. 비디오에선 하나의 큰 공을 집어넣어 상호 작용시켰습니다. 그리고 타블렛을 기울여서 중력을 활용했죠. 신형 허니컴 타블렛의 듀얼 코어 A9의 위력을 보여줍니다.

렌더스크립트 그래픽은 연속적인 장면을 랜더링하기 위한 새로운 런타임을 제공합니다. 이 런타임은 하드웨어 가속되며, 사용자의 스크립트를 이용하여 통제된 달빅 코드에 대한 추가된 기능을 제공합니다. 이 통제된 코드는 "페이지를 켜"나 "리스트를 움직여" 같은 다소 정제 덜 된 명령을 보냅니다. 이 두 측면의 명령어는 사용자 스크립트에 의해 결정됩니다. 이런 방식으로 전체적으로 원하는 방식대로 정할 수 있죠. 렌더스크립트 그래픽의 이전 예제는 이클레어에 실린 라이브 배경화면과 3D 애플리케이션 런쳐입니다.

허니컴에선 렌더스크립트가 렌더러를 GL ES 1.1에서 2.0으로 바꾸었습니다. 동시에 프로그램 가능한 세이더 모델, 3D 모델 로딩, 더 많이 효율적인 할당 관리 등을 추가하였습니다. LLVM 기반의 새 컴파일러는 이클레어, 진저브레이드의 타임 프레임에 사용된 acc보다 몇배는 효과적입니다. 렌더스크립트 API와 도구의 가장 중요한 변화는 이제 공식이라는 것입니다.


위의 스크린 샷은 내부 테스트 앱에서 찍은 것입니다. 애플리케이션은 간단한 장면 그래프(scene-graph)를 구현한 것이고요. 재귀적으로 스크립트가 스크립트를 호출합니다. 이 안드로이드는 마야로 작성된 콜라라도 파일을 A3D파일로 변형해 읽은 것입니다. A3D 파일은 장비에서 렌더스크립트 객체를 저장하는데 사용하는 파일 형식입니다.

다음으로 더 기술적인 정보와 샘플 코드로 이어가겠습니다.

2011년 10월 23일 일요일

안드로이드용 음성 입력 (Speech Input) API

Alex Gruenstein에 의해 2010년 3월 5일 오전 10시에 작성되었습니다.
Speech Input API for Android의 번역입니다.

사람들은 휴대폰을 어디서나 만질 수 있어 좋아합니다. 대화 뿐만 아니라 이메일, 문자, 마이크로블로깅 등을 하고요. 게다가 안드로이드 2.1 버전에서는 음성 지원 키보드가  추가되었고 음성으로 검색하고 "~로 가자"와 같은 음성 단축키와 같은 기능도 쉽게 사용할 수 잇습니다. 이제 우리의 메시지를 치지 않고 말로 할 수 있습니다. 키보드에 새로 들어온 마이크로폰 버튼을 누른 후 평소에 타이핑하던 것들을 그냥 말하면 됩니다.

우리는 음성 (입력)이 모바일 경험을 근본적으로 바꿀 수 있다고 믿습니다. 우리는 안드로이드 SDK를 통해 음성 입력 능력을 통합하는 것을 고려하도록 모든 안드로이드 애플리케이션 개발자들을 초대하고 싶습니다. 내가 좋아하는 마켓에 올라온 음성 입력 가능한 앱은 Handcent SMS입니다. 어떤 SMS라도 SMS 팝업 윈도우가 뜨면 툭 건딜어 답장할 수 있죠.



음성 입력 통합된 Handcent SMS

안드로이드 SDK는 애플리케이션에 음성 입력을 직접 결합하는 것을 쉽게 합니다. 이 샘플 애플리케이션을 복사 붙여넣기 해서 시작점으로 삼으세요. 안드로이드는 개방된 플랫폼이기 때문에 디바이스에 RecognizerIntent를 받게 등록된 음성 인식 서비스를 아무거나 사용할 수 있습니다. 많은 안드로이드 단말에 미리 설치된 구글 음성 검색 애플리케이션은 RecognizerIntent를 받아 "Speak Now" 대화창을 표시하고 음성을 구글 서버로 전송합니다. 이 서버는 검색 위젯이나 음성 지원 키보드에서 마이크로폰 버튼을 눌렀을 때도 사용됩니다. (음성 검색이 설치되어있는지 여부는 Settings -> Applications -> Manage applications.에서 확인할 수 있습니다.)

중요한 팁 하나: 말해질 문장에 대해 생각하면 음성 입력을 더 정확하게 할 수 있습니다. "엄마, 내 목소리로 메시지를 보내는 거야."는 메일이나 SMS 메시지에 적합하고 구글 검색을 이용한다면 "마운틴 뷰의 날씨"등을 말이 더 맞을겁니다. 적합한 언어 모델을 요청하면사용자 경험을 향상할 수 있습니다. 긴 문장은 "free_form"을 쓰고 검색 문장과 같이 짧은 것은 "short_search"를 쓰는 거죠. 우리는 "free_from" 모델이 넥서스 원 보이스 키보드의 받아쓰기의 적합도를 향상하고 반면에 "web_search"는 사용자가 음성 검색을 원할때 사용하도록 개발했습니다.

구글 서버는 현재 영어, 만달린 중국어, 일본어를 지원합니다. 웹 검색(web_search) 모델은 세 언어 모두 지원하고 자유 형식 모델은 영어에만 우선 최적화되어 있습니다. 우리가 다른 언어의 다른 모델들을 열심히 개발하고  우리 제품에 사용될 음성 인식 기술의 적합도를 향상시키고 있습니다. 애플리케이션에 음성 능력을 바로 통합시킨 개발자들은 이익을 거두어가게 될 것입니다.