AI数字人对话之RealChar框架源码解读

零.功能介绍

与虚拟角色(非形象)进行文本或语音会话

  • 体验地址:RealChar.

  • 代码库:GitHub - Shaunwei/RealChar: 🎙️🤖Create, Customize and Talk to your AI Character/Companion in Realtime (All in One Codebase!). Have a natural seamless conversation with AI everywhere (mobile, web and terminal) using LLM OpenAI GPT3.5/4, Anthropic Claude2, Chroma Vector DB, Whisper Speech2Text, ElevenLabs Text2Speech🎙️🤖

一.整体架构

二.技术选型

  • Web: Vanilla JS, WebSockets

  • Mobile: Swift, WebSockets

  • Backend: FastAPI, SQLite, Docker

  • Data Ingestion: LlamaIndex, Chroma

  • LLM Orchestration: LangChain, Chroma

  • LLM: OpenAI GPT3.5/4, Anthropic Claude 2

  • Speech to Text: Local Whisper, OpenAI Whisper API, Google Speech to Text

  • Text to Speech: ElevenLabs

  • Voice Clone: ElevenLabs

三.安装方法

  • Step 1. 拉取代码库

git clone https://github.com/Shaunwei/RealChar.git && cd RealChar
  • Step 2. 安装依赖

    •  安装音频处理库portaudio和ffmpeg

    # for ubuntu
    sudo apt update
    sudo apt install portaudio19-dev
    sudo apt install ffmpeg
    # for mac
    brew install portaudio
    brew install ffmpeg
  • 安装其他python依赖库

pip install -r requirements.txt
  • Step 3. 第一次使用时创建空的sqlite数据库

sqlite3 test.db "VACUUM;"
  • Step 4. 升级db

alembic upgrade head
  • Step 5. 配置.env: 更新API Key及相关信息

cp .env.example .env

特别说明:由于用到了webrtc,要求使用https,故本地调试时需要安装证书。方法如下:

1.安装mkcert

brew install mkcert

brew install nss

nss 是可选的,如果不使用或者不需要测试 Firefox,那么可以不安装 nss。

2.生成证书,并加入系统信任

mkdir -p ~/.cert

mkcert -key-file ~/.cert/key.pem -cert-file ~/.cert/cert.pem "localhost"

mkcert -install

3.修改服务,加入证书

@click.command(context_settings={"ignore_unknown_options": True})

@click.argument('args', nargs=-1, type=click.UNPROCESSED)

def run_uvicorn(args):

    click.secho("Running uvicorn server...", fg='green')

    subprocess.run(["uvicorn", "realtime_ai_character.main:app",

"--host", "localhost", "--ws-ping-interval", "60", "--ws-ping-timeout", "60", "--timeout-keep-alive", "60", "--ssl-keyfile", "/Users/chenxiangli/.cert/key.pem", "--ssl-certfile", "/Users/chenxiangli/.cert/cert.pem"] +list(args))

  • Step 6. 通过cli.py或uvicorn启动服务

python cli.py run-uvicorn
# or
uvicorn realtime_ai_character.main:app
  • Step 7. 启动客户端:

    • 为了更好地会话内容,建议使用GPT4,建议使用耳机以避免回声

    • 启动浏览器打开网址:https://localhost:8000

  • Step 8. 选择一个角色进行对话

四.角色制作

1.角色记忆库与特征语音生成

角色特征分成两个部分:角色的记忆库文件和角色的语音。其中最重要的部分是角色的记忆库文件,它是在GPT的帮助下生成的。要创建一个角色,首先我们需要检查GPT的记忆库是否包含有关该角色的信息。如果有,整个过程将会容易得多。

(1)角色记忆库创建

我们可以包含许多不同类型的文件,但最重要的是一个CSV文件。

以下两个部分描述了创建洛基记忆文件的过程:

1.如何生成50个洛基演讲示例:
    提示词:Help me find 50 examples of how Loki from Marvel Cinematic Universe talks. I want to generate a format like "context", "quote". It needs to be in csv format. The quote should only include Loki's words, represent Loki's personality and how he talks, and be an actual quote from a movie or novel, not made up. The context should be unique.
    参考文件:https://chat.openai.com/share/73f29bc2-bbfe-43f1-a3a7-a3ce82a299c3
    格式确保有三列,以下是具体的格式参考:https://github.com/Shaunwei/Realtime-AI-Character/blob/main/realtime_ai_character/chacater_catalog/marvel_loki/data/talk.csv
2.如何生成描述洛基背景的文件:
    提示词1: Do you know Loki from Marvel movies?
    提示词2: Write me a simple system prompt for a new version of you to be Loki the character, and the new version of you can speak and sound like Loki. Tell it as first person. Here is a previous example for a character.
    提示词3: Refine and simplify it into 100 words.
    参考提示文件:https://chat.openai.com/share/a2a213c7-cb1e-441e-a651-129333fefb72

(2)角色特征语音合成(基于ElevenLabs)

a.收集数据

在开始之前,您需要语音数据。下载高质量的纯人声音频剪辑。training_data文件夹以供参考。

  • 如果您要创建自己的数据集,请确保音频是高质量的。应该没有背景噪音,发音清晰

  • 音频格式必须为 mp3,总长度约为 1 分钟

b.创建 ElevenLabs 账户

访问 ElevenLabs 创建账户。您需要它来访问语音合成和语音克隆功能。

获取您的 ELEVEN_LABS_API_KEY

  1. 单击个人资料图标并选择“个人资料”。

  2. 复制 API 密钥

c.语音合成/语音克隆

请按照以下步骤克隆语音:

  1. 进入语音合成页面。

  2. 单击“Add Voice”。

  3. 单击“Add Generative or Cloned Voice”。

  4. 单击“Instant Voice Cloning”。

  5. 填写所有必需的信息并上传您的音频样本。

  6. 单击“Add Voice”。

d.测试你的声音

要测试您刚刚创建的声音:

  1. 返回语音合成页面。

  2. 选择您刚刚在“设置”中创建的声音。

  3. 输入一些文本并单击“Generate”。

e.微调你的声音

您可以通过调整系统和用户提示来使语音朗读效果更好。以下是一些提示:

  • 如果声音太单调,请降低稳定性以使其更加情绪化。然而,将稳定性设置为零有时会导致奇怪的口音。

  • 较长的句子往往会说得更好,因为它们为人工智能扬声器提供了更多可以理解的上下文。

  • 对于说得太快的较短句子,请替换“。”和 ”...”。添加“-”或换行符以暂停。

  • 添加与情感相关的单词或短语,或使用标点符号,如“!”、“?”为声音添加情感。

f.在我们的项目中使用您的自定义声音

您需要克隆语音的语音ID。就是这样:

  1. 转到 Text To Speech - ElevenLabs

  2. 选择获取语音 api

  3. 按照说明操作并在 Responses 中找到特定的 voice_id。

  4. 不要忘记使用 ELEVEN_LABS_API_KEY 和语音 ID 更新您的 .env 文件。

2.角色生成

(1)角色信息目录结构

character_catalog
├── ai_character_helper
│   ├── data
│   │   ├── background
│   │   ├── xxx.md
│   ├── system
│   └── user
├── loki
...
  • 每个文件夹是一个AI角色,如:loki

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/548622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3.3 Ax=b 的完全解

一、Ax b 在求解 A x 0 A\boldsymbol x\boldsymbol 0 Ax0 时,我们将其转化成 R x 0 R\boldsymbol x\boldsymbol 0 Rx0,将自由变量赋予特殊值(1 或 0),主元变量即可通过回代求出。这个过程中我们没有关注右侧的 …

基于SpringBoot+Vue的在线教育系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了在线教育系统的开发全过程。通过分析在线教育系统管理的不足,创建了一个计算机管理在线教育系统的方案。文章介绍了在线教育系统的系统分析部…

Python基于Django的微博热搜、微博舆论可视化系统

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

【SLAM】在Win10上实现Nerf-Pytorch【GPU版】

文章目录 ReadMe安装依赖运行下载两个示例数据集:lego和fern训练一个低分辨率的Lego NeRF:训练一个低分辨率蕨类植物NeRF:更多数据集预训练模型可复现实现1、下载nerf-pytorch工程2、安装依赖3、下载数据4、运行lego NeRF:ReadMe Github链接 NeRF (神经辐射场)是一种在合成…

UE5 C++ 创建3DWidgete 血条 再造成伤害

一.创建 二.UI里声明变量 创建类 public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget")float CurrentHealth 100.0f;UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget"…

代码随想录算法训练营DAY24|C++回溯算法Part.1|回溯算法理论基础、77.组合、组合问题的剪枝操作

文章目录 回溯算法如何理解回溯算法回溯法模版回溯算法模版框架 77.组合树形结构回溯三部曲伪代码CPP代码实现 组合问题的剪枝操作 回溯算法 如何理解回溯算法 回溯法解决的问题都可以抽象为树形结构。 因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成…

mysql面试题 二

超键、候选键、主键、外键分别是什么? 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。候选键:是最小超键,即没…

【Altium Designer 20 笔记】PCB板框

Altium Designer中设置PCB板框 PCB板框位于Mechanical1层 点击放置中的线条或使用其他绘图工具来绘制板框, 可以绘制矩形、圆形或其他形状的板框,确保板框是闭合的 注意:在绘制板框时,确保线条的起点和终点相连,形成一个闭合的图形。 快捷键D…

【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一

目录 引言 1 -> C语言传统的处理错误的方式 2 -> C异常概念 3 -> 异常的使用 3.1 -> 异常的抛出和捕获 3.2 -> 异常的重新抛出 3.3 -> 异常规范 4 -> 自定义异常体系 5 -> C标准库的异常体系 6 -> 异常的优缺点 引言 在C编程中&#xff…

C++ | Leetcode C++题解之第32题最长有效括号

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestValidParentheses(string s) {int left 0, right 0, maxlength 0;for (int i 0; i < s.length(); i) {if (s[i] () {left;} else {right;}if (left right) {maxlength max(maxlength, 2 * ri…

单细胞分析|映射和注释查询数据集

reference映射简介 在本文中&#xff0c;我们首先构建一个reference&#xff0c;然后演示如何利用该reference来注释新的查询数据集。生成后&#xff0c;该reference可用于通过cell类型标签传输和将查询cell投影到reference UMAP 等任务来分析其他查询数据集。值得注意的是&am…

做一个好的程序员难吗?只需要这10个习惯

在这个世界上&#xff0c;有数以百万计的人对软件开发充满热情&#xff0c;他们有很多名字&#xff0c;如软件工程师、程序员、编码员、开发人员。一段时间后&#xff0c;这些人可能会成为一名优秀的编码员&#xff0c;并且他们将非常熟悉如何使用计算机语言完成工作。但是&…

【LeetCode】 2724. 排序方式

排序方式 给定一个数组 arr 和一个函数 fn&#xff0c;返回一个排序后的数组 sortedArr。你可以假设 fn 只返回数字&#xff0c;并且这些数字决定了 sortedArr 的排序顺序。sortedArr 必须按照 fn 的输出值 升序 排序。 你可以假设对于给定的数组&#xff0c;fn 不会返回重复的…

记录Python链接mysql的数据库的2种操作方式

一、使用pymysql库方式 import pymysqldb pymysql.connect(hostlocalhost,userroot,password123456) #创建链接&#xff0c;在3.8以后好像已经不支持这个种链接方式了&#xff0c; #db pymysql.connect(localhost,root,123456) cursor db.cursor()#拿到游标这样我们就拿到了…

DataX-Web,介绍-安装-部署-启动

使用文档&#xff1a;GitHub - WeiYe-Jing/datax-web: DataX集成可视化页面 目录 1、DataX-Web介绍 2、DataX-Web部署 3、DataX-Web启动命令 1、DataX-Web介绍 GitHub - WeiYe-Jing/datax-web&#xff1a;DataX集成可视化页面&#xff0c;选择数据源即可一键生成数据同步任务…

iOS依赖库版本一致性检测:确保应用兼容性

一、背景 在 iOS 应用开发的世界里&#xff0c;每次 Xcode 更新都带来了新的特性和挑战。最近的 Xcode 15 更新不例外&#xff0c;这次升级引入了对 SwiftUI 的自动强依赖。SwiftUI最低是从 iOS 13 开始支持。 这一变化也带来了潜在的兼容性问题。如果您的项目在升级到 Xcode…

使用 npm 工具高效更新项目依赖包

团队内部会用工具定时检查包的最新版本并通知&#xff0c;以便我们及时跟进社区进展&#xff0c;避免和技术栈出现版本脱节导致无法使用最新特性和优化内容 这里只说明手动查看和更新包的主要几个命令。 npm outdated&#xff1a;检查项目中过时的依赖包及其最新版本。 npm i…

在 Vue 2 中动态赋值 img 标签的 src 属性时显示为图裂

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

Java-通过Maven导入本地jar包的常用方式

1.首先创建一个用于创建jar包的项目&#xff0c;进行测试 2.测试成功后进行项目打包 3.创建一个要导入本地jar包的项目&#xff0c;在项目下创建lib目录&#xff0c;并将刚才打包好的jar包复制进去 4.在pom.xml文件中引入 5.运行测试

02-攻防世界PHP2

题目 authenticate:证明什么是真的 解题 观察题目可知&#xff0c;访问index.phps可能会有不一样的发现 http://61.147.171.105:51671/index.phps访问该链接&#xff0c;可以得到下面的界面 这里只显示出了部分代码&#xff0c;右键该界面&#xff0c;点击查看源代码&#xf…