




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年廣安職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試題庫匯編
- 2025年朝陽師范高等專科學(xué)校單招職業(yè)技能測試題庫完美版
- 2025年鄂爾多斯生態(tài)環(huán)境職業(yè)學(xué)院單招職業(yè)傾向性測試題庫完整
- 2025年廣西工業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完美版
- 2025年廣東環(huán)境保護(hù)工程職業(yè)學(xué)院單招職業(yè)技能考試題庫新版
- 雕塑藝術(shù)與民族特色研究-深度研究
- 供應(yīng)鏈人工智能應(yīng)用-深度研究
- 跨媒體敘事在數(shù)字文化創(chuàng)意產(chǎn)品中的應(yīng)用-深度研究
- 質(zhì)量管理數(shù)字化趨勢-深度研究
- 燃料制造業(yè)智能制造-深度研究
- DB5101-T 71-2020 成都市電動汽車充電設(shè)施 安全管理規(guī)范
- 2025年七臺河職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 監(jiān)理人員安全培訓(xùn)考試試卷(答案)
- 2025年北京電子科技職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- xxx項(xiàng)目財(cái)務(wù)評價報(bào)告
- 2024年山東交通職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 團(tuán)隊(duì)賦能培訓(xùn)
- 2025年廣東廣州市黃埔區(qū)第二次招聘社區(qū)專職工作人員高頻重點(diǎn)提升(共500題)附帶答案詳解
- 第一單元第2課《人工智能應(yīng)用》說課稿 2023-2024學(xué)年浙教版(2023)初中信息技術(shù)八年級下冊
- 2025年寫人要抓住特點(diǎn)
- 萬兆小區(qū)方案及實(shí)施路徑
評論
0/150
提交評論