OBS 實況顯示VNR翻譯的遊戲文字, display VNR (visual novel reader) translation

需要使用修改過的VNR (主要由 kyob1010 完成) 及OBS (修改過的obs-text.dll)
不想安裝新的可以只換掉關鍵檔案 (版本太舊會出問題,建議用已整合完的版本)
詳細安裝方法請看VNR, OBS各別文件

限制: 不能有多個不同名的obs-text同時使用vnr mode (因為我懶得處理,應該很少用到)

2019/6/26 提高效能,需要更新後才能用或都不更新 (VNR和OBS必須是同一機制)
2019/1/9 提高效能,需要更新後才能用 (或是都不更新留在舊版)

VNR (visual novel reader)
不放在github的原因是檔案太大 limit會超過,就選了gitlab
https://gitlab.com/craftwar/VNR_OBS
kyob1010寫的說明文件 https://gitlab.com/craftwar/VNR_OBS/blob/master/README%20for%20VNR_OBS.txt

有問題要問 kyob1010,py我不熟,我只修改windows api的部分
回報問題前先閱讀 https://craftwarblog.blogspot.com/2018/07/how-to-report-bugs-effectively.html
除錯時,依文件說明使用debug mode檢查視窗全部輸出 (不是輸出停止的最尾端畫面而已)
建議複製到文字檔內再看,非常長,通常會寫錯誤原因

VNR常見問題
https://craftwarblog.blogspot.com/2018/12/vnr-visual-novel-reader-faq.html

一般使用者下載這個就好 (沒有多餘的修改,只加上OBS輸出功能)
如果VNR版本太舊,手動patch可能會錯誤,可下載包好的
Jichi版本 + OBS 輸出patch

https://mega.nz/#!l0tHzI6Z!ZMjs_cE46atvjoQIGyV4zCXnDI_FSdZ8NjrHV-3Af7Y (我包的)
原先使用的VNR內的Cache目錄複製進去,避免缺少字典檔或其他檔案,導致問題

或用mklink建立連結,不用複製Cache目錄 (空間只需要一份)
https://docs.microsoft.com/windows-server/administration/windows-commands/mklink
ex: mklink Cache "C:\tool\Visual Novel Reader\Caches" /j 


想自己動手上更新的話就去gitlab下載再覆蓋相關檔案 (說明在VNR_OBS內有)
可以用這個檔案,放在VNR跟目錄執行 (該目錄下有Caches, Library, Visual Novel Reader.exe),這下載指令只支援Win10 1803以後版本,或是自己去找curl來補上
https://gitlab.com/craftwar/VNR_OBS/raw/master/DL_trman.py.cmd?inline=false
如果換掉trman,py無效,表示你的VNR版本相差太多,請用我包好的或自己想辦法修正

gitlab上的版本是我把Jichi版本(160403或更新)修改/修正使用時遇到的問題 (符合自用)
後來加入OBS輸出功能才想公開分享,不推薦無法處理程式錯誤的人使用 (和上面包的Jichi版本 + OBS 輸出patch 不同)
我是用 Visual Novel Reader\Scripts\Visual Novel Reader.cmd 啟動 (可以給不同參數)
下載方法 (任何一種格式都可以)



如果你想找原作者Jichi做的VNR (最原始版本,沒經過其他修改的,有部分功能已經失效未修正)
https://code.google.com/archive/p/annot-player/
這個版本要套用我和 kyob1010做的 VNR修改才能直接傳送翻譯到OBS

另一個目前有在維護?的版本 (俄羅斯人改的)
除了改網站連結以外,我不知道還有改什麼
http://vnr.aniclan.com/




OBS
https://craftwarblog.blogspot.com/2017/09/obs-studioby-craftwar.html


部分遊戲如果先開OBS,game capture injection後,VNR injection會出問題
可以先開VNR,等抓到文字後再讓OBS game capture injection
或是OBS不要使用game capture

使用時只要在obs-text選擇這個選項 (錯誤時會自動關掉選項)
建議設定文字自動換行,文字超過寬度時會自動在下一行顯示

這個方法對文字有最多控制和處理,畫面上的效果最好,程式效能也是最好的
ex: 可以過濾VNR的字詞標籤 (不會看到[ruby][/ruby]這類東西),其他方法都無法



提供另外顯示VNR翻譯的方法 (不須使用我的修改)

在VNR中設定翻譯複製到剪貼簿
使用有剪貼簿內容檢視的軟體,OBS擷取該軟體的畫面 (不能最小化)

缺點是剪貼簿會被占用,可能會有衝突導致抓不到,漏訊息


最後一個什麼額外處理都不用的方法
直接OBS用display capture抓整個螢幕畫面 (win7時用過,很吃資源不推薦)
VNR好像只能顯示在 primary display (沒用過雙螢幕不清楚)
效能是最差的,顯示區域大小會改變不好控制
不相關的東西會被截取,不小心會把個人私密畫面流出


刪除詢問是否可用的留言 (因為沒有進一步回應,避免使用者誤會無法使用)


最後寫點技術細節 (沒興趣的下面不用看)
我的方法是在VNR把翻譯寫入shared memory
OBS (obs-text)會去檢查 shared memory 有無變化,顯示文字
改成VNR會發event通知OBS更新,提高效能 (CPU用量在R5-1500X 減少約1%)
其他方法要OBS重複讀取或是去檢查,CPU用量較高

kyob1010試過寫入檔案的方法,想要避開修改obs-text的必要
結果測出來的效能非常悲劇,翻譯完後還需要3秒,OBS才會顯示
也許用ram disk可以解決吧 (用ram disk效能還是比shared memory差,使用者也很麻煩)

剪貼簿的方法,我沒有使用過,沒有數據
理論上不會快過我的方法,也不夠可靠訊息可能會丟掉


嘗試直接轉換成寫入SHM,不用memcpy (windows上的wchar_t是 ucs2-LE,utf16 LE subset)
dprint(type(self.translatePlotText))
翻譯string type為unicode,utf32-BE,似乎沒辦法直接轉成ctypes的type丟進去
得先經過encode(),那就乾脆轉完windows用的wchar_t,用memcpy

# dprint(self.translatePlotText)
# dprint(len(self.translatePlotText))
# dprint(repr(self.translatePlotText))
#python unicode = utf32-BE codepage 1201
#per python character = 4 byte
MultiByteToWideChar(12001, 0, self.translatePlotText, len(self.translatePlotText)*4, self.pBuf, 1024/2)


===
某些修正
googletrans.py:GoogleHtmlTranslator:translate: Could not find a suitable TLS CA certificate bundle, invalid path: F:\tool\Visual Novel Reader\Library\Frameworks\Python\lib\site-packages\certifi\cacert.pem
python -m pip install -U certifi
python -m pip install chardet
python -m pip install urllib3

留言

這個網誌中的熱門文章

OBS 抓不到畫面, 視窗, 遊戲擷取, 黑或白畫面, 當掉 ,卡住, black/white screen, window game capture, crash, freeze

優化實況(一) OBS設定 streaming settings

OBS plugin obs-text 顯示播放中音樂, display playing music