Giter Site home page Giter Site logo

voine / chatwaifu_mobile Goto Github PK

View Code? Open in Web Editor NEW
1.2K 21.0 125.0 425.12 MB

移动版二次元 AI 老婆聊天器

License: MIT License

Kotlin 2.38% CMake 0.89% C 8.66% C++ 87.12% Objective-C++ 0.65% Objective-C 0.01% Metal 0.08% Java 0.20% AIDL 0.01%
android chatgpt live2d vits compose sherpa lipsync

chatwaifu_mobile's Introduction

ChatWaifu_Mobile

年轻人的第一个移动版老婆聊天器(雾

简介

Android 手机版的 ChatGPT 二次元聊天器。
目前内置如下模型,会自动播放 ChatGPT 的回复,由于内置为日语模型,其他语言的播放效果可能相当一言难尽, 可以替换增加本地模型。

模型1: 语音和模型均来自 Blue Archive 优香。
模型2: 语音和模型均来自命运石之门牧濑红莉栖 - Amadeus 限定,β 世界线警告 :).
模型3: 语音和模型均来自 ANIPLEX 的作品 ATRI -My Dear Moments- 的主角亚托莉

  • 语言大模型来自 GhatGPT
  • 语音推理为客户端本地 VITS - ncnn
  • 图形渲染基于 Native Live2D
  • 语音输入识别为客户端本地 Sherpa - ncnn
  • UI 框架为 Jetpack Compose
  • 项目结构为 Retrofit + MVVM + LiveData/Flow + Room
  • 多个 ncnn 库似乎是进程独享资源,使用 AIDL 做进程间通信
  • 嘴形同步接入了 Native 版 meta - lipSync
  • 接了 baidu 翻译功能,如需则自行设置 appid 和 key,不需要可在 setting 页面关闭翻译功能

关于 ChatGPT

OpenAI Key 地址,将其输入登录页面的 Chat Key 部分就行,本地会缓存。

关于移动端 VITS

详见这里

关于 Live2D

使用基于 Native C++ 的原生版本,详见这里

关于语音识别输入

使用 Sherpa-ncnn ,详见这里

关于嘴形同步

接入了 Native 版 meta-lipSync,详见这里
注:不过由于 LipSync 在实际使用中发现会有时长同步/映射等等问题,太过麻烦,目前只是播一个循环动画

关于模型替换

VITS 模型

首先,模型需要参照这里,转成 ncnn 的版本,成功后会生成一个 config.json 以及很多的 bin 文件。将它们统一放在手机文件管理内 chatwaifu/vits/ 目录下,放完后整个目录是这样的:

文件管理:
├─chatwaifu
     ├─ vits
         ├─ yourModel
              ├─ config.json
              ├─ xxxx.bin
              ├─ xxxx.bin
              ├─ .....

Live2D 模型

支持官方标准的 Live2D 格式,需要将它们放在手机文件管理内 chatwaifu/live2d/ 目录下,放完后整个目录是这样的:

文件管理:
├─chatwaifu
     ├─ live2d
         ├─ yourModel
              ├─ yourModel.model3.json
              ├─ xxx.moc3
              ├─ xxx.exp3.json
              ├─ .....

注意

  • live2d 模型的名字与需要与 vits 模型的目录名一致,Live2D 的 model3.json 要和目录名一致
  • 如果你的 VITS 模型是多人混合的,需要在 Setting 页面指定 Speaker ID, 不指定默认为 0

关于翻译

设置后会默认将 GPT 输出的语言翻译成日文交给 VITS,否则内置的模型说别的语言可能基本不出声...
接了 baidu 翻译,可以免费申请一个开发者账号 这里 ,将申请到的 appid 和 密钥填到登录页的第二第三栏,或者在左上角菜单里选取 setting ,进行更改就行了

关于角色设定

目前每个模型都有内置的设定,外部导入的模型可将设定填写到 Setting 页面的 External Setting 部分

示例图

免责声明

1、模型禁止商用!

2、不可将本软件用作任何非法用途,后果自负

鸣谢

感谢 @weirdseed 大佬实现的 Android 版 VITS !

说明视频

https://www.bilibili.com/video/BV1w24y1K799/

chatwaifu_mobile's People

Contributors

ggddbb avatar voine avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chatwaifu_mobile's Issues

GPT聊天的时候报错javax.net.ssl.SSLHandshakeException

我用andriod studio编译的,用几个不同模拟器测试的,都类似的错误
报错如下:
javax.net.ssl.SSLHandshakeException: SSL handshake aborted: ssl=0xecccb848: I/O error during system call, Connection reset by peer

我想问一下下这个问题是怎么解决的?
我们标准的ANDRIOD 版本和 JDK的版本这些都是用的哪套?

kotlin语法错误

const val SAVED_CHAT_KEY = "saved_chat_key"
这个带有const和val的定义是不正确的,应该只使用其中一个关键词。
根据Kotlin的定义:

  • const用于定义编译时常量,相当于Java的public static final。const定义的常量在编译时会被替换为其字面值。
  • val用于定义只读变量,相当于Java的final变量。val定义的变量会被赋一个初始值,之后不能再被修改。
    所以,const和val都是用于定义不可变的值,但const是在编译时 replaced,而val是在运行时 assigned 一次初始值。

chatGPT response empty,不清楚是哪里出了问题

对话框输入msg,只会跳出弹窗提示“Error occur..chatGPT response empty";
代理应该没有问题,同网络环境下登录网页版的chatGPT是可以正常使用的;
怀疑是API key有问题?但显示API key确实有被调用过,并确认肯定是该软件;

(x_x) 求大佬们的解答,谢谢!

求设定词

您好,我想将amadeus移植到自己的qq机器人上,请问我可以参考你们amadeus的模型设定词吗?

请问为什么会有这个报错呢?java.lang.UnsatisfiedLinkError: dlopen failed: library "liblipsync.so" not found

FATAL EXCEPTION: main
Process: com.chatwaifu.mobile, PID: 8355
java.lang.UnsatisfiedLinkError: dlopen failed: library "liblipsync.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1077)
at java.lang.Runtime.loadLibrary0(Runtime.java:998)
at java.lang.System.loadLibrary(System.java:1661)
at com.chatwaifu.lipsync.LipSyncJNI.(LipSyncJNI.kt:37)
at com.chatwaifu.mobile.utils.LipsValueHandler.(LipsValueHandler.kt:62)
at com.chatwaifu.mobile.ChatActivityViewModel$lipsValueHandler$2.invoke(ChatActivityViewModel.kt:79)
at com.chatwaifu.mobile.ChatActivityViewModel$lipsValueHandler$2.invoke(ChatActivityViewModel.kt:78)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at com.chatwaifu.mobile.ChatActivityViewModel.getLipsValueHandler(ChatActivityViewModel.kt:78)
at com.chatwaifu.mobile.ChatActivityViewModel.initModel(ChatActivityViewModel.kt:151)
at com.chatwaifu.mobile.ui.channellist.ChannelListFragment.onViewCreated(ChannelListFragment.kt:80)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3128)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1433)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2977)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2888)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3129)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1899)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1823)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1729)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:323)
at androidx.fragment.app.FragmentContainerView.(FragmentContainerView.kt:158)
at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:53)
at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:136)
at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:248)
at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:227)
at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1073)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1001)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:965)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1127)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088)
at android.view.LayoutInflater.inflate(LayoutInflater.java:686)
at android.view.LayoutInflater.inflate(LayoutInflater.java:538)
at com.chatwaifu.mobile.databinding.ContentMainBinding.inflate(ContentMainBinding.java:45)
at com.chatwaifu.mobile.ui.base.ComposableSingletons$ChatWaifuMainContentKt$lambda-1$1$1.invoke(ChatWaifuMainContent.kt:86)
at com.chatwaifu.mobile.ui.base.ComposableSingletons$ChatWaifuMainContentKt$lambda-1$1$1.invoke(ChatWaifuMainContent.kt:86)
at androidx.compose.ui.viewinterop.AndroidViewBindingKt$AndroidViewBinding$viewBlock$1$1.invoke(AndroidViewBinding.kt:83)
at androidx.compose.ui.viewinterop.AndroidViewBindingKt$AndroidViewBinding$viewBlock$1$1.invoke(AndroidViewBinding.kt:79)
at androidx.compose.ui.viewinterop.ViewFactoryHolder.(AndroidView.android.kt:314)
at androidx.compose.ui.viewinterop.AndroidView_androidKt$createAndroidViewNodeFactory$1.invoke(AndroidView.android.kt:247)

Working without translate or use global translate service

I can't use this app, because the translate appid and key setting is issue only Chinese.
I was try to the set the option for empty, but the app dose not working.
How about use global translate, like google translator?
Or, please add check box ui for disable translator to input some text that translated Japanese.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.