【移動應(yīng)用開發(fā)技術(shù)】用Kotlin開發(fā)android平臺語音識別語義理解應(yīng)用_第1頁
【移動應(yīng)用開發(fā)技術(shù)】用Kotlin開發(fā)android平臺語音識別語義理解應(yīng)用_第2頁
【移動應(yīng)用開發(fā)技術(shù)】用Kotlin開發(fā)android平臺語音識別語義理解應(yīng)用_第3頁
【移動應(yīng)用開發(fā)技術(shù)】用Kotlin開發(fā)android平臺語音識別語義理解應(yīng)用_第4頁
【移動應(yīng)用開發(fā)技術(shù)】用Kotlin開發(fā)android平臺語音識別語義理解應(yīng)用_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】用Kotlin開發(fā)android平臺語音識別語義理解應(yīng)用

用Kotlin開發(fā)android平臺語音識別,語義理解應(yīng)用(olamisdk)轉(zhuǎn)載請注明CSDN博文地址:/ls0609/article/details/75084994本文使用Kotlin開發(fā)Android平臺的一個語音識別方面的應(yīng)用,用的是歐拉密開放平臺olamisdk。1.Kotlin簡介Kotlin是由JetBrains創(chuàng)建的基于JVM的編程語言,IntelliJ正是JetBrains的杰作,而android

Studio是基于IntelliJ修改而來的。Kotlin是一門包含很多函數(shù)式編程思想的面向?qū)ο缶幊陶Z言。后來了解到Kotlin原來是以一個島的名字命名的(Котлин),它是一門靜態(tài)類型編程語言,支持JVM平臺,android平臺,瀏覽器js運(yùn)行環(huán)境,本地機(jī)器碼等。支持與Java,Android

100%

完全互操作。Kotlin生來就是為了彌補(bǔ)Java缺失的現(xiàn)代語言的特性,并極大的簡化了代碼,使得開發(fā)者可以編寫盡量少的樣板代碼。

2.Kotlin,java,Swift簡單比較1.輸出Hello,World!

JAVA:

System.out.println("Hello,World!");

Kotlin:

println("Hello,World!")

Swift:

print("Hello,World!")2.變量和常量

Java:

int

mVariable

=10;

mVariable=20;

static

final

int

mConstant

=

10;

Kotlin:var

mVariable

=

10

mVariable=

20

val

mConstant=

10

Swift:var

mVariable

=

10

mVariable=

20

let

mConstant

=

10

感覺Swift和Kotlin比Java簡潔,Kotlin和swift很像。

3.強(qiáng)制類型轉(zhuǎn)換

Swift:

let

label=

"Helloworld

"

let

width=

80

let

widthLabel=label+

String(width)

Kotlin:

val

label=

"Helloworld

"

val

width=

80

val

widthLabel=label+

width

4數(shù)組

Swift

var

tempList=

["one",

"two","three"]

tempList[1]=

"zero"

Kotlin

val

tempList=

arrayOf("one",

"two","three")

tempList[1]=

"zero"

5.函數(shù)

Swift

:funcgreet(_

name:

String,_day:

String)

->

String

{

return"Hello\(name),todayis

\(day)."

}

greet("Bob",

"Tuesday")

Kotlin

fun

greet(name:

String,day:

String):

String

{

return"Hello$name,todayis

$day."}

greet("Bob",

"Tuesday")

6.類聲明及用法

Swift:

聲明:classShape

{

var

numberOfSides=

0

funcsimpleDescription()

->String

{

return"Ashapewith

\(numberOfSides)sides."

}

}

用法:varshape=

Shape()

shape.numberOfSides=

7

var

shapeDescription=shape.simpleDescription()

Kotlin

聲明:classShape

{

var

numberOfSides=

0

fun

simpleDescription()=

"Ashapewith

$numberOfSidessides."

}

用法:varshape=

Shape()

shape.numberOfSides=

7

var

shapeDescription=shape.simpleDescription()

可見,Kotlin和Swift好像,現(xiàn)代語言的特征,比java這樣的高級語言更加簡化,更貼近自然語言。

3.開發(fā)環(huán)境本文使用的是android

studio2.0版本,啟動androd

studio。

如下圖在configure下拉菜單中選擇plugins,在搜索框中搜索Kotlin,找到結(jié)果列表中的”Kotlin”插件。

如下圖,找了一張還沒有安裝kotlin插件的圖

點(diǎn)擊右側(cè)intall,安裝后重啟studio.

4.新建android項(xiàng)目你可以像以前使用android

stuio一樣新建一個andoid項(xiàng)目,建立一個activity。本文用已經(jīng)完成的一個demo來做示范。如下圖是一個stuio的demo工程

選擇MainActivity和MessageConst兩個java文件,然后選擇導(dǎo)航欄上的code,在下拉菜單中選擇convert

Java

file

tokotlinfile

系統(tǒng)會自動進(jìn)行轉(zhuǎn)化,轉(zhuǎn)化完后會生成對應(yīng)的MainActivity.kt

MessageConst.kt文件,打開MainActivity.kt,編譯器上方會提示”Kotlin

notconfigured”,點(diǎn)擊一下Configure按鈕,IDE就會自動幫我們配置好了!將兩個kt文件復(fù)制到src/kotlin目錄下,如下圖

轉(zhuǎn)化后的文件,也許有些語法錯誤,需要按照kotlin的語法修改。環(huán)境配置好后,來看下gradle更新有哪些區(qū)別project的gradle代碼如下:

buildscript

{

ext.kotlin_version

=

'1.1.3-2'

repositories

{

jcenter()

}

dependencies

{

classpath

'com.android.tools.build:gradle:2.0.0'

//此處多了kotlin插件依賴

classpath

"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

}}

allprojects

{

repositories

{

jcenter()

}}

再來看看某個module的gradle代碼:

apply

plugin:

'com.android.application'apply

plugin:

'kotlin-android'//此處多了這條插件聲明

android{

compileSdkVersion

14

buildToolsVersion

"24.0.0"

defaultConfig

{

applicationId

"com.olami"

minSdkVersion

8

targetSdkVersion

14

}

buildTypes

{

release

{

minifyEnabled

false

proguardFilesgetDefaultProguardFile('proguard-android.txt'),

'proguard-rules.txt'

}

}

sourceSets

{

main.java.srcDirs+=

'src/main/kotlin'//生成的***.kt文件需要copy到對應(yīng)的目錄

}}

dependencies

{

compile

'com.android.support:support-v4:18.0.0'

compile

files('libs/voicesdk_android.jar')

compile

"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"http://此處多了kotlin包的依賴}repositories

{

mavenCentral()}

如上所示,如果不是通過轉(zhuǎn)化的方式新建kotlin工程,則需要自己按照上面的gradle中增加的部分配置好。

5.olami語音識別應(yīng)用先貼一張識別后的效果圖:

在MainActivity.kt中

override

funonCreate(savedInstanceState:Bundle?){

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

initHandler()//初始化handler用于處理消息

initView()//初始化view控件,比如點(diǎn)擊開始錄音的button

initViaVoiceRecognizerListener()//初始化語音識別回調(diào),用于返回錄音狀態(tài)和識別結(jié)果

init()//初始化語音識別對象}

funinit(){

initHandler()

//定義olami語音識別對象

mOlamiVoiceRecognizer=OlamiVoiceRecognizer(this@MainActivity)

val

telephonyManager

=

this.getSystemService(

Context.TELEPHONY_SERVICE)

asTelephonyManager

val

imei=

telephonyManager.deviceId

mOlamiVoiceRecognizer!!.init(imei)

//setnullifyoudonot

wanttonotifyolamiserver.

//設(shè)置回調(diào),用于更新錄音狀態(tài)和數(shù)據(jù)等的界面

mOlamiVoiceRecognizer!!.setListener(mOlamiVoiceRecognizerListener)

//設(shè)置支持的語言類型,默認(rèn)請?jiān)O(shè)置簡體中文

mOlamiVoiceRecognizer!!.setLocalization(

OlamiVoiceRecognizer.LANGUAGE_SIMPLIFIED_CHINESE)

mOlamiVoiceRecognizer!!.setAuthorization("51a4bb56ba954655a4fc834bfdc46af1",

"asr",

"68bff251789b426896e70e888f919a6d",

"nli")

//注冊Appkey,在olami官網(wǎng)注冊應(yīng)用后生成的appkey

//注冊api,請直接填寫“asr”,標(biāo)識語音識別類型

//注冊secret,在olami官網(wǎng)注冊應(yīng)用后生成的secret

mOlamiVoiceRecognizer!!.setVADTailTimeout(2000)

//錄音時尾音結(jié)束時間,建議填//2000ms

mOlamiVoiceRecognizer!!.setLatitudeAndLongitude(

31.155364678184498,

121.34882432933009)

//設(shè)置經(jīng)緯度信息,不愿上傳位置信息,可以填0

}

代碼比較簡單,點(diǎn)擊開始錄音button后,啟動錄音,在OlamiVoiceRecognizerListener中回調(diào)處理,然后通過handler發(fā)送消息用于更新界面。來看一下初始化view的代碼,看看跟java方式書寫有哪些不同

privatefun

initView(){

mBtnStart=

findViewById(R.id.btn_start)

asButton

mBtnStop=

findViewById(R.id.btn_stop)as

Button

mBtnCancel=

findViewById(R.id.btn_cancel)

asButton

mBtnSend=

findViewById(R.id.btn_send)as

Button

mInputTextView

=findViewById(R.id.tv_inputText)

asTextView

mEditText=

findViewById(R.id.et_content)

asEditText

mTextView=

findViewById(R.id.tv_result)

asTextView

mTextViewVolume

=findViewById(R.id.tv_volume)

asTextView

mBtnStart!!.setOnClickListener

{

if

(mOlamiVoiceRecognizer!=null)

mOlamiVoiceRecognizer!!.start()

}

mBtnStop!!.setOnClickListener

{

if

(mOlamiVoiceRecognizer!=null)

mOlamiVoiceRecognizer!!.stop()

mBtnStart!!.text

=

"開始"

Log.i("led",

"MusicActivitymBtnStop

onclick

開始")

}

mBtnCancel!!.setOnClickListener

{

if

(mOlamiVoiceRecognizer!=null)

mOlamiVoiceRecognizer!!.cancel()

}

mBtnSend!!.setOnClickListener

{

if

(mOlamiVoiceRecognizer!=null)

mOlamiVoiceRecognizer!!.sendText(mEditText!!.text.toString())

mInputTextView!!.text

=

"輸入:"

+

mEditText!!.text

}

}

是不是感覺代碼更簡練了?

下面兩句賦值,效果相同,第二句可以用id之間進(jìn)行文本賦值,比以前簡練好多。mInputTextView!!.text

=

"輸入:"

+

mEditText!!.texttv_inputText.text

="輸入:"

+

et_content.text

再來看看handler:private

funinitHandler(){

mHandler=

object:Handler(){

override

funhandleMessage(msg:Message){

when

(msg.what){

MessageConst.CLIENT_ACTION_START_RECORED->

mBtnStart!!.text

=

"錄音中"

MessageConst.CLIENT_ACTION_STOP_RECORED

->mBtnStart!!.text

=

"識別中"

MessageConst.CLIENT_ACTION_CANCEL_RECORED->

{

mBtnStart!!.text

=

"開始"

mTextView!!.text

=

"已取消"

}

MessageConst.CLIENT_ACTION_ON_ERROR->

{

mTextView!!.text

=

"錯誤代碼:"

+msg.arg1

mBtnStart!!.text

=

"開始"

}

MessageConst.CLIENT_ACTION_UPDATA_VOLUME->

mTextViewVolume!!.text

=

"音量:"

+msg.arg1

MessageConst.SERVER_ACTION_RETURN_RESULT->

{

if(msg.obj

!=null)

mTextView!!.text

=

"服務(wù)器返回:"

+msg.obj.toString()

mBtnStart!!.text

=

"開始"

try{

valmessage=msg.obj

asString

varinput:String?=null

valjsonObject=JSONObject(message)

valjArrayNli=

jsonObject.optJSONObject("data").optJSONArray("nli")

valjObj=jArrayNli.optJSONObject(0)

varjArraySemantic:JSONArray?=null

if(message.contains("semantic")){

jArraySemantic=jObj.getJSONArray("semantic")

input=

jArraySemantic!!.optJSONObject(0).optString("input")

}else{

input=

jsonObject.optJSONObject("data")

.optJSONObject("asr").optString("result")

}

if(input!=null)

mInputTextView!!.text

="輸入:"

+input

}catch(e:Exception){

e.printStackTrace()

}

}

}

}

}

}

原來的switch

case的方式,變成了when***,代碼不僅簡練,更貼近現(xiàn)代語言,更容易理解。上面的MessageConst.SERVER_ACTION_RETURN_RESULT時,獲取了服務(wù)器返回的結(jié)果,緊接著對這段語義進(jìn)行了簡單的解析

{

"data":

{

"asr":

{

"result":

"我要聽三國演義",

"speech_status":

0,

"final":

true,

"status":

0

},

"nli":

[

{

"desc_obj":{

"result":

"正在努力搜索中,請稍等",

"status":

0

},

"semantic":[

{

"app":

"musiccontrol",

"input":

"我要聽三國演義",

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論