董濤
摘要:水上VHF通信系統(tǒng)是全球通用的具有國(guó)際標(biāo)準(zhǔn)的通信方式,本文針對(duì)海事管理中航行信息發(fā)布需求來(lái)設(shè)計(jì)的一套基于嵌入式的VHF自動(dòng)播發(fā)系統(tǒng),本設(shè)計(jì)在類似非預(yù)制語(yǔ)音自動(dòng)播放應(yīng)用上具有一定的參考意義。
關(guān)鍵詞:嵌入式;VHF;TTS;自動(dòng)播發(fā)
中圖分類號(hào):U644 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1006-7973(2016)07-0031-03
VHF通信是保障長(zhǎng)江航行安全必不可少的通信手段,因其具有統(tǒng)一的國(guó)際標(biāo)準(zhǔn),主要應(yīng)用于船與船、船與岸之間進(jìn)行的船舶會(huì)讓、遇險(xiǎn)報(bào)警、海事救助等方面的通信聯(lián)絡(luò),特別是由于其廣播的性質(zhì),在岸臺(tái)的水文氣象、航行通告等信息的發(fā)布上起到了不可替代的作用。但在當(dāng)前常用的需要定時(shí)播出的航行通告等信息的播發(fā)中,操作人員一般需要提前錄制好語(yǔ)音文件或者操作TYS軟件將文本轉(zhuǎn)為語(yǔ)音文件,再將該文件上傳給播發(fā)系統(tǒng)定時(shí)播出,該操作需要操作人員具備熟練的普通話能力和相關(guān)軟件操作能力,實(shí)際應(yīng)用中具有一定的難度。
本設(shè)計(jì)就是在需要通過VHF進(jìn)行航行通告等信息播發(fā)的單位、站點(diǎn)設(shè)置一臺(tái)基于嵌入式系統(tǒng)的播發(fā)主機(jī)與VHF船(岸臺(tái))機(jī)相連,操作人員通過內(nèi)部網(wǎng)絡(luò)使用瀏覽器訪問該主機(jī),在頁(yè)面上提交播發(fā)任務(wù)和文本播發(fā)內(nèi)容,該主機(jī)會(huì)按照任務(wù)列表進(jìn)行自動(dòng)播發(fā)。
1 系統(tǒng)設(shè)計(jì)方案
1.1 系統(tǒng)需求
要實(shí)現(xiàn)VHF自動(dòng)播報(bào)系統(tǒng),需要搭建一臺(tái)主機(jī)系統(tǒng)與VHF船(岸)臺(tái)機(jī)相連,實(shí)現(xiàn)以下功能:1.該主機(jī)能夠?qū)⒉?bào)內(nèi)容以音頻的方式發(fā)送給VHF船(岸)臺(tái)機(jī),并控制其播發(fā);2.該主機(jī)能存儲(chǔ)并管理播發(fā)內(nèi)容,實(shí)現(xiàn)定時(shí)按需播發(fā);3.該主機(jī)能夠接入內(nèi)部網(wǎng)絡(luò)中并實(shí)現(xiàn)遠(yuǎn)程訪問,用戶僅需提交文字版的播發(fā)內(nèi)容并可以對(duì)其進(jìn)行增、刪、改等操作;4.該主機(jī)要能專用并小型化,系統(tǒng)工作穩(wěn)定。
1.2 系統(tǒng)方案
根據(jù)系統(tǒng)需求,一臺(tái)基于嵌入式系統(tǒng)的主機(jī)系統(tǒng)方案能滿足需要,其系統(tǒng)架構(gòu)如圖1所示,采用安裝了Linux系統(tǒng)的嵌入式平臺(tái)作為控制主機(jī),在該主機(jī)上搭建web服務(wù)器和數(shù)據(jù)庫(kù)系統(tǒng)并設(shè)計(jì)播報(bào)軟件。遠(yuǎn)程用戶通過瀏覽器訪問該控制主機(jī),在管理頁(yè)面上提交需要發(fā)布的航行信息(文本),播報(bào)系統(tǒng)會(huì)在預(yù)定的時(shí)間將該內(nèi)容通過硬件TTS模塊轉(zhuǎn)換為語(yǔ)音信號(hào)輸出至VHF船(岸)臺(tái)機(jī)并向附近水域播發(fā)。
2 硬件選型
系統(tǒng)硬件架構(gòu)如圖2,由主機(jī)模塊、電源模塊和VHF模塊組成。主要硬件設(shè)備選型如下:
2.1 控制主機(jī)
控制主機(jī)選用樹莓派2代。樹莓派是樹莓派基金會(huì)發(fā)布的卡片式電腦,具有900MHz主頻的4核ARM Cortex-A7 CPU、1G內(nèi)存、10/100M以太網(wǎng)接口的主機(jī)系統(tǒng),主板上載有40針的GPIO(General Purpose Input Output通用輸入輸出)接口,連接實(shí)現(xiàn)外部控制和串行通信功能。利用MicroSD卡作為存儲(chǔ),安裝和運(yùn)行基于Linux的Raspbian或Win10 IoT等操作系統(tǒng)。該主機(jī)完全性能可以滿足本項(xiàng)目的主機(jī)硬件平臺(tái)需求。
2.2 硬件TTS模塊
硬件TTS模塊選擇宇音天下公司出品的最新一代SYN6658中文語(yǔ)音合成芯片模塊。該語(yǔ)音芯片通過UART和上位機(jī)通信,直接接收待合成的文本數(shù)據(jù),實(shí)現(xiàn)文本到語(yǔ)音(TYS,TextTo Speech)的轉(zhuǎn)換功能。該模塊支持任意中文文本(<4K字節(jié))的合成,智能識(shí)別區(qū)分?jǐn)?shù)值、時(shí)間、度量衡、姓氏、多音字等各式文本,內(nèi)置多種提示音可選,并能實(shí)現(xiàn)男女聲、語(yǔ)速、語(yǔ)調(diào)、音量調(diào)整。該模塊接線簡(jiǎn)單,僅需連接供電、UART輸入,提供一路單聲道語(yǔ)音輸出,該模塊控制簡(jiǎn)單、功能強(qiáng)大,輸出語(yǔ)音柔和自然。
2.3 VHF船臺(tái)機(jī)
VHF船臺(tái)機(jī)選用建伍(KENWOOD)公司的TM-271A型VHF調(diào)頻對(duì)講機(jī),該型VHF調(diào)頻對(duì)講機(jī)可以調(diào)整為水上專用VHF頻道。選用該型VHF船臺(tái)機(jī)的主要原因是該機(jī)型麥克風(fēng)接口使用的是標(biāo)準(zhǔn)的RJ45接頭,接線標(biāo)準(zhǔn)明晰,后期改裝簡(jiǎn)單。接線線序如圖3所示,6針為麥克風(fēng)輸入、5針為麥克風(fēng)地,將兩針與TTS模塊的語(yǔ)音輸出直接連接實(shí)現(xiàn)語(yǔ)音的輸入;4針為PTT(PushToTalk)腳、3針為地,將4/3針導(dǎo)通實(shí)現(xiàn)麥克風(fēng)手柄的PIT按鈕按下功能,其他接線腳懸空不用處理。
2.4 其他模塊
電源模塊直接利用VHF專用的13.6V直流電源給建伍VHF船臺(tái)機(jī)供電;樹莓派電源使用LM2596S直流可調(diào)降壓模塊,該模塊輸入3-40V、輸出1.5-35V(3A)可調(diào),使用時(shí)接入VHF電源,輸出調(diào)整為5V即可。
PIT控制使用1路繼電器模塊,該模塊驅(qū)動(dòng)電壓為5V,采用光耦隔離,低電平觸發(fā)。常開端與VHF接口第4/3針PTY/GND相連,通過觸發(fā)實(shí)現(xiàn)PTT按下功能。
由于樹莓派沒有實(shí)時(shí)時(shí)鐘,斷電之后時(shí)間會(huì)歸零。可以使用外接基于DS3231芯片的實(shí)時(shí)時(shí)鐘模塊在樹莓派啟動(dòng)時(shí)進(jìn)行校時(shí)以保證運(yùn)行時(shí)間準(zhǔn)確。也可以在系統(tǒng)啟動(dòng)之后連接內(nèi)網(wǎng)的NTP服務(wù)器實(shí)現(xiàn)授時(shí)及校時(shí)功能。
3 軟件設(shè)計(jì)
系統(tǒng)軟件的總體設(shè)計(jì)思路是基于任務(wù)表驅(qū)動(dòng)系統(tǒng)運(yùn)行。播報(bào)系統(tǒng)每分鐘讀取一次數(shù)據(jù)庫(kù)中的任務(wù)表,任務(wù)表中任務(wù)時(shí)間以分鐘為單位,將表中的任務(wù)時(shí)間與系統(tǒng)時(shí)間相比對(duì),如果時(shí)間相符則播出該條播報(bào)信息,播放完成后將播放內(nèi)容保存至已播放表。系統(tǒng)運(yùn)行流程圖如圖4所示:
要實(shí)現(xiàn)系統(tǒng)設(shè)計(jì)目標(biāo),需要完成以下系統(tǒng)及軟件的設(shè)計(jì):
3.1 操作系統(tǒng)搭建
樹莓派使用主板上的bootload來(lái)引導(dǎo)燒錄在MicroSD卡上的操作系統(tǒng)鏡像來(lái)啟動(dòng)系統(tǒng)。在本設(shè)計(jì)中使用的是Raspbian系統(tǒng),Raspbian是基于Debian GNU/Linux的免費(fèi)操作系統(tǒng),它面向Raspberry Pi硬件(armhf處理器架構(gòu))做了優(yōu)化,內(nèi)置了多個(gè)常用的軟件包和預(yù)編譯軟件,非常適合于常用的web服務(wù)器、物聯(lián)網(wǎng)設(shè)備控制等系統(tǒng)設(shè)計(jì)和開發(fā)。
Raspbian系統(tǒng)安裝:首先從Raspbian官方或者國(guó)內(nèi)鏡像下載Raspbian系統(tǒng)包,然后在windows系統(tǒng)下使用Win32DiskImag-er將.img文件寫人MicroSD卡;再將卡插入樹莓派MicroSD插槽,上電后Raspbian會(huì)自動(dòng)啟動(dòng)。在完成系統(tǒng)安裝之后,通過SSH登陸樹莓派設(shè)置好靜態(tài)lP地址并安裝VNC Server,方便后期使用vnc客戶端遠(yuǎn)程登陸至樹莓派x desktop上進(jìn)行操作。
本設(shè)計(jì)使用Linux+Nginx+SQLite+Python+Django架設(shè)服務(wù)器來(lái)取代常用的LAMP(Linux+Apache+Mysql+PHP)的方式來(lái)架設(shè)Web服務(wù),因?yàn)樵摲绞捷^LAMP來(lái)說(shuō)資源消耗低,開發(fā)起來(lái)也比較便捷。樹莓派上安裝Nginx/Django/SQLite/Python的方法網(wǎng)上較多,此處不贅述了。
3.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
本設(shè)計(jì)使用SQLite作為數(shù)據(jù)庫(kù)系統(tǒng),SQLite是一款輕量化的數(shù)據(jù)庫(kù)系統(tǒng),其設(shè)計(jì)目標(biāo)就是使用在嵌入式系統(tǒng)中,資源占用小但功能強(qiáng)大,它獨(dú)立、開源并支持多種開發(fā)語(yǔ)言,是輕量級(jí)嵌入式開發(fā)較為合適的數(shù)據(jù)庫(kù)系統(tǒng)。
SQLite數(shù)據(jù)庫(kù)為單文件數(shù)據(jù)庫(kù),本設(shè)計(jì)數(shù)據(jù)庫(kù)名為playlist.db,其中包含兩個(gè)主要的表:tasklist(播放任務(wù))、complist(已播放)表。其中,tasklist表主要有以下字段:
playtime TEXT//計(jì)劃播報(bào)時(shí)間
freq
INTEGER//播報(bào)頻率
num
INTEGER//播報(bào)次數(shù)
title TEXT//播報(bào)內(nèi)容標(biāo)題
text TEXT//播報(bào)內(nèi)容
其中playtime為播報(bào)時(shí)間,格式為YYYYMMDDHHMM,如201601011330;freq播報(bào)頻率指間隔多少分鐘播出一次(根據(jù)實(shí)際播出要求,該頻率一般為5-120分鐘);nun指一共播出多少次;title限定20漢字以內(nèi);text限定200漢字以內(nèi)。
eomplist表用于保存已播放內(nèi)容,僅需playtime、title和text字段。
根據(jù)日常使用經(jīng)驗(yàn),系統(tǒng)主要是針對(duì)tasklist表中的內(nèi)容進(jìn)行增、刪、改操作,即向播放列表中加入播放條目、播放完成后刪除播放條目、對(duì)未播放內(nèi)容進(jìn)行修改,數(shù)據(jù)紀(jì)錄條數(shù)較少,檢索方便。complist表主要是增加數(shù)據(jù)紀(jì)錄操作,由于該表是每次播放完成后將已播放內(nèi)容加入,數(shù)據(jù)紀(jì)錄天然按照播放時(shí)間(playtime)字段增序排列,不需要進(jìn)行額外排序工作。
3.3 WEB服務(wù)器設(shè)計(jì)
WEB服務(wù)框架采用Django。Django是一個(gè)開放源代碼的Web應(yīng)用框架,由Python寫成,采用了MVC(Model View Control-ler,模型、視圖、控制器)的軟件設(shè)計(jì)模式。選用Django的原因是使用框架封裝了控制層,數(shù)據(jù)調(diào)用等操作只需調(diào)用相應(yīng)的方法即可完成,另外有大量的第三方插件可以使用,大大的提高開發(fā)的效率。
WEB服務(wù)器采用Nginx。Nginx是一款輕量級(jí)的Web服務(wù)器,占用內(nèi)存僅幾兆,非常適合于樹莓派上構(gòu)建WEB服務(wù)。Django通過Nginx+uWSGI來(lái)部署,Nginx作為服務(wù)器最前端,它將接收WEB的所有請(qǐng)求,統(tǒng)一管理請(qǐng)求。Nginx把所有靜態(tài)請(qǐng)求自己來(lái)處理,非靜態(tài)請(qǐng)求通過uWSGI傳遞給Django,由Django來(lái)進(jìn)行處理,從而完成一次WEB請(qǐng)求。
WEB頁(yè)面設(shè)計(jì)比較簡(jiǎn)單,直接借用一個(gè)基礎(chǔ)的論壇發(fā)布頁(yè)面,簡(jiǎn)單修改后調(diào)用數(shù)據(jù)庫(kù)內(nèi)容顯示在頁(yè)面上,可以對(duì)每個(gè)條目進(jìn)行增、刪、改操作。
3.4 播報(bào)軟件設(shè)計(jì)
播報(bào)軟件使用Python軟件開發(fā),Python是一種面向?qū)ο蟆⒔忉屝陀?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,該語(yǔ)言簡(jiǎn)潔、易用和可擴(kuò)展,比較方便使用于WEB開發(fā)應(yīng)用中。
播報(bào)軟件主要由數(shù)據(jù)庫(kù)訪問和文本TYS輸出組成:
3.4.1 數(shù)據(jù)庫(kù)訪問
系統(tǒng)運(yùn)行中正常的數(shù)據(jù)庫(kù)訪問涉及tasklist表的增加、刪除和更新及complist表的增加操作。系統(tǒng)上電運(yùn)行之后,每分鐘查詢一次tasklist表,比對(duì)是否存在playtime與當(dāng)前時(shí)間相符的記錄,如果相符則將該條記錄中text字段內(nèi)容(播發(fā)內(nèi)容)輸出,播發(fā)完成之后,將該條記錄復(fù)制進(jìn)complist表,表明該條播發(fā)任務(wù)已經(jīng)完成。然后查看nun字段是否大于1(需要多次播發(fā)),如果不大于則表明需要多次播發(fā)的任務(wù)已經(jīng)完成,刪除該條記錄;如果沒有完成則將nun字段內(nèi)容減一,將playtime字段時(shí)間加上freq內(nèi)容(構(gòu)成下一次播發(fā)時(shí)間);最后重新更新該條記錄,形成一條新的播發(fā)任務(wù)記錄。
3.4.2 文本TTS輸出
通過將text字段內(nèi)容(文本)向串口輸出至SYN6658芯片實(shí)現(xiàn)文字到語(yǔ)音的轉(zhuǎn)換后從VHF船臺(tái)機(jī)播出主要由以下兩個(gè)過程完成:
3.4.2.1 FFF按鈕的按下
根據(jù)樹莓派GPIO定義,使用GPIO 0(第11腳)作為控制腳,與繼電器模塊IN腳相接。
GPIO.setmode(GPIO.BOARD)//使用GPIO.BOARD模式
GPIO.setup(11,GPIO.OUT)//將11腳(GPIO 0)設(shè)為輸出模式
吸合繼電器時(shí)使用:GPIO.output((11,GPIO.LOW),此時(shí)VHF船臺(tái)機(jī)FFF與GND導(dǎo)通,相當(dāng)于PTT按鈕按下,VHF船臺(tái)機(jī)處于發(fā)送模式。
釋放繼電器時(shí)使用:GPIO.output(11,GPIO.HIGH),此時(shí)VHF船臺(tái)機(jī)PTT與GND斷開,相當(dāng)于PTY按鈕釋放,VHF船臺(tái)機(jī)處于接收模式。
3.4.2.2 串口文本輸出
樹莓派原生有一個(gè)串口,為GPIO 14(TXD)和GPIO 15(RXD),但該串口默認(rèn)為調(diào)試口,需要在樹莓派配置界面中將串口調(diào)試功能關(guān)閉。將GPIO 14與SYN6658模塊RXD連接,GPIO 15與SYN6658模塊TXD連接,波特率默認(rèn)為9600bps。
樹莓派與SYN6658之間通信使用數(shù)據(jù)幀的方式,數(shù)據(jù)幀格式如下表:
樹莓派向串口輸出控制播發(fā)的過程為:
ser=serial.Serial("/dev/uyAMA0",9600)
ser.write('\xFD')//輸出固定幀頭0xFD
ser.write('\x00\x66')//數(shù)據(jù)區(qū)長(zhǎng)度為102字節(jié)(發(fā)送50個(gè)漢字)
ser.write('\x01\x00')//以GB2312編碼格式合成播放
ser.write(data)//輸出待發(fā)送文本
通過輸出不同的命令字可以控制芯片播發(fā)、停止、暫停、恢復(fù)等合成文本操作。
輸出0xFD 0x00 0x01 0x21命令可以查詢芯片工作狀態(tài),芯片收到查詢指令后,返回0x4E表明仍在合成過程中,返回0x4F表明處于空閑狀態(tài)。
合成工作完成后表明所有待發(fā)送的文本已經(jīng)全部提交合成完畢,如果系統(tǒng)工作正常,那么該條航行信息應(yīng)該通過VHF船臺(tái)機(jī)向附近水域播發(fā)完成,此時(shí)將FTT按鈕釋放,整個(gè)播發(fā)過程結(jié)束,系統(tǒng)進(jìn)入下一次播發(fā)的準(zhǔn)備狀態(tài)中。