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