2021年5月16日 星期日

Linux : 虛擬 Webcam : v4l2loopback 加 GStreamer

2021年5月16日 星期日
在「雄 : Android : 手機變電腦的 Webcam : IP Camera Adapter」中提到在 Windows 中除了可以用 OBS 的虛擬相機,另一個選擇是用 IP Camera Adapter;那在 Linux 還有什麼選擇呢?其實應該是有更多的方案,本篇來玩玩 v4l2loopbackGStreamer,由 v4l2loopback 建立虛擬 Webcam,而由 GStreamer 抓取 IP Webcam 所提供的 Android 手機鏡頭拍到的 MJPEG 串流,變成電腦的 Webcam。

先在 Linux 上安裝好 v4l2loopback-dkms 跟 GStreamer,接著就可以來玩玩虛擬 Webcam 了。

Google Meet : 設定 : 攝影機

2021年5月15日 星期六

Android : 手機變電腦的 Webcam : IP Camera Adapter

2021年5月15日 星期六

關於把 Android 手機當電腦的 Webcam ,在「雄 : Android : 手機變電腦的 Webcam : OBS」這篇中,使用的是跨平臺的 OBS 抓取 IP Webcam 傳來的 Android 手機鏡頭畫面,然後變成虛擬相機。如果電腦使用的是 Windows,則多了一個選擇,可以使用本篇所要介紹的 IP Camera Adapter ,搭配 Android 上 IP Webcam 或 DroidCam 來建立虛擬相機,並應用在 Zoom、Google Meet ...... 等需要 Webcam 的地方。

Google Meet & Chrome 攝影機設定

Wget : 下載完整的網頁

GNU Wget 是一個自由軟體,也是一個強大的下載工具。

之前除了下載單一檔案外,也應用在讀取網址清單,批次下載清單中檔案 (參數: -i ) 。其它的功能則還沒有玩遍。最近又試了一下,抓取完整網頁內容的參數,更為驚豔了!

不過,一開始照著參數說明去試,失敗 n 回,才發現,原來我之前在 Windows 中安裝過的 Wget 是 GNU Wget 1.11.4,這版本是 GNU Win ( http://gnuwin32.sourceforge.net/ ) 中下載的,有一點舊了。在底下的網站中下載較新的版本,所有問題都解決了:

這次的目標是要下載某一個網頁中的所有內容,包括裡面的 mp3 檔案,但是不繼續擷取網頁中連結到其它頁面的網頁。執行的指令如下:


wget -m -k -E -p  -np  http://aaa.bbb.ccc.ddd/eeeee/fffff.php


底下是各參數的說明(可以用 wget --help 查到):

  • -m,  --mirror : 相等於 -N -r -l inf --no-remove-listing 選項
  • -k,  --convert-links : 將下載後的 HTML 的鏈結轉換為本地檔案
  • -E,  --html-extension : 將所有 HTML 文件加上 “.html” 延伸檔名
  • -p,  --page-requisites : 下載所有顯示網頁所需的檔案,例如圖片等
  • -np, --no-parent : 不進入上層的目錄

會需要加 -E 的參數,主要是因為這個頁面的檔名是 .php ,在本機用瀏覽器開啟時,可能要多一個指定程式的動作,所以乾脆由 Wget 順便幫忙改檔名為 .html ,較方便;而如果去掉 -np 的參數, Wget 抓回來的就不會只有一個網頁了。

Wget 還有很多參數可以玩,有空再來試試吧!




2021年5月14日 星期五

Android : 手機變電腦的 Webcam : OBS

2021年5月14日 星期五
之前因為講課需要使用實物投影機,而電腦沒有外接的 Webcam 可用,又把  Android 手機 + IP Webcam 的方案拿出來用。如果搭配 Android adb 工具程式,甚至只要連接 USB 線,可以應用在沒有無線網路可用的環境中。那 Android 手機的鏡頭可以變成電腦的 Webcam,讓 Zoom、Google Meet......使用嗎?試了許久,利用所謂的 Virtual Camera ,的確是可以讓電腦的其它軟體當它一般的 webcam 來用。本篇先來玩玩 OBS 的虛擬相機 (Virtual Camera)。

Google Meet & Chrome 攝影機設定


2021年4月29日 星期四

App Inventor : TTS 文字轉語音講中文

2021年4月29日 星期四

 App Inventor 內建了 TextToSpeech (TTS) 的積木,可以把字串以合成的語音唸出來。線上使用說明文件在這個網址:

看起來很簡單啊~~哈!如果讓它講英是沒什麼問題,最大的問題是在「Country」中找不到台灣,在「Language」中找不到中文;測試的結果,當然是遇到中文就變啞巴。

看一下手機中的到底安裝了什麼 TTS 的相關資料?

TTS 一般是歸在 Android 手機設定的「語言與輸入」裡面,我的紅米手機是放在「文字轉語音輸出」:


這支舊的紅米手機內建的 TTS 引擎是「Pico TTS」


再來看 Pico TTS 支援哪些語言:


難怪不會說中文,根本沒有中文的語音資料。

沒關係!把 TTS 「引擎」換成有支援中文的Google 文字轉語音引擎」,到 Google Play 中找到「Google 文字轉語音引擎」,安裝完,重新回到「語言與輸入」的設定中,應該就可以選取「Google 文字轉語音引擎」了


設定完,再去 App Inventor 的 App 中測試,應該可以講中文了。



App Inventor : 語音辨識與文字轉語言合用的趣味

 早上利用 App Inventor 把語音辨識測試程式中加入了 TTS (文字轉語音)的功能,讓手機將語音辨識完的文字,再透過 TTS 唸出來,結果講了幾個詞以後,手機變成自言自語,輸出變輸入,輸入又變輸出......


Google 小姐就這麼一直不停的講,完全停不下來!要不是手機快沒電了,還真想看看她會不會當掉呢!

當然囉~如果有插上耳麥,麥克風收不到喇叭的聲音,就不會像這樣掉到迴圈中,無限循環了。




2021年4月28日 星期三

App Inventor : SpeechRecognizer 語音辨識

2021年4月28日 星期三

最近要寫一個以語音發出指令,然後利用手機控制馬達的程式,現在 MIT App Inventor 中的 Media 就內建有 SpeechRecognizer 語音辨識的積木可以來構建我需要的功能。

看 SpeechRecognizer 的線上說明,只要將 UseLegacy 的屬性值改為 False,就可以讓語音辨識的功能在背景執行,而且可以連續地使用,直到關閉功能為止。這部份和舊版時,想要不中斷使用語音辨識,得利用 Timer 來自己判斷並維運,有很大的差異。

但是我試了兩天,並不是像說明寫的那麼簡單啊!無論我將 UseLegacy 設為 True 或是 False,它的差別只有會不會出現說話以供辨識的提示而已;只要不說話了,SpeechRecognizer 就罷工休息了。

不過觀察了一下,每次罷工前,畫面總會出現錯誤代碼和訊息,大概就類似底下的:

  • Error 3802: Client Side Error
  • Error 3806: No Match
  • Error 3807: RecognitionService Busy
  • Error 3809: No Speech Input

有留下線索就好辦了!

如果是 Error 3802,SpeechRecognizer 會繼續工作,但如果是 Error 3806,SpeechRecognizer 就會去睡大頭覺了!

因此我試著在發生 Error3806 時,就重新利用 GetText() 叫醒 SpeechRecognizer。

另外當然一個需要再度呼叫  GetText() 的地方就是當語音已經辨識完成時。根據線上說明,當 SpeechRecognizer 進行完語音辨識時,會觸發 AfterGettingText 事件,而在  UseLegacy 設為 False 時,最後一部份完成辨識,在  AfterGettingText 中,還會把 partial 變數設為 False。所以在  AfterGettingText 中,可以利用  partial 是否為 False 來判斷它已辨識完成,我們就重新利用 GetText() 叫醒 SpeechRecognizer。

先來看看利用一個 Button、一個 Label 和一個本篇的主角 SpeechRecognizer 所構成的完整程序:


Error3806  在哪裡處理呢?

因為只有一個 Screen (Screen1) ,所以我們在 Screen1.ErrorOccurred 中放入檢查錯誤代碼,並重新呼叫  GetText()  的程序。

另一個讓語音辨識不中斷的關鍵則在 AfterGettingText 中:


注意上面積木塊中的第二個 if 積木,它用來在 partial 為 Fasle 時,重新呼叫  GetText()  的程序。

如果能處理 Error3806 及 partial 為 False 這兩點,並重新呼叫  GetText() ,就能讓 App Inventor 的語音辨識能夠一直維持上線狀態。






2021年4月22日 星期四

Moiré Animation:柵欄動畫:手繪篇

2021年4月22日 星期四

2020年11月看了網路上看了 Brusspup 的 Animated Optical Illusion 影片,用 Inkscape 弄了個四格的柵欄動畫,然後以 LimeJS 寫了個 HTML5 的小工具,可以載入柵欄片跟動畫圖稿的檔案,在電腦或手持裝置上玩,程式放在我的 HTML5 FUN 網站中:

進入網站以後,找 html_animation ,按一下圖示即可玩。

動畫圖稿如果印出來,再把柵欄片印在透明片上,就可以像 Rufus Butler,Seder 的 "Scanimation Picture Book" ,拿在手上玩了:

不過,想想~用手繪的是不是更有趣呢?

於是我用 OpenSCAD 寫了個可以自訂柵欄片模型的小工具,只要將模型用 3D printer 印出來,就可以有一個既可以拿來玩,也能拿來當畫動畫的輔具。柵欄產生器放在 Thingiverse 的網站中,只要按一下右側上方的「Open in Customizer」按鈕即可自己線上設計:



底下這張手繪稿是利用四個影格的柵欄輔助所畫出來的:


看得出來是什麼動畫嗎?

2021年4月12日 星期一

Inkscape : 路徑無法進行操作

2021年4月12日 星期一

在 Inkscape 中,明明已經將文字物件轉為路徑了,卻仍然無法和其它圖形進行路徑的「交集」,其實這個問題也發生在圖形和圖形之間。

之前一直以為把兩個圖形選取以後,就可以進行路徑的「相加」、「減去」、「交集」、「排除」......等操作,試了半天,圖形一點變化也沒有。


能不能執行路徑的功能操作,關鍵就在選取的物件中是否含有「雜質」。什麼是「雜質」呢?

如果被選取的物件只是單純用 Inkscape 工具繪製完的圖形(文字工具除外),而且沒有「群組」過或設定成「剪裁」、「遮罩」的,應該可以順利的執行路徑中的功能。反之,如果選取的範圍中有文字物件或圖形有設定「群組」、「剪裁」、「遮罩」的,路徑中的功能可能無法作用。

以上圖中為例,如果只選取了紅色的矩形跟藍色的圓形,它們因為都是單純的圖形,可以執行路徑的功能;但如果又加選了黑色的文字物件,就聞風不動了!

如何讓文字物件可以執行路徑的功能呢?

文字物件要先依序進行兩個操作:

  1. 物件轉為路徑。
  2. 解散群組。
選取文字物件後,再點選主選單裡「路徑」中的「物件轉為路徑」


由於文字物件轉為物件以後,整個文字物件不管裡面有多少字,它們都被設定了群組。前面提過,設定群組的物件無法執行路徑的功能。所以要先解散群組:



同樣的道理,如果其它圖形有被設定群組了,要執行路徑的功能之前,也是要先解散群組。



2021年4月11日 星期日

柵欄動畫書修復

2021年4月11日 星期日

因為親職講座課程中想讓學員可以看看現有的柵欄動畫的商品,將市立圖書館中現有可借出  Rufus Butler,Seder 的 "Scanimation Picture Book" 都線上預約,借回來了。不過像這種玩具書,想當然爾,書況應該都不會太好。

分兩天借回來的四本書,只有上面這一本 Snoopy 保存良好,其它三本真的是慘不忍睹。其中一本還有一頁的「零件」已經「離家出走」:


除了上面這個「零件」已經離家出走的,完全沒救了,其它三本的「故障」原因不外乎:

  • 錯誤維修,將該動的地方以膠帶貼死。
  • 錯錯維修,將圖案的部份壓在柵欄膠片底紙下方,完全看不到圖案。
  • 活動的柵欄膠片底紙變形、脫位。
  • 書背脫膠。

2021年4月3日 星期六

HTML5 : gomoku 漢字五子棋

2021年4月3日 星期六

 「漢字五子棋」是 2011年5月在 Plurk 上看到噗友的貼文而知道的,隨後我用 Flash 寫了個小工具,可供兩個人玩類似的遊戲,當時的討論噗文及 Flash 版的漢字五子棋說明,都在底下這篇舊文中:

如舊文中的記錄,Flash 版的漢字五子棋自 2012年一月後就沒有更新了。這次的目標是將它以 HTML5 改寫,但盡量維持原有的運作方式。改變比較大的,大概就可供自訂內容的參數,改用較長的名稱,期待能較易理解,並在設定檔中多一些註解說明,方便使用者使用。

新版的 HTML5 漢字五子棋在 HTML5 FUN 中可以試玩,並下載,HTML5 FUN 網址如下:


功能說明

2021年3月24日 星期三

HTML5 : card_flip 大家一起來

2021年3月24日 星期三

2012年八月在噗浪上由網友發想,結合眾人的想法而完成的 Flash 版 CardFlip (大家一起來) 最後一次更新是 2018.11.17;前幾天在 FB 上看到網友仍在使用,又有一股動力把它改寫為 HTML5 版。好久沒花時間在教學工具的程式上了,先用了大半天把版型以 LimeJS 排出來,接著就一股作氣的開始處理其它程序。

初步就是將原來在 Flash 版上的運作模式盡量還原就好,花了兩天半,大概就剩以鍵盤操作的部份需要再補上。先將它上載到 HMTM5 FUN 中讓大家玩玩看。


到 HTML5 FUN 中,找到三個小綠人的圖示,按下去後,就可以進入 html5_card_flip (大家一起來) 的第一個畫面

如果順利載入設定檔,應該可以看到如上圖的畫面。否則「大家一起來」幾個字會變成錯誤訊息。

2021年3月22日 星期一

Flash : 擷取 .FLA 檔案中的 MP3 檔

2021年3月22日 星期一

電腦就是這樣愛鬧脾氣,昨天明明還能開機的機器,不知何故硬是開不了了。由於比較少在用的機器了,試了好久,決定拆硬碟讀資料就好了。

會需要用到舊電腦,主要是想把一個 Flash 小教具改為 HTML5 版,當初的音效檔不知道存到哪裡去了,只好由 Flash 的 .FLA 原始檔中抓出來。不過現在問題來了,目前使用的電腦並沒有安裝 Flash,有 .FLA 檔也開不了。又不想大費周章的安裝 Flash,只好找別的方法擷取 .FLA 中的 MP3 音效檔。

網路上有人說到 .FLA 其實是個壓縮檔,改一下檔名就能把裡面的素材解壓縮了。試了一下,真的可以耶!


首先把 .fla 的副檔名改為 .zip


接著利用 7-zip 來解壓縮到資料夾中


我的是 Flash 8 的 FLA 檔,解壓縮完的檔案並未分類到不同的資料夾中,只能由檔名來猜測


試著一個個把 Media 開頭的檔案,加上副檔名 .mp3;運氣不錯,找到 Media6 跟 Media7 ,將它們改為 Media6.mp3 和 Media7.mp3,真的是我要的音效檔!

取回了音效檔,可以繼續進行程式改寫的工作了。






2021年3月21日 星期日

3DP : 出料不順 : 熱敏電阻鬆動

2021年3月21日 星期日

 我自組的 SmartrapCore 3D printer 目前使用的加熱頭組是 E3D v5,前幾天是自之前東壞西壞,大修過以後的第一次列印,本來還對新買的金屬擠出機報有很大的期待的,沒想到,怎麼印都很糟。首先覺得怪怪的是,把塑料手動推進加熱端時,會聽到很明顯的啵啵啵聲,這聲音之前是在用吸太多水分的料,或是在用3D列印筆時才聽過。再來就是印出來的物件,很明顯的溫度過高,還有出料不穩定。雖然試著降速、降溫......,花了不少時間,試印了很多次,問題仍然找不出來。後來和朋友討論了一下,他的研判是溫度感應器可能壞了。有了方向,就下定決心拆加熱器了。


本來的計畫是要把之前買的 E3D v6 換上,在拆 E3D v5 加熱塊上的鐵氟龍膠帶時,發現熱敏電阻似乎有移位的情形。於是決定先試著重新將它確實的塞進感應器的孔洞中,並固定好;把它及加熱棒上的線牢牢地用膠帶一層又一層的繞好。

重新把加熱組裝回機器,開機測試,耶!解決出料不順的問題了!

記得以前有人說,然敏電阻安裝的位置要盡量靠加熱塊中心,這樣子測得的溫度才會比較接近塑料被加熱時的溫度。在猜想,可能是之前這台 SmartrapCore 一直拆拆裝裝,熱敏電阻鬆動,才造成溫怠失準,以致於溫度過高。以後出料不順,這個項目也要檢查一下。



2021年3月20日 星期六

3DP : 變臉玩具 v.2

2021年3月20日 星期六

3DP 變臉玩具本來是要用 Among Us 那太空人造形的,設計時是以一個球,嵌入一半在圓柱體中,不過在挖了臉部及身體中央以後,圓柱體前方會有一個大洞;這其實只是處理程序的先後、邏輯問題,當時腦袋混沌,懶得再去想,後來改用相對簡單的方法,把臉部放到完整的球裡面。完成第一個版本以後,當然是不死心,靜下心來,好好想,如何挖空又不留個大洞,終於完成了第二版的 3DP 變臉玩具。


這個版本的頭部有三種造形,其實也不過是把之前的牛角,跟熊的耳朵加上去而已。不過圓圓的耳朵,加上用綠色的料,怎麼看都覺得照片裡最右邊的是隻青蛙。

上一個版本為了能將臉的零件塞到頭部,頭部的下緣是設計成斷開的,這樣有個缺點,頭部和身體很容易分開,如果不小心掉到地上,就「身首異處」了!所以第二版讓頭部的零件下緣是完整的圓,另外在身體上緣加了幾個凸點,用來固定,比上一版本穩固許多。

臉部零件的軸心下方轉軸改短一點點,讓臉部可以往下挪一點,上方就比較不會去卡到頭頂;此外齒輪的部份也稍稍縮小,讓它可以更容易在按鈕的「自由區」移動,可以轉得更順,按鈕也比較不容易卡住而無法回彈。

按鈕的部份,讓它前端按鍵加長一點點,可以把按鈕壓得更深,「自由區」會更大一點,避免摩擦到齒輪。

3D 模型檔案放在 Thingiverse 網站中:

組裝的影片:


相關文章






 
© 2009. Design by Pocket