本發(fā)明涉及智能導游技術領域,具體涉及一種用于旅游景區(qū)智能導游系統(tǒng)的語音解說方法。
背景技術:
智能導游系統(tǒng)是指用電子設備代替導游對旅游景點進行介紹的系統(tǒng)。智能導游的其中一個功能是為游客提供景點的語音解說。系統(tǒng)實時地將游客當前位置與系統(tǒng)設定的景點范圍進行匹配,當游客進入系統(tǒng)設定的景點范圍時,智能導游會開始對該景點進行語音介紹。在該功能的實現(xiàn)過程中,關鍵技術為景點數(shù)據(jù)的存儲、景點數(shù)據(jù)的匹配和解決景點解說語音的重復播放問題。
技術實現(xiàn)要素:
針對現(xiàn)有技術存在的問題,本發(fā)明提供一種用于旅游景區(qū)智能導游系統(tǒng)的語音解說方法。
本發(fā)明的技術方案是:
一種用于旅游景區(qū)智能導游系統(tǒng)的語音解說方法,包括以下步驟:
步驟1、獲取景點數(shù)據(jù);
步驟1-1、設置景點所在位置;
步驟1-2、確定景點的解說范圍;
步驟2、景點數(shù)據(jù)匹配;
步驟2-1、在景點的東北和西南方向分別確定兩個點a、b,采集a、b的經緯度信息即景點數(shù)據(jù);a的經度作為A的西側經度wLon;b的經度作為A的東側經度eLon;a的緯度作為A的北側緯度nLat;b的緯度作為A的南側緯度slat;
步驟2-2、定義一個存放景點數(shù)據(jù)的結構體sceneryBuffer,用于將txt文本文件中的數(shù)據(jù)讀到內存中,定義一個類GetStoredData,并且在類的構造函數(shù)中實現(xiàn)對景點數(shù)據(jù)讀取的所有操作,當用該類實例化一個對象時,同時也將所有景點數(shù)據(jù)讀到全局的SceBuf中;
步驟2-3、進行景點數(shù)據(jù)匹配:當前地圖上游客的位置與某個景點匹配成功,說明游客已進入該景點的解說范圍,則進行步驟3;
步驟3、語音解說:調用API函數(shù)PlaySound播放相應景點的解說語音;
步驟4、語音重復播放:當此景點的語音解說結束后,如果游客還在當前景點的語音解說范圍內,會再一次觸發(fā)該景點的語音解說事件,游客就會重復聽到景點解說語音。
所述步驟1-2確定景點的解說范圍的具體方法是:對于景點A,分別采集其東南方向和西北方向的兩個點b和a,其中按a、b的經度與緯度做射線ac、ad;bc、bd,則組成一個矩形acbd,并且acbd包括景點A,則acbd組成的范圍α,即是A的解說范圍;通過調整a、b得到解說范圍α。
有益效果:
導游系統(tǒng)的設計初衷是代替導游為游客提供個性化的導游服務, 應該體現(xiàn)以游客為本, 提供全方位的自然的導游服務。因此,對相應景點的語音解說是智能導游其中一項必要的服務。有了完善的語音解說的支持,相信智能導游會更加吸引游客的注意。本方法通過設置景點所在位置、確定景點的解說范圍完成景點數(shù)據(jù)的獲取,再進行景點數(shù)據(jù)匹配,當前地圖上游客的位置與某個景點匹配成功,說明游客已進入該景點的解說范圍,則進行語音解說;當此景點的語音解說結束后,如果游客還在當前景點的語音解說范圍內,會再一次觸發(fā)該景點的語音解說事件,游客就會重復聽到景點解說語音。本方法全面地實現(xiàn)了旅游景區(qū)智能導游系統(tǒng)的智能語音解說。
附圖說明
圖1是本發(fā)明具體實施方式的景點A示意圖;
圖2是本發(fā)明具體實施方式的景點A、B的解說范圍示意圖;
圖3是本發(fā)明具體實施方式的方案一中公共區(qū)域S的解說范圍示意圖;
圖4是本發(fā)明具體實施方式的方案二中景點A的解說范圍示意圖;
圖5是本發(fā)明具體實施方式的方案二中景點B的解說范圍示意圖;
圖6是本發(fā)明具體實施方式的景點的東北和西南方向確定的兩個點a、b位置示意圖;
圖7是本發(fā)明具體實施方式的景點數(shù)據(jù)存儲方式;
圖8是本發(fā)明具體實施方式的讀取景點數(shù)據(jù)的流程圖;
圖9是本發(fā)明具體實施方式的某景區(qū)有五個景點示意圖;
圖10是本發(fā)明具體實施方式的語音重復播放流程圖;
圖11是本發(fā)明具體實施方式的用于旅游景區(qū)智能導游系統(tǒng)的語音解說方法流程圖。
具體實施方式
下面結合附圖對本發(fā)明的具體實施方式做詳細說明。
一種用于旅游景區(qū)智能導游系統(tǒng)的語音解說方法,如圖11所示,包括以下步驟:
步驟1、獲取景點數(shù)據(jù);
步驟1-1、設置景點所在位置;
步驟1-2、確定景點的解說范圍;
由于景點的形狀通常是不規(guī)則的,所以,語音解說判定的關鍵是確定景點的范圍,考慮兩種解決方案:
方案一:對于形狀規(guī)則的景點,如圖1中的景點A,可以以A的中心O為圓心,以R為半徑做一個圓S,則S即是景點A的解說范圍,S包含A。
但是這種方法有兩個缺點:一是每個景點都需要一個適合自己的半徑R,對于半徑R的確定需要做更多的工作;并且在處理范圍檢測的時候,需要根據(jù)游客當前的位置和景點中心的位置計算出兩者實際的距離,然后與R作比較。這樣每次循環(huán)都需要計算M(M是景點個數(shù))次。這無疑影響了程序的效率。另外在根據(jù)兩點的經緯度進行實際距離計算時,也容易產生很大的誤差;二是這種方式對范圍的確定容易產生范圍交錯(兩景點相距較近時)情況,也容易產生范圍不均勻的情況。如圖2所示,景點A、B的解說范圍α、β有一個公共區(qū)域S,當游客站在A、B的中界線上的時候,并且出于S的區(qū)域內的時候,就會分別播放A、B的語言解說,造成錯誤。
此外如圖3所示,對于像A這樣的景點,在ad邊一側,游客距ad還有一個較大的距離R`時就開始進行語音解說了,這時由于游客離A較遠,很有可能看不到一些具體的細節(jié),而在a、b、c、d四個點附近,即使游客距離A很近,也不會有關于A的語音解說。有人會說,這個問題可以通擴大半徑R來解決。但是當R擴大以后,a、b、c、d四個點附近的問題解決了,但是實際上R`也會隨之變大,第一個問題仍然沒有解決。
方案二:對于景點A,需要采集其東南方向和西北方向的兩個點b和a,其中按a、b的精度與緯度做射線ac、ad;bc、bd,則組成一個矩形acbd,并且acbd包括景點A,則acbd組成的范圍α,即是A的解說范圍。通過調整a、b到一個合理的范圍,就可以確定一個合適的解說范圍α,如圖4所示。這種確定景點解說范圍的方式有一個很明顯的優(yōu)勢:當景點輪廓是一個不規(guī)則的形狀的時候,如圖5中的B也可以很方便的確定一個合適的解說范圍。因此選擇了第二種方案,可以很好地避免方案一中的不足。
步驟2、景點數(shù)據(jù)匹配;
步驟2-1、在景點的東北和西南方向分別確定兩個點a、b,采集a、b的經緯度信息即景點數(shù)據(jù);a的經度作為A的西側經度wLon;b的經度作為A的東側經度eLon;a的緯度作為A的北側緯度nLat;b的緯度作為A的南側緯度slat;如圖6所示;
步驟2-2、定義一個存放景點數(shù)據(jù)的結構體sceneryBuffer,用于將txt文本文件中的數(shù)據(jù)讀到內存中,定義一個類GetStoredData,并且在類的構造函數(shù)中實現(xiàn)對景點數(shù)據(jù)讀取的所有操作,當用該類實例化一個對象時,同時也將所有景點數(shù)據(jù)讀到全局的SceBuf中;
將這些數(shù)據(jù)按如圖7所示的方式存儲到文本文件中。結構體sceneryBuffer,用于將txt文本文件中的數(shù)據(jù)在程序運行的時候讀到內存中,這樣加速景點范圍的匹配從而提高程序運行的效率。圖8為讀取景點數(shù)據(jù)的流程圖。
步驟2-3、進行景點數(shù)據(jù)匹配:當前地圖上游客的位置與某個景點匹配成功,說明游客已進入該景點的解說范圍,則進行步驟3;
進行景點數(shù)據(jù)匹配時,首先要讀取存儲好的景點數(shù)據(jù)到內存中。也可以不將景點數(shù)據(jù)一次全部讀到內存中,當用地圖上當前移動的游客位置與存儲的景點位置數(shù)據(jù)進行匹配時,從文件中讀出一個景點的數(shù)據(jù)進行匹配,如果匹配不成功繼續(xù)讀下一條數(shù)據(jù)。但這樣雖然節(jié)省了內存卻降低了系統(tǒng)效率,因為系統(tǒng)每更新一次地圖上游客的位置,都要進行一次所有存儲景點數(shù)據(jù)的循環(huán)匹配。
步驟3、語音解說:
如果在循環(huán)數(shù)據(jù)匹配過程中,當前地圖上游客的位置與某個景點匹配成功(此時標記變量被賦為某個值),說明游客已進入該景點的解說范圍,則進行當前景點的語音解說。語音文件順序和景點信息順序保持一致,匹配成功后,直接調用API函數(shù)PlaySound播放相應景點的解說語音。為了在播放語音同時在地圖上繪制動態(tài)移動的點,采用異步播放,為了在循環(huán)進行景點數(shù)據(jù)匹配時進行其他操作,采用多線程技術。
步驟4、語音重復播放:當此景點的語音解說結束后,如果游客還在當前景點的語音解說范圍內,會再一次觸發(fā)該景點的語音解說事件,游客就會重復聽到景點解說語音。
游客帶著智能導游終端進入景區(qū)后,系統(tǒng)會實時地讀取游客當前的位置,并與存儲的景點數(shù)據(jù)進行匹配。當游客進入某一景點解說范圍時,會觸發(fā)當前景點的語音解說。但是這時會遇到一個問題,當此景點的語音解說結束后,如果游客還在當前景點的語音解說范圍內,會再一次觸發(fā)該景點的語音解說事件,游客就會重復聽到景點解說語音。
為了解決重復播放同一景點的解說語音問題,我們在存儲景點數(shù)據(jù)的結構體struct scenery-Buffer中定義了一個播放標記flag初始化為0,當數(shù)據(jù)匹配成功且播放標記sceBuf[i].flag為0時播放該點語音解說。當播放完某個景點的語音解說后,將sceBuf[i].flag置為1。這時,如果游客還在同一景點的解說范圍內,雖然數(shù)據(jù)匹配時是成功的,但該景點的播放標記sceBuf[i].flag為1,所以不再進行語音播放。
但此時遇到另一個問題,如果游客再次進入該景點的解說范圍,由于該景點的播放標記sceBuf[i].flag已被置為1,即使數(shù)據(jù)匹配成功,也不會播放該景點語音解說。如圖9所示,某景區(qū)有五個景點,當游客進入景點1的語音解說范圍,播放完該景點的解說語音后,該景點的語音解說標記立即被置為1。 同理,接下來游客分別進入景點2和3,相應的語音解說標記分別被置為1。此時,由于某種原因,游客從景點3回到了景點1,但是由于景點1的語音解說標記已經被置為了1,所以沒有播放景點1的解說語音。
為解決這一問題,定義一個順序表int sceFlagList[SIZE],用來存放某個景點的播放標記sceBuf[i].flag。可以根據(jù)景區(qū)景點數(shù)量來調整SIZE,從而調整sceFlagList的大小。SIZE為景區(qū)的景點數(shù),或者比景點數(shù)量大的某個合適值。當游客進入某個景點的解說范圍時,數(shù)據(jù)匹配成功,并進行語音解說,然后將該景點的播放標記sceBuf[i].flag設為1,并順序壓入順序表。另外定義一個順序表內容數(shù)量標記int curFlag并初始化為0。當每次順序表中壓入一條內容之后,順序表內容數(shù)量標記curFlag都要加1。每次進入下一個景點解說范圍,進行完語音解說之后,除進行將該景點的播放標記sceBuf[i].flag設為1,并順序壓入順序表工作之外,如果此時順序表內容數(shù)量標記curFlag>=1,則將順序表中該景點的播放標記sceFlagList[curFlag]的上一個位置sceFlagList[curFlag-1]置為0,即游客剛游覽過的倒數(shù)第二個景點的播放標記設為0,這樣很好的解決了上面提到的問題。如圖9所示,當游客走出景點1的語音解說范圍時,立即將景點1的語音解說標記置為0。這樣,當游客再次返回到景點1時,由于此時景點1的語音解說標記為0,所以會觸發(fā)景點1的語音解說事件。圖10為解決該問題的流程圖。