HIllya51 / LunaTranslator

Galgame翻译器,支持HOOK、OCR、剪贴板等。Visual Novel Translator , support HOOK / OCR / clipboard
http://docs.lunatranslator.org/
GNU General Public License v3.0
4.7k stars 236 forks source link

请问有没有想法实现TTS自动朗读区分旁白(地の文)与主人公的语音? #304

Closed luojunyuan closed 1 year ago

luojunyuan commented 1 year ago

就是带名字的文本不读,没有名字的文本阅读。 vnr的TTS会有一个小窗口会自动弹出新出现的人名,在人名后面可以选择某一虚拟vocal。 实际上我不知道vnr是怎么实现的。。不过即使是vnr也不是所有游戏都支持这一功能的样子。 似乎也是一很大的工程,很抱歉擅自提feature。

参考链接 https://youtu.be/lxM9lwgplAo?t=417 https://github.com/hanmin0822/MisakaTranslator/issues/166

HIllya51 commented 1 year ago

原本是有这个功能的,后面被我删掉了。 https://github.com/HIllya51/LunaTranslator/commit/486e6c0f1089cca7c7d088fca5754ed5efe8e955 最后一个还有这个功能的版本在这个tag下,不过只有源代码了 https://github.com/HIllya51/LunaTranslator/releases/tag/v2.13.0

luojunyuan commented 1 year ago

似乎整个都删掉了,是因为打乱了架构吗?看起来还是相当多内容的。有空我会编译尝试一下。

HIllya51 commented 1 year ago

从读控制台改成自己用纯python实现的host了。其实要兼容原来的也可以,但我懒得弄。。。 https://github.com/HIllya51/LunaTranslator/blob/main/LunaTranslator/LunaTranslator/textsource/hook/host.py

luojunyuan commented 1 year ago

host确实要优异很多,可以操作的空间更大,我今天看了一天的wine下hook和主机交互的方法,luna的代码也让我参照了很多🙇,

这个库原本是贴吧的lgztx老哥pipe导出textractor函数的库,原本是使用无视架构的第三方注入工具,我为了兼容arm64平台还是把它改成了单独进程注入了。感觉不仅减少依赖也简单了不少。(我不会c++。最熟悉的语言还是csharp) https://github.com/ErogeHelper/texthost/blob/0070fc9bc17b3831198cc072cd7499410cdf5aa8/texthost/host.cpp#L247 https://github.com/ErogeHelper/texthost/blob/master/Injector/Injector.cpp

我还想自己按需要修改一下texxtractor,果然还是之前在kf提到过的,

  1. 想要附加进程但不自动注入match里的钩子,而是可以选择全部注入或者只注入指定的某一个。(似乎现在首次注入必然会注入一排钩子,只能事后出现一个文本线程unhook一个)
  2. 另设timeout,文本flush的事件消息。

不过没有看过hook部分代码。希望不会很困难,我想要还原vnr的功能,对内嵌也很有兴趣虽然完全不了解。还有它的服务器功能(我在知道vnr这个软件的时候vnr已经似了俩年了),如果还能够请教你就好了,很高兴有能够互相交流的国人同好。

tts确实,只能说算不上是什么优先事项,有兴趣和时间后再谈吧~ 我对py代码也比较头皮发麻,曾经为了vnr接触过qml1和pyside1。感觉很多功能也不是难实现而是更需要时间像板砖一样苦力活了。

HIllya51 commented 1 year ago

不是很懂arm。。。 如果你要右键菜单启动游戏同时注入,可以试试用detour,DetourCreateProcessWithDllExW,魔改一下也能同时加载localeemulator和texthook。。。不过还是额外用个注入器比较简单,我也是这样做的。。。 想要不注入指定的钩子,只能改texthook,比如共享内存一个结构体里面存每个钩子要不要之类的,然后在InsertXXXHook里面判断要不要之类的,感觉好麻烦,没什么意义。。。 内嵌就是和普通提取多了一个在提取之后等候翻译完成的event,然后把翻译写到共享内存里面resetevent提醒翻好了,然后游戏那边把共享内存里的结构读近来替换掉就行了,其实也没很复杂。。。 不太懂vnr服务器有啥功能,没用过。。 好的呢,有问题可以问我,可以多交流。。。

HIllya51 commented 1 year ago
  1. 想要附加进程但不自动注入match里的钩子,而是可以选择全部注入或者只注入指定的某一个。(似乎现在首次注入必然会注入一排钩子,只能事后出现一个文本线程unhook一个)

https://github.com/fauu/Textractor-HookAllowlist