
Spokestack을 통해 모든 Android 앱에 음성 제어를 추가하기위한 Fragment . example 디렉토리에서 작동중인 트레이를 표시하는 간단한 데모 앱을 찾을 수 있습니다.
Spokestack 트레이 조각을 레이아웃에 추가하면 화면 측면의 탭 모양의 마이크 버튼이 나타납니다 ( 측면 은 당신에게 달려 있습니다. 나중에 더 많이). 탭을 탭하거나 드래그하면 나머지 트레이가 표시되며,이 트레이는 채팅 앱에서 메시징 스트림처럼 배열됩니다. 트레이를 열면 마이크가 활성화되며 사용자가 자동 음성 인식 (ASR) 서비스를 통해 전송되고 텍스트로 표시됩니다. 그런 다음이 텍스트는 분류를 위해 NLU (Natural Language Anternire) 모델로 전송됩니다. 분류 결과는 트레이에서 이벤트를 듣기 위해 설정 한 응용 프로그램 구성 요소로 전송되며, 트레이가 Spokestack의 TTS (Text-Steepee) (TTS) 합성 서비스를 통해 사용자에게 표시하고 읽는 응답을 생성 할 수 있습니다. 앱의 응답이이를 지시하면 마이크가 다시 활성화됩니다. 그렇지 않으면 트레이가 닫히고 ASR을 비활성화합니다.
그리고 그렇게, 당신은 당신의 앱에 목소리를 추가했습니다!

아, 그리고 그 초기 상호 작용 후에, 트레이는 탭 대신 wakeword로 열 수 있습니다. Wakeword는 기본적으로 "Spokestack"이지만 사용자 정의 할 수 있습니다.
그 중 일부가 말이되지 않는다면 두려워하지 마십시오! 계속 읽으면 아래의 모든 세부 사항을 다룹니다.
참고 : Spokestack Tray는 JCenter에서 호스팅되었지만 중단 발표 이후 Maven Central로 배포를 옮겼습니다. 버전> = 0.4.1에 액세스하기 위해 repositories 블록에 mavenCentral() 포함되어 있는지 루트 레벨 build.gradle 파일에 포함시켜야합니다.
JCENTER가 액세스 할 수 없게 된 후 Core Spokestack 라이브러리의 종속성을 올바르게 해결하기 위해 0.4.2 이상을 사용하여 버전을 사용하십시오.
기본적으로 Spokestack Tray는 사용자와의 음성 상호 작용을위한 ASR, NLU 및 TTS를 처리합니다. 이는 음성을 텍스트로 변환하고 해당 텍스트를 처리하여 동작을 생성하여 앱의 응답을 합성하여 사용자에게 다시 읽을 수 있습니다. 이러한 기능에 대한 자세한 내용은 Spokestack Docs를 참조하십시오.
NLU 및 TTS를 사용하려면 무료 Spokestack 계정이 필요합니다. 계정 페이지에서 NLU 모델을 만들고 다운로드 할 수 있습니다. 클라이언트 ID 및 비밀 키는 TTS 요청에 대해 런타임에 필요합니다.
먼저, 앱의 build.gradle 에 종속성을 추가하십시오 (최신 버전의 JCenter 배지를 확인하십시오) :
implementation ' io.spokestack:tray:0.4.1 ' 위에서 언급했듯이 Spokestack 트레이는 기존 Activity 위에 렌더링하고 음성 상호 작용을 처리하는 Fragment 으로 구현되므로 활동의 레이아웃에 추가해야합니다.
<!-- nested in the main layout, after other views/sublayouts -->
< include
android : id = " @+id/tray_fragment "
layout = " @layout/spokestack_tray_fragment "
/> 참고 : 앱 레이아웃에 따라 트레이가 열리면 마이크 탭이 사라지는 것을 피하기 위해 Fragment의 부모 레이아웃에 android:clipChildren="false" 추가해야 할 수도 있습니다.
그런 다음 활동 자체가 TrayActivity ( AppCompatActivity 의 서브 클래스)를 확장하고 필요한 방법을 구현하면 라이브러리가 나머지를 처리합니다.
설정을 직접 수행하려면 TrayActivity 사용하지 않는 샘플이 있습니다.
import io.spokestack.tray.*
class MyActivity : AppCompatActivity (), SpokestackTrayListener {
lateinit var tray : SpokestackTray
// ...
override fun onCreate ( savedInstanceState : Bundle ? ) {
val config = TrayConfig . Builder ()
// credentials from your Spokestack account
.credentials( " spokestack-client-id " , " spokestack-secret-key " )
.wakewordModelURL( " https://path-to-wakeword-models " )
.nluURL( " https://path-to-nlu-files " )
// note the implementation of `SpokestackTrayListener` in the class declaration
.withListener( this )
// optional builder customization; see the documentation for more details...
.build()
supportFragmentManager.fragmentFactory = SpokestackTrayFactory (config)
// note that the factory is instantiated and set on the manager BEFORE calling
// `super.onCreate()`
super .onCreate(savedInstanceState)
}
override fun onStart () {
// set the value of the lateinit `tray` var
tray = SpokestackTray .getInstance(config)
super .onStart()
} Spokestack Wakeword 또는 NLU 모델을 다운로드하면 다른 파일에 여러 URL이 있습니다. 위의 wakewordModelURL 및 nluURL 전체 파일 URL이 아닌 관련 디렉토리의 경로 만 필요합니다. 따라서 데모 "Spokestack"wakeword의 경우 wakewordModelURL "https://d3dmqd7cy685il.cloudfront.net/model/wake/spokestack/"으로 설정하십시오.
이 트레이는 앱이 활동을 전환하는 동안 사용자가 음성 명령을 계속 제공 할 수 있도록 활동 전체에서 원활하게 사용하도록 설계되었으므로 상태는 조각 자체 외부에 저장되어 파편 파괴에서 살아남습니다. 앱이 트레이와 기본 Spokestack 인스턴스에서 보유한 리소스를 해제 해야하는 경우 Tray 's stop() 메소드를 호출하십시오. 그런 다음 현재 트레이 조각 인스턴스가 파괴되기 전에 음성 제어를 다시 활성화 해야하는 경우 start() 호출해야합니다.
프로세스 사망 후 트레이 상태를 그대로 유지하려면 트레이의 getState() 및 loadState() 메소드를 사용하여 부모 활동의 onSaveInstanceState 및 onRestoreInstanceState 메소드에 저장할 수 있습니다. 자세한 내용은 문서를 참조하십시오.
사용자가 앱과 대화 할 수있게되면 앱이 다시 대화 할 수 있습니다. 트레이는 Spokestack의 TTS 서비스와 통합되므로 오디오 합성은 전사하는 것만 큼 쉽습니다.
TrayActivity 확장하면 구현해야 할 메소드 중 하나는 getTrayListener() 이며 SpokestackTrayListener 생성하고 반환합니다. 이 인터페이스는 앱이 트레이에서 수신하고 생성 된 이벤트에 반응하는 데 도움이됩니다. 각 유스 케이스는 고유하기 때문에 모든 방법은 선택 사항입니다. 우리가 여기에 관심이있는 것은 onClassification 입니다. 이 방법은 사용자의 연설이 ASR에 의해 전사되고 NLU에 의해 분류 된 후에 호출됩니다. 그것은 당신의 앱을 NLU 결과를 제공하고 응답을 반환하도록 요청합니다.
override fun onClassification ( result : NLUResult ): VoicePrompt {
return if (result.intent == " your-special-intent " ) {
VoicePrompt ( " I hear you loud and clear " )
} else {
VoicePrompt (
" Sorry; I didn't catch that " ,
expectFollowup = true )
}
} VoicePrompt 생성자의 선택적 두 번째 매개 변수를 사용하면 응답을 기대하는지 트레이를 알 수 있습니다. 그렇다면 프롬프트가 재생 된 후 활성 청취를 재개하여 사용자가 각 상호 작용에 대해 WakeWord 또는 버튼을 사용할 필요가 없습니다.
위의 샘플은 최소한의 소란으로 당신을 실행할 수 있지만, 스포크 스택 트레이가 제공하는 모든 것과는 거리가 멀다. TrayConfig 인스턴스를 구축 할 때는 기본 Spokestack 빌더 자체를 구성하고 제공하도록 선택할 수 있습니다. 이를 통해 변경 사항 변경 ASR 제공 업체와 같은 작업을 수행하고 개별 시스템의 이벤트에 맞는 사용자 정의 리스너를 설정하고 필요한 경우 사용자 정의 음성 처리 구성 요소를 추가 할 수 있습니다. Spokestack Builder에 대해 여기에서 읽을 수 있습니다.
트레이 자체에 적용 할 수있는 다양한 옵션이 있으며 TrayConfig.Builder 인스턴스의 도우미 방법을 통해 액세스 할 수 있습니다. 여기에 각각을 설명하면이 readme가 ... 자세한 내용을 확인하십시오. 자세한 내용은 문서를 확인하십시오. TrayConfig.Builder 에 대한 문서는 [여기] (https://spokestack.github.io/spokestack-tray/spokestack-tray/spokestack-tray/io.spokestack.tray/-tray-config/-builder**입니다.
트레이 UI의 대부분의 측면은 사용자 정의 할 수 있습니다. 종종 이것은 라이브러리에 설정된 값을 재정의하여 XML에서 달성됩니다.
이에 대한 예외는 트레이 오리엔테이션입니다. 마이크 버튼 기본값은 화면의 lefthand 측면에서 오른쪽 탭으로 표시되며 결과적으로 트레이가 왼쪽에서 미끄러 져 들어갑니다. 또한 8 분의 오리엔테이션을 지원하지만 두 가지 변경이 필요합니다.
TrayConfig 빌더에서 .orientation(TrayConfig.Orientation.RIGHT) 호출하십시오.< include
layout = " @layout/spokestack_tray_fragment "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
app : layout_constraintBottom_toBottomOf = " parent "
app : layout_constraintEnd_toEndOf = " parent " /> 우리는 여기서 마지막 제약 만 있으면됩니다 . 나머지 속성은 소스 레이아웃과 동일합니다. 그러나 우리는 include 하고 있기 때문에 하나의 속성을 재정의한다는 것은 그들 모두를 무시하는 것을 의미합니다. 여기서 단락 끝에있는 메모를 참조하십시오.
값 기반 UI 사용자 정의는 다음과 같습니다. 여기의 파일 이름은 라이브러리의 res/values 폴더의 원래 정의를 가리키지 만 프로젝트의 다른 곳에서는 교체품을 정의 할 수 있습니다. 예제 앱은 res/values/custom_colors.xml 의 시스템 메시지의 텍스트 색상을 재정의하여이를 보여줍니다.
colors.xmlspsk_colorTrayBg : 트레이의 메시지 스트림에 사용되는 배경색.spsk_colorIcon : spsk_colorBrand 와 대비 해야하는 아이콘에 사용되는 전경 색상. 기본값으로 흰색으로.spsk_colorDragHandle : 트레이 크기 조정 드래그 핸들에 사용되는 색상.spsk_colorBrand : 마이크 버튼과 같은 UI 요소의 기본 색상 및 배경이없는 아이콘.spsk_colorListenText : "듣기"버블에서 텍스트에 사용되는 색상.spsk_colorSystemText : 시스템 메시지 버블에서 텍스트에 사용되는 색상.spsk_colorUserText : 사용자 메시지 버블에서 텍스트에 사용되는 색상.spsk_colorSystemBg : 시스템 메시지 버블에 사용되는 배경색.spsk_colorUserBg : 사용자 메시지 버블에 사용되는 배경색.spsk_colorGradientOne : 듣기 그라디언트 애니메이션에 사용되는 시작 색상. spsk_colorBrand 의 기본값.spsk_colorGradientEnd : 청취 그라디언트 애니메이션에 사용되는 엔드 컬러.spsk_colorTransparent : 트레이의 "뒤로"화살표의 배경 색조로 사용되는 투명 색상.dimens.xmlspsk_micTabWidth : 마이크 탭 버튼의 폭 기본값은 60dp 까지.spsk_micTabHeight : 마이크 탭 버튼의 높이. 기본값은 80dp 로, spsk_micTabWidth 와 함께 4 : 3 비율로 유지해야합니다.spsk_listenBubbleWidth : ASR 중에 나타나는 듣기 버블의 너비. 기본값은 120dp 로, spsk_listenBubbleHeight 사용하여 2 : 1 비율로 유지해야합니다.spsk_listenBubbleHeight : ASR 중에 나타나는 듣기 버블의 높이. 기본값은 60dp 까지.spsk_messageStreamHeight : 트레이 내부의 메시지 스트림의 시작 높이. 기본값은 100dp 로spsk_messageStreamMinHeight : 트레이를 드래그에 의해 크기를 조정할 수있는 최소 높이. 기본값은 80dp 입니다.ints.xmlspsk_trayAnimateMs : 시간의 양 (밀리 초) 트레이는 열거 나 닫는 데 걸립니다. 기본값은 500 입니다.strings.xmlspsk_listening : ASR (Active Listenge) 동안 트레이에 표시된 텍스트. "LISTENING" 의 기본값.styles.xmlspsk_messageFont : 글꼴 패밀리는 트레이에 ASR 전 사체 및 시스템 메시지를 표시하는 데 사용됩니다. 기본값은 sans-serif (Roboto)로. Copyright 2020 Spokestack, Inc.
Apache 라이센스, 버전 2.0 ( "라이센스")에 따라 라이센스가 부여되었습니다. 라이센스를 준수하는 것 외에는이 파일을 사용할 수 없습니다. 라이센스 사본을 얻을 수 있습니다
http://www.apache.org/licenses/LICENSE-2.0
해당 법률에 의해 요구되거나 서면에 동의하지 않는 한, 라이센스에 따라 배포 된 소프트웨어는 명시 적 또는 묵시적 보증 또는 조건없이 "그대로"기준으로 배포됩니다. 라이센스에 따른 특정 언어 통치 권한 및 제한 사항에 대한 라이센스를 참조하십시오.