程蔚,周蘭江,王紅斌,黃銀閣
?
基于Android的旅行翻譯語音情景助手APP設(shè)計(jì)與實(shí)現(xiàn)
程蔚,周蘭江,王紅斌,黃銀閣
翻譯APP在出國旅行人群中有很大的需求。傳統(tǒng)翻譯APP輸入方式單一只有文本輸入,存在一定的不便利性,且缺乏特定情景下的翻譯參考例句,缺少一些實(shí)用性。基于Android系統(tǒng)結(jié)合SpeechKit.framework,Android-async-http以及JSONObject,設(shè)計(jì)實(shí)現(xiàn)一款旅行翻譯語音情景助手APP,除文本輸入功能外,還具備語音輸入功能和情景例句功能,用以解決傳統(tǒng)翻譯APP存在的問題,帶來良好的便利性和實(shí)用性。測試表明APP可以流暢運(yùn)行,具備良好的便利性和實(shí)用性。
語音識(shí)別;Android;翻譯;情景例句
越來越多的國民開始選擇出國游,對(duì)外交流日益加強(qiáng),傳統(tǒng)翻譯APP[1][2][3]只提供文本輸入方式,當(dāng)用戶不便進(jìn)行文字輸入時(shí),單一的輸入方式就顯得不夠便利;當(dāng)用戶在國外用餐、問路等特定情景下不知道如何表達(dá)時(shí),傳統(tǒng)翻譯APP沒有為用戶提供一些翻譯參考。近年來語音識(shí)別技術(shù)發(fā)展迅速[4][5],將語音作為一種輸入方式無疑更加便利,同時(shí)為用戶提供特定情景下的翻譯例句作為參考會(huì)使用戶的對(duì)外交流更加順暢容易。
Android平臺(tái)具有開源、免費(fèi)等特點(diǎn),應(yīng)用層采用JAVA語言開發(fā),使用廣泛[6]。本APP將結(jié)合Android系統(tǒng),SpeechKit.framework,Android-async-http以及JSONObject設(shè)計(jì)實(shí)現(xiàn)一款旅行翻譯語音情景助手App,著重解決單一輸入方式和缺少情景翻譯參考例句的問題。
借助Android平臺(tái)通過SpeechKit.framework實(shí)現(xiàn)語音識(shí)別,完成語音轉(zhuǎn)換文字,進(jìn)而實(shí)現(xiàn)語音輸入功能,這種輸入方式可以帶來更好的便利性;利用JSONObject解析JSON數(shù)據(jù)獲取情景例句,實(shí)現(xiàn)情景例句功能,為用戶提供翻譯參考,更具實(shí)用性;利用Android-async-http開源項(xiàng)目構(gòu)建網(wǎng)絡(luò)通信組件與服務(wù)器通信獲取翻譯結(jié)果,使APP具備良好的通信性能。
1.1 客戶端功能設(shè)計(jì)
(1)目標(biāo)語言切換功能。該功能主要是選擇切換不同目標(biāo)語言,設(shè)置中文為源語言??梢詽M足不同語言國家下的交流需求。由于目前出國游主要集中在日本、韓國、泰國以及英語國家[7],所以本APP設(shè)置4種目標(biāo)語言分別是日語、韓語、泰語及英語。
(2)語音輸入功能。該功能是錄入用戶的語音信息,SpeechKit.framework語音識(shí)別技術(shù)準(zhǔn)確迅速,所以利用SpeechKit.framework實(shí)現(xiàn)語音識(shí)別功能,將錄音轉(zhuǎn)換為文字,將其翻譯成目標(biāo)語言。
(3)文本輸入功能。提供文字輸入功能,將輸入文本翻譯成目標(biāo)語言。
(4)情景例句功能。提供給用戶一系列情景下的常用語翻譯,比如問候、交通、購物、銀行、餐飲等。因?yàn)镴SON的數(shù)據(jù)格式是純文本的,具有良好的跨平臺(tái)性,易于解析和生成[8][9],所以情景例句以JSON文件形式存放,利用JSONObject類解析得到情景例句并展示,為用戶提供相關(guān)情景翻譯參考。整個(gè)APP的功能模塊圖如圖1所示:

圖1 Android客戶端功能模塊圖
1.2 網(wǎng)絡(luò)通信設(shè)計(jì)
Android-async-http是一個(gè)開源庫,它采用異步請(qǐng)求方式,所有請(qǐng)求都在主線程之外,可以避免主線程阻塞問題,使用該庫可以獲得良好的通信體驗(yàn)。
Android手機(jī)客戶端系統(tǒng)和服務(wù)器端翻譯系統(tǒng)構(gòu)成了旅行翻譯助手的整體架構(gòu)。用戶在翻譯界面上輸入待翻譯的信息,這些信息被封裝成數(shù)據(jù),借助Android-async-http進(jìn)行網(wǎng)絡(luò)通信[10]將數(shù)據(jù)發(fā)送到服務(wù)器端。翻譯系統(tǒng)解析發(fā)送的數(shù)據(jù)并翻譯出結(jié)果,將翻譯結(jié)果返回給客戶端。整個(gè)被翻譯信息的傳輸過程圖如圖2所示:

圖2 翻譯信息傳輸過程圖
1.3 流程設(shè)計(jì)
APP使用流程是先判斷是否含有網(wǎng)絡(luò),在有網(wǎng)絡(luò)的情況下開啟翻譯服務(wù),啟動(dòng)候選目標(biāo)語言信息,然后輸入文本或者語音內(nèi)容,再通過網(wǎng)絡(luò)發(fā)送給服務(wù)器獲得翻譯結(jié)果,旅行翻譯語音情景助手業(yè)務(wù)流程圖如圖3所示:

圖3 旅行翻譯語音情景助手業(yè)務(wù)流程圖
開發(fā)中需要以下環(huán)境:首先是操作系統(tǒng),本文選擇Windows 7操作系統(tǒng);其次安裝JDK7.0版本和安裝帶有Android模擬器插件(ADT22)的Eclipse,使用的SDK版本是API 16,語音識(shí)別采用SpeechKit.framework,網(wǎng)絡(luò)通信采用Android-async-http開源項(xiàng)目;最后的測試環(huán)境則是LG F160S真機(jī),運(yùn)行Android4.1.2版本系統(tǒng)。
:2.1 目標(biāo)語言切換模塊的設(shè)計(jì)與實(shí)現(xiàn)
在導(dǎo)航欄設(shè)置一個(gè)下拉菜單,點(diǎn)擊下拉菜單可以選擇目標(biāo)語言,實(shí)現(xiàn)目標(biāo)語言切換。調(diào)用函數(shù)調(diào)用函數(shù)getSupportActionBar()setListNavigationCallback(SpinnerA-dapter adapter,OnNavigationListener callback)就可以實(shí)現(xiàn)點(diǎn)擊導(dǎo)航欄彈出下拉菜單。
2.2 翻譯模塊的設(shè)計(jì)與實(shí)現(xiàn)
翻譯模塊的輸入方法設(shè)置兩種,語音輸入和文本輸入。
2.2.1 語音輸入翻譯模塊的設(shè)計(jì)與實(shí)現(xiàn)
當(dāng)用戶按住語音輸入按鈕時(shí),對(duì)著麥克風(fēng)說話會(huì)調(diào)用SpeechKit.framework的onRecordingBegin(Recognizer recognizer)方法進(jìn)行錄音,錄音結(jié)束后調(diào)用onRecordingDone
(Recognizer recognizer)方法就得到了完整錄音內(nèi)容,接下來調(diào)用onResults(Recognizer recognizer, Recognition results)方法將錄音內(nèi)容轉(zhuǎn)換成文字得到文本對(duì)象contentin,經(jīng)過上述幾個(gè)步驟就完成了語音識(shí)別。
當(dāng)語音輸入完畢后用戶點(diǎn)擊翻譯,就會(huì)調(diào)用getSampleAndTranslation(String contentin)方法向服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求獲取翻譯結(jié)果,方法內(nèi)部實(shí)現(xiàn):先創(chuàng)建AsyncHttpClient實(shí)例,將contentin與2.1設(shè)置的目標(biāo)語言進(jìn)行封裝,調(diào)用post方法發(fā)到服務(wù)器端,接收服務(wù)器端返回的翻譯結(jié)果,解析并顯示給用戶,這樣就完成了翻譯查詢請(qǐng)求功能。
實(shí)現(xiàn)語音識(shí)別功能關(guān)鍵代碼是:
//創(chuàng)建監(jiān)聽器:監(jiān)聽錄音過程
private Recognizer.Listener createListener() {
return new Recognizer.Listener() {
@Override
public void onRecordingBegin(Recognizer recognizer) {
listeningDialog.setText("Recording...");
listeningDialog.setStoppable(true);
listeningDialog.setRecording(true);
// Create a repeating task to update the audio level
Runnable r = new Runnable() {
@Override
public void run() {
if (listeningDialog != null
&& listeningDialog.isRecording()
&& currentRecognizer != null) {
listeningDialog.setLevel(Float.toString(currentRecognizer .getAudioLevel()));
handler.postDelayed(this, 500);
}
}
};
r.run();
}
@Override
public void onRecordingDone(Recognizer recognizer) {
listeningDialog.setText("Processing...");
listeningDialog.setLevel("");
listeningDialog.setRecording(false);
listeningDialog.setStoppable(false);
}
@Override
public void onError(Recognizer recognizer, SpeechError error) {
if (recognizer != currentRecognizer)
return;
if (listeningDialog.isShowing())
dismissDialog(LISTENING_DIALOG);
currentRecognizer = null;
listeningDialog.setRecording(false);
// Display the error + suggestion in the edit box
String detail = error.getErrorDetail();
String suggestion = error.getSuggestion();
if (suggestion == null)
suggestion = "";
if (m_vp.getCurrentItem() == 0)
mfragment1.getListUpdata(2, detail + " " + suggestion);
// for debugging purpose: printing out the speechkit session id
android.util.Log.d("Nuance SampleVoiceApp",
"Recognizer.Listener.onError: session id ["+ speechKit.getSessionId() + "]");
}
@Override
public void onResults(Recognizer recognizer, Recognition results) {
if (listeningDialog.isShowing())
dismissDialog(LISTENING_DIALOG);
currentRecognizer = null;
listeningDialog.setRecording(false);
int count = results.getResultCount();
//識(shí)別音頻的結(jié)果
Recognition.Result[] rs = new Recognition.Result[count];
for (int i = 0; i < count; i++) {
rs[i] = results.getResult(i);
}
EditText t = (EditText) findViewById(R.id.text_sentence);
if (t != null)
//將結(jié)果放到文本框中
t.setText(rs[0].getText());
mfragment1.getListUpdata(1, rs[0].getText());
m_vp.setCurrentItem(0);
// for debugging purpose: printing out the speechkit session id
android.util.Log.d("Nuance SampleVoiceApp",
"Recognizer.Listener.onResults: session id ["+ speechKit.getSessionId() + "]");
}
};
}
2.2.2 文本輸入翻譯模塊的設(shè)計(jì)與實(shí)現(xiàn)
用戶輸入待翻譯文本,點(diǎn)擊翻譯將待翻譯文本與2.1設(shè)置的目標(biāo)語言一起封裝發(fā)送到服務(wù)器端,接收服務(wù)器端返回的翻譯結(jié)果解析并顯示給用戶。
文本翻譯查詢請(qǐng)求功能部分的代碼其實(shí)跟語音翻譯查詢請(qǐng)求功能部分的代碼一樣,都是通過調(diào)用2.2.1中所列出的getSampleAndTranslation(String contentin)方法,將輸入文本contentin傳入進(jìn)來,得到翻譯后的結(jié)果顯示到界面中。
2.3 情景例句模塊的設(shè)計(jì)與實(shí)現(xiàn)
情景例句模塊設(shè)計(jì)了多個(gè)大類情景,每個(gè)大類又包含多個(gè)小類情景,以滿足盡可能多的情景需求同時(shí)提供語音朗讀例句功能。
情景例句以JSON文件形式放在工程res/raw文件夾里與代碼一同打包成apk,每種目標(biāo)語對(duì)應(yīng)一個(gè)JSON文件,存放該目標(biāo)語言下的所有情景例句。當(dāng)用戶選擇不同目標(biāo)語言點(diǎn)擊某個(gè)情景類別時(shí)程序就會(huì)從raw文件夾中讀取相應(yīng)目標(biāo)語言的JSON文件并通過JSON解析得到例句再顯示給用戶。例如:用戶選擇了中英翻譯,點(diǎn)擊某個(gè)大類情景,應(yīng)用就會(huì)調(diào)用openRawResource(R.raw.enzh)方法讀取英文JSON文件獲得所有的中英情景例句,根據(jù)用戶點(diǎn)擊的大類名稱調(diào)用getXiaoleiNames(String daleiname)方法獲取大類對(duì)應(yīng)下的所有小類名稱。用戶再選擇其中一個(gè)小類會(huì)調(diào)用getLijus(String xiaoleiname, String daleiname)方法可以獲得選中的大類與小類下的所有例句。其中解析JSON數(shù)據(jù)用到的是JSONObeject類來解析。
實(shí)現(xiàn)情景例句展示功能關(guān)鍵代碼:
public String readTextFile() {
String res = "";
try {
InputStream in = null;
switch (language) {
case 0:
in = con.openRawResource(R.raw.enzh);
break;
case 1:
in = con.openRawResource(R.raw.jpzh);
break;
case 2:
in = con.openRawResource(R.raw.krzh);
break;
case 3:
in = con.openRawResource(R.raw.thzh);
break;
}
int length = in.available();
byte[] buffer = new byte[length];
in.read(buffer);
in.close();
res = EncodingUtils.getString(buffer, "UTF-8");
catch (Exception e) {
e.printStackTrace();
}
return res;
}
public ArrayList
ArrayList
String jsonfile = readTextFile();
String whole = getValuebyKey(jsonfile, "scene");
JSONObject dalei = null;
try {
dalei = new JSONObject(whole);
} catch (JSONException e) {
e.printStackTrace();
}
Iterator daleiKeys = dalei.keys();
while (daleiKeys.hasNext()) {
String daleikey = daleiKeys.next().toString();
try {
if (daleiname.equals(dalei.getJSONObject(daleikey).getString("name"))) {
JSONObject xiaolei = dalei.getJSONObject(daleikey).getJSONObject("scene");
Iterator xiaoleiKeys = xiaolei.keys();
while (xiaoleiKeys.hasNext()) {
String xiaoleikey = xiaoleiKeys.next().toString();
xiaoleinames.add(xiaolei.getJSONObject(xiaoleikey).getString("name"));
}
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return xiaoleinames;
}
public ArrayList
ArrayList
String jsonfile = readTextFile();
String whole = getValuebyKey(jsonfile, "scene");
JSONObject dalei = null;
try {
dalei = new JSONObject(whole);
} catch (JSONException e) {
e.printStackTrace();
}
Iterator daleiKeys = dalei.keys();
while (daleiKeys.hasNext()) {
String daleikey = daleiKeys.next().toString();
try {
if (daleiname.equals(dalei.getJSONObject(daleikey).getString("name"))) {JSONObject xiaolei = dalei.getJSONObject(daleikey).getJSONObject("scene");
Iterator xiaoleiKeys = xiaolei.keys();
while (xiaoleiKeys.hasNext()) {
String xiaoleikey = xiaoleiKeys.next().toString();
if (xiaoleiname.equals(xiaolei.getJSONObject(xiaoleikey).getString("name"))) {
JSONObject lijus = xiaolei.getJSONObject(xiaoleikey).getJSONObject("statement");
Iterator lijuKeys = lijus.keys();
while (lijuKeys.hasNext()) {
String lijukey = lijuKeys.next().toString();
JSONObject liju = lijus.getJSONObject(lijukey);
String zh = liju.getString("subject");
String en = liju.getString("text");
SampleSentenceEntityInSentencesView sse = new SampleSentenceEntityInSentencesView();
sse.setSource(zh);
sse.setTarget(en);
Lijus.add(sse);
}
break;
}
}
break;
}} catch (JSONException e) {
e.printStackTrace();
}
}
return Lijus;
}
通過實(shí)際使用測試,APP運(yùn)行流暢穩(wěn)定,翻譯結(jié)果反饋及時(shí),一般在2-4秒就會(huì)得到結(jié)果,使用語音輸入獲得翻譯,在輸入方式上很方便,而且識(shí)別準(zhǔn)確率高。中英語音輸入翻譯結(jié)果,中英情景例句展示如圖4所示:

圖4 中英語音輸入翻譯結(jié)果
本軟件是基于Android系統(tǒng)開發(fā),結(jié)合SpeechKit.framework實(shí)現(xiàn)語音識(shí)別,Android-async-http實(shí)現(xiàn)網(wǎng)絡(luò)通信和JSONObject實(shí)現(xiàn)JSON解析,設(shè)計(jì)實(shí)現(xiàn)了一款旅行翻譯語音情景APP,經(jīng)過檢測實(shí)驗(yàn)使用流暢,響應(yīng)迅速,具備便利和實(shí)用性。提供了中英、中日、中韓、中泰4種語言翻譯,基本滿足出國人群的旅游翻譯語種需求。除基本的文本輸入功能外還增加了語音輸入功能,提供了更加方便的輸入方式。情景例句功能提供了銀行、問候、交通、購物等情景下的翻譯例句,為用戶提供了相關(guān)翻譯參考,增加了APP的實(shí)用性。同時(shí),考慮到出國游上網(wǎng)費(fèi)用較大,下一步工作將給APP增加離線翻譯功能,即使不聯(lián)網(wǎng)也可以獲得較準(zhǔn)確的翻譯結(jié)果。
[1] 盛玉林.Android平臺(tái)上基于云服務(wù)的隨身翻譯工具的設(shè)計(jì)與實(shí)現(xiàn)[D]:碩士學(xué)位論文.上海:復(fù)旦大學(xué)軟件學(xué)院,2013.
[2] 浩明.基于Android平臺(tái)的手機(jī)翻譯系統(tǒng)[J].西北成人教育學(xué)院學(xué)報(bào),2014,(5):107-109.
[3] 楊眾.基于Android平臺(tái)的新蒙文-漢文在線翻譯[D]:碩士學(xué)位論文.內(nèi)蒙古:內(nèi)蒙古大學(xué)計(jì)算機(jī)學(xué)院,2014.
[4] 何湘智.語音識(shí)別的研究與發(fā)展[J].計(jì)算機(jī)與現(xiàn)代化,2004,(03):3-6.
[5] 李書貞,施玉霞基于語音指令的遠(yuǎn)程控制機(jī)器人[J].微型電腦應(yīng)用,2008,24(11):1-3.
[6] 佘建偉,趙凱譯,Reto Meier.Android 4 高級(jí)編程[M]:第3版.北京,清華大學(xué)出版社,2013,1-3.
[7] 王曉禹,石麗.基于JSON 實(shí)現(xiàn) Android 智能終端與 Web 服務(wù)器“面向?qū)ο蟆钡男畔⒔粨Q[J]. 數(shù)字技術(shù)與應(yīng)用,2012,(4):224-225.
[8] 胡曉鋒.JSON與XML在網(wǎng)絡(luò)數(shù)據(jù)傳輸中的應(yīng)用分析[J].電腦編程技巧與維護(hù),2010,10:77-78.
[9] 劉平. Android手機(jī)訪問服務(wù)器的一種數(shù)據(jù)交互方法[J].電子設(shè)計(jì)工程,2010,18(9):96-98.
[10] 馬昭征.基于HTTP的安卓與服務(wù)器交互方法的實(shí)現(xiàn)[J].無線互聯(lián)科技,2015,03(3):92-96.
黃銀閣(1989-),昆明理工大學(xué),信息工程與自動(dòng)化學(xué)院,女,碩士研究生,研究方向:自然語言處理與移動(dòng)嵌入式系統(tǒng)研究,昆明,650500
Design and Implementation of Travel Translator APP with Speech Scene Based on Android
Cheng Wei, Zhou Lanjiang, Wang Hongbin, Huang Yinge
(School of Information Engineering and Automation, Kunming University of Science and Technology, Kunming 650500, China)
There is a great need for the translation APP among the crowd travelling abroad. The input method of traditional translation APP is single, only for text input, which is inconvenient, and lack of reference example sentence in specific situateion and practicality. Combined SpeechKit.framework,Android-async-http and JSONObject based on Android system, it designs and implements a travel translator APP with speech scene. In addition to the text input function, it also has the function of voice input and situation sentence to solve the problems of traditional translation APP and brings good convenience and practicality. The test shows that APP can run smoothly with good convenience and practiceality.
Speech Recognition; Android; Translation; Situation Sentence
1007-757X(2016)04-0030-04
TP391
A
(2015.11.25)
云南省教育廳科學(xué)研究基金重點(diǎn)項(xiàng)目(2014Z021)
程 蔚(1989-),男,昆明理工大學(xué),信息工程與自動(dòng)化學(xué)院,副教授,碩士研究生,研究方向:自然語言處理與移動(dòng)嵌入式系統(tǒng)研究,昆明,650500
周蘭江(1989-),男,昆明理工大學(xué),信息工程與自動(dòng)化學(xué)院,副教授,碩士生導(dǎo)師,ccf會(huì)員,研究方向:自然語言處理與移動(dòng)嵌入式系統(tǒng)研究,昆明,650500
王紅斌(1983-),男,昆明理工大學(xué),信息工程與自動(dòng)化學(xué)院,講師,博士,研究方向:智能信息系統(tǒng),分布/并行計(jì)算機(jī)系統(tǒng),昆明,650500