1. 程式人生 > >深度漢化GCompris-qt,免費的幼兒識字軟體

深度漢化GCompris-qt,免費的幼兒識字軟體

1 需求

因為有個小孩上幼兒園了,想開始教他一些漢語拼音和基本的漢字,但通過一書本和卡片又有些枯燥乏味,於上就上網搜尋一些輔助認字的應用,還購買了悟空識字APP,在用的過程中發現他設定了很嚴格的關卡,學什麼字,也是被固定死的,也就是隻有把今天的學習完成了才能進行下一課,這對於上小學的小朋友可能比較好,但是對於幼兒來說的話,太過嚴格的限制往往容易讓其失去興趣。而且,說實話他其中的一些動畫做得太過牽強,本來基本沒有聯絡的東西加在一起,擾亂視聽。小孩子字沒認幾個,就想著完後面的遊戲,可以說有一點本末倒置。

在搜尋的過程中還發現了GCompris-qt, 是一個非常優秀的輔助教育套件,集成了大量的應用。而且是支援多語言,也就是說有中文的翻譯版本。其中有一個幫助學習詞彙的應用 lang,因為其中有看圖聽音,聽音辨字等小遊戲,對於學習是已經夠了。但是其中的圖片全是 art4apps 專案中已有的圖片,對於類似講中文的使用者來講的話還是有點不合適。 於是就想,是否可以將自己的圖片和聲音加到GCompris中去,由我來安排他學什麼字,根據實際隨時調整。我雖沒胡直接用QT開發過東西,但實際上是有一些接觸的,經過一番折騰,真就實現了。現在想來其實不困難,主要是其上踩了一些坑,這裡記下來以供參考,主要針對有一定開發能力的人群。

NOTE 這個過程會影響到letterinword、missingletter、hangman這三個應用,因為他們是其於lang/resources/content* 和 words.json 資料的。具體如何處理請看文章末尾。

想想購買悟空識字有些後悔了,我的近200人民幣啊。

2 準備

首先,你需要學習Qt Quick development process 和Voice translation Qt這篇文章。總的來說,就是下載原始碼,準備開發環境,準備圖片和聲音。

2.1 準備原始碼

GCompris-qt原始碼,到Github上下載下來,他會依賴於另一個專案qml-box2d,如果你是通過 git clone 下來的原始碼的話,在cmake的時他會自動去下載,但如果你採取的下載ZIP格式的壓縮包的話則需要手動將qml-box2d下載後放到GCompris-qt/external資料夾下。

2.2 準備開發環境

sudo apt-get install cmake
sudo apt-get install g++
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libssl-dev
sudo apt-get install qt5-default qtdeclarative5-dev qtmultimedia5-dev qml-module-qtquick-controls libqt5svg5-dev libqt5xmlpatterns5-dev libqt5sensors5-dev qml-module-qtquick-particles2 qttools5-dev-tools qml-module-qtmultimedia libqt5multimedia5-plugins

2.3 準備圖片和聲音

GCompris-qt的圖片和聲音在github 上的另一個專案中,GCompris-data,全部有約500M大小,下載的過程中可能出現伺服器斷開連線的情況,可以參照網上的一個教程,就是在gitee.com上建一個帳戶,將github上的專案先克隆過來,然後通過國內的網路進行下載,失敗的概率要小很多。

2.3.1 圖片的處理

下載後壓縮包解壓後可以將自己準備的圖片放到 GCompris-data/words/words/ 這下目錄下,最好自己在給圖片命名的時候有下特點,比如hz1.jpg等等。

2.3.2 聲音的處理

聲音用Audacity這個軟體進行錄製,如果你還沒有安裝的話,就sudo apt install audacity安裝,錄製的過程就簡單了,可以一條一條的錄,也可以一次性全部錄好後進行批量匯出。我採用的是後一種辦法,但要求你先將你的圖片對應的漢字按次充準備好,最好是打印出來,在錄的過程中要方便一些,可以保證每個詞中間的間隔的時間短一些,切分後加入到軟體中播放的效果才好。錄好了要先進行混音,就是把立體聲轉單聲道,爾後分段設定好標記才可以批量匯出。這裡要注意的是設定標記不可以用中文,軟體會卡死。我就依次用數字給進行標記的,你可以用hz1,hz2等這樣的標記,跟圖片對應起來。當然如果你不想每次都輸入hz,也可只輸字母,等匯出來了後再寫兩行程式碼全部重新命名就是了。如果在錄的過程中讀的順序錯了或者少讀了兩個字,這也沒有關係,一會再補上就是了,沒有必要全部重錄一遍。最後有一個配置檔案設定圖片和聲音的對應關係,所以圖和音的名字具體是什麼並不重要,只是有一定的顯然的對應關係,方便你後一步進行處理。但是名字中不能有漢字,否則會出現找不到資源的情況。匯出的時候選擇ogg格式。

還有你讀的字有的聲音大,有的聲音小,這也沒有關係,在匯出後處理一下就好了。這要求你的計算機上裝有 normalize-audio 這個包。

for f in *.ogg; do
  normalize-ogg $f
done

處理好的聲音檔案放到GCompris-data/voices/zhCN/words/ 這個資料夾下,可能你下載下來的資源,在zhCN下沒有words這個資料夾,新建一個就好。

為了保證 letterinword、missingletter和hangman這幾個應用的正常工作,特別是我發現原生的語音在使用這幾個應用時單詞是不發音的,主要是其中缺少單詞的錄音。所以將voices/enUS/words/資料夾下的所有聲音檔案拷貝到voices/zhCN/words/這下資料夾下。

2.3.3 資源編譯

接下來就是處理這些圖片和聲音生成QT程式所需要的rcc檔案了,就是將準備的圖片和聲音編譯成二進位制的資原始檔了。這在GCompris-data目錄下都有指令碼工具,cleanall.sh用於清理生成的資原始檔,generateallrcc.sh 用於生成背景音樂和聲音。生成的聲音資原始檔在 voices/ogg/.rcc/voices-ogg 下面,複製到 ~/.local/share/KDE/gcompris-qt/data2/voices-ogg/ 下面就是了。這個是gcompris-qt 要搜尋的目錄之一。當然這裡還沒有提到圖片資源,還需要你進入到GCompris-data/words目錄中,執行generatelangrcc.sh words,完成後會在當前目錄下生成.rcc的目錄,將其中的Contents 和 words.rcc 複製到 ~/.local/share/KDE/gcompris-qt/data2/words/目錄下面。這裡要注意的是複製的時候其中的Contents不能少,其中記錄了資原始檔的MD5校驗碼,軟體載入資源的時候要進行驗證。

至此該準備的就已經準備好了,接下來,我們就要進行集成了。

3 整合

這一步說難不難,就是容易採坑,順便提一下,其中lang這個應用介面的靈活性還有得提升,後面再講是哪裡,為什麼。

3.1 修改兩個JSON檔案

進入GCompris-qt/src/activites/lang/resource目錄,這是專門存取資源的目錄,其中的 content-zhCN.json 需要根據實際進行修改,當然,如果你的目錄中沒有這個目錄,將content-zhTW.json 複製一份,改個名字就是了。這個檔案中將所有聲音檔案的名字和圖片檔名字對應起來就好了。其中,不需要的條目可以刪除了。有一個細節要注意的是,這是JSON檔案,如果哪兒少了或者多了逗號什麼的,載入會失敗。你可以將其中的內容複製到網上JSON線上格式驗證進行檢查,看哪裡有問題,改過來就好了。

第二個要修改的JSON檔案是words.json這其中記錄了要加入到lang這個應用中去的課程,這也是一個標準的JSON檔案,他其中設想了有章節Chapter、課Lesson,但實際上目錄這個版本只用到課lesson,但是這種層次關係不能改,否則也有可能不能載入成功。我的意思是你可以將所有的內容放到一章中去,沒有必要分chapter。課程內容有數量限制,最大是12,當然如果你需要的話可以到原始碼中找到修改。這裡有幾個地方要提一下,以便理解,此檔案中有個地方寫了"imgPrefix": "qrc:/gcompris/data/"這是怎麼來的呢?解釋一下:在生成資源的時候,generatelangrcc.sh自動寫到qrc檔案中去的,然後又被編譯進了rcc檔案,相當於設定了圖片訪問目錄。理解這一點主要是便於大家理解為什麼lesson中的每個圖的地址要寫成這樣 "image": "words/hz170.jpg",如果你要省略掉words的話需要修改generatelangrcc.sh,修改qrc 檔案來達到目的。最後提醒一下,改完後最好不是到json.cn上去驗證一下有沒有問題。

*Note*這時還有一個坑。檔案中的課程名字如果修改了的話,就要看下一節了,否則可以略過。

3.2 修改一個QML檔案

這裡說的QML檔案指的是Lang.qml檔案,在GCompris-qt/src/activites/lang目錄中,就是resource目錄的上一級,開啟它,檔案末尾有一個常量記錄了要如何翻譯words.json中記錄的課程名字。我給改為了如下的樣子,你可以根據自己的需要來改。不要忘記最後的"}"。

property var categoriesTranslations: {
   "數字(1)": "數字(1)",
   "數字(2)": "數字(2)",
   "身體(1)": "身體(1)",
   "身體(2)": "身體(2)",
   "人物(1)": "人物(1)",
   "人物(2)": "人物(2)",
   "人物(3)": "人物(3)",
   "幼兒識字": "幼兒識字"}

至此基本上要改的地方就改完了。接下來就是編譯執行進行測試了。

4 編譯測試

在GCompris-qt目錄下建一個目錄build,進行build 執行 cmake ..,等著生成Makefile,現在可以通過 make getSvnTranslations 下載介面翻譯檔案了。但是下載的過程有點慢,於是我不想下載我用不上的po 檔案, 修改GCompris-qt/tools/l10n-fetch-po-files.py ,在第47行後插入一行,加上alllanguages=["zhCN"],注意行前不能有空格。下載完成後要在 build 目錄中再次執行 cmake ..,讓其將剛剛下載的 po 檔案加入資源列表,接下來 make BuildTranslations 編譯翻譯檔案。然後 make,就是較長的等待,可能要15分鐘左右。完成後在 build/bin/ 下會生成一個 gcompris-qt檔案,執行他。你可能需要在其設定中切換locale,並將自動下載聲音和圖片關閉。

沒什麼問題的話可以 sudo make install 安裝到系統中,大功告成。

5 後續

 

5.1 刪除部隊應用

GCompris-qt 中的應用太多也是個問題,讓小孩子眼花,可以考慮將其他暫時不想讓他完的應用卻掉。方法也很簡單,修改GCompris-qt/src/activites/activites.txt將不想要的應用名字刪除掉,如果涉及改變了選單的,我指的是比如將lang提升到最頂級,哪還要修改 lang 這個應用的ActivityInfo.qml 中的section的值為 section: "reading",這樣就將其放到了閱讀的下一級了。

對於如何找出在某個目錄下的所有應用,以reading選單為例,可以用這句: find . -type f -name ActivityInfo.qml |xargs grep 'section: "reading'。然後可以用shell或者python等進行進一步處理,或者用excel/wps等把名字分出來,並排好序。

修改完畢後需要在 build目錄下再執行一次 cmake ..,然後再make。

5.2 解決聲音卡頓的問題

當然,GCompris-qt有兩個問題,一是QT版本的沒有GTK的快,在樹莓派上執行還有點卡。另一個是最開始聲音聽起來有點卡,這不是它的原因,需要你修改/etc/pulse/default.pa 新增 load-module module-udev-detect tsched=0,當然卡頓的可能性有很多,但是我是用這種方法解決的哈。

5.3 解決部分應用不能正常工作的問題

最後講一下文章最前面提到的幾個應用,因為資源依賴的關係,在我們的修改後他們不能正常工作了,因為他們本來設計就是用來處理英文單詞的,對於中日韓語言的可能都不太合適。我的做法是在GCompris-qt/src/activites/resource目錄下新建一個 words目錄,然後將 resource/content-en.json 複製到 words/content-zhCN.json,將原來resource/words.json複製為words/words.json,然後將letterinword.js,missingletter.js,hangman.js中資源url "qrc:/gcompris/src/activities/lang/resource/" 修改為"qrc:/gcompris/src/activities/lang/resource/words/"。然後儲存後要到 GCompris-qt/build 目錄下去再執行一次 cmake ..,將我們新增的words目錄加入資源列表,再次make,這樣所有的應用都可以正常工作了。

5.4 關於資源太多的問題

如果你只有10個字要加入課程,完全可以用手動的就行了,但如果有500個字要加入課程,哪麼有一個批量處理的工具有太好了。當然你也可以藉助 Excel來進行處理,效率也還可以。如果你需要這樣一個工具,可以留言。