腾讯云AI代码助手编程挑战赛-情声共鸣

一、项目背景

腾讯云 AI 代码助手是由腾讯云自研的一款开发编程提效辅助工具,开发者可以通过插件的方式将 AI 代码助手安装到编辑器中辅助编程工作(VS Code 或者 JetBrians 系列 IDE);而 AI 代码助手插件将提供:自动补全代码、根据注释生成代码、代码解释、生成测试代码、转换代码语言、技术对话等能力。通过腾讯云 AI 代码助手,开发者可以更高效地解决实际编程问题,提高编程效率和代码质量。

本文将详细介绍我将腾讯云的AI代码助手服务腾讯云的文字转语音服务相融合,结合前端框架和后端技术,一步一步搭建一个集成语音合成和情感分析的智能聊天机器人,包括我是如何提问的。(本人之前没有系统学习过前端,这个项目90%都是腾讯云AI完成的)

可以通过官网学习安装腾讯云AI代码助手,这里不再赘述:

点这里进入腾讯云 AI 代码助手官网

二、功能特点

这个项目主要是在一个初始项目上进行功能的添加,初始项目运行后可以进行基础的对话功能。在这个智能聊天机器人页面中,我增加了多个实用的功能,如下:

  • 💬 优化前端界面:使界面更加合理美观。
  • 🎤 文字转语音功能:将聊天内容转化为语音播放,增强互动性。(重点功能)
  • 📊 情感分析和可视化:分析用户输入的情感倾向,并以图表形式展示。(重点功能)
  • 💾 聊天记录本地存储:记录每一次聊天内容,方便日后查看。
  • 📥 聊天记录导出功能:用户可以将聊天记录导出为JSON文件进行保存。

三、名称由来

“情声共鸣”这一名称来源于作品的两个核心功能——文字转语音情感分析与可视化。在这个名字中,“情”代表了情感分析,体现了AI能够理解和捕捉用户情感的能力;“声”则指代文字转语音功能,强调AI通过声音与用户进行互动。而“共鸣”则是指情感的共鸣和反响,意味着AI不仅能理解用户的情感,还能通过语音与用户产生情感上的共振,使对话更加人性化、贴心。

这个名字充分表达了作品的目标——通过语音和情感分析的结合,打造一个与用户心灵深度连接的智能聊天体验。

四、技术栈

本项目涉及多种前端和后端技术的结合,具体技术栈如下:

  • 前端框架:Vue 3(为项目提供响应式界面)
  • 后端框架:Flask(用于情绪分析 API 和文本转语音服务)
  • 自然语言处理:Hugging Face Transformers 库(情感分析)
  • UI 组件库:TDesign Vue Next(美观的界面设计)
  • 状态管理:Vue Refs(用于管理状态)
  • 图表库:Chart.js(情感分析结果可视化)
  • HTTP 客户端:Axios(用于与后端进行数据交互)
  • 语音合成:腾讯云 TTS API(将文本转换为语音)

五、功能实现

接下来我将介绍我是如何一步步增加功能的

下面是初始代码

0ce88fe8b51843a4b72038346210c1ca.png

1.聊天记录本地存储

使用后我发现每次刷新,聊天记录都会丢失,因为聊天记录是被缓存在一个数组里的,为了实现能够查看历史记录,我决定询问腾讯云AI:

92cf7f60f3164fc0bba84073c5022d34.png

b4d657d1de924f609cb17b53df061f35.png

但是把修改代码后,出现了异常情况:
97a1833cb4c04f5aa65a3a52df001ce1.png

下面是 localstorage内容:

0f41afdddeea402aa488532f7309f338.png

于是我把localstorage复制给AI继续询问

1eabcdef3add4e5b91e72367171a19d4.png

根据AI的回答,我怀疑是存储流程的问题,于是我提出:

407c988335d44cbfa0aa87efa21a96f5.png

最后实现了存储效果:

26f256c9b1324cc4b8a162a76285cc39.png

然而在点击清除历史记录后,存在本地localstorage里的记录还没有删除,于是继续提问:

18c12e5c5e534902b94c0615d9eec2ad.png

替换代码后成功实现点击清除历史记录后,存在本地localstorage里的记录同时删除(除了第一条)。

第一个修改结束

2.优化前端界面

1)优化页面布局

在初始界面中,输入框是居中的,上面是聊天界面,下面是空白,显得整个页面头重脚轻,于是我题出把输入框放到页面底下。

dafddb067a1c49ebb820317f486a28d0.png

这里我还使用了代码助手的代码比较功能,可以直观地看出新旧代码的区别。

d72b0da6b54144438ade2409f508b358.png

实现效果如下:

d6c2dde6e26149b6a3587cdb24f713db.png

2)显示欢迎语句

在进入页面时显示欢迎语句,可以让用户有宾至如归的感觉

ee5caf8aa8e44ba2b664a186805d025a.png

根据AI提供代码修改后:

d9477d36de0a4aaeaab3b175d87635b9.png

3)可以显示对话时间

在初始的代码中,第一句对话时间是写死的,之后的对话时间用new Date().toDateString()表示,不符合普通中国用户的阅读习惯,我让AI进行修改,将时间转为中文:
3362bbebebcd41b3a06dd00ab87c24bb.png

下面是实现效果:
6f1b9794b315400abccce79cfb3b08eb.png

3.聊天记录导出功能

为了进一步完善用户体验,我决定加入导出聊天记录功能:

24b4f87ef1084e33921e5796c92af548.png

6bfd6d87081b4f079a0e9314c285cb45.png

替换代码后成功完成下载:

0869a2a985c94a32b681501907b1a882.png

8e858e57782f42eda67bfb1414d4f86f.png

但这按钮实在是太丑了:
3f80cc86346e4ac58cd253212484d4ad.png

修改后还可以接受:
e397f5aebd804d7b8f412af083cc34b4.png

4.文字转语音功能

为了丰富用户的体验,我决定加入重磅功能,用腾讯云的文字转语音服务和我的项目相结合,实现文字转语音功能。

我初步计划使用Python程序作为后端,vue发送请求到后端,后端再去调用腾讯云api。

1)实现过程

我把腾讯云官方的接口文档也发给了代码助手,下面是提供的代码:

44034e2014c344c48b131157bad822ea.png

d0be38a39c554bb8a2c1a9fea56c3887.png

在这里我省去了中间调试的过程(不然图片实在太多了),因为运行后难免有些报错,我不停把报错信息复制给AI,在跟着AI的建议一直修改后,我实现了下面的效果。

723e9cfcc65e4cff912821fd1af6febe.png

3e0ab88048b64b0b949ac21e30878c70.png

具体的声音效果请参见我发布的演示视频:腾讯云AI代码助手编程挑战赛-“情声共鸣”演示视频-CSDN直播

2)技术解析

1. Flask框架

Flask 是一个轻量级的 Python Web 框架,用于快速构建 Web 应用。在本项目中,Flask 被用作后端框架,负责接收来自前端的 POST 请求,调用腾讯云的文字转语音(TTS)API,并返回语音数据。

  • request.json: 用于解析接收到的 JSON 格式的请求数据。这里提取了 text 字段,代表要转换为语音的文本内容。

  • jsonify: 用于将 Python 字典或列表转换为 JSON 格式并发送到前端。当请求缺少文本或者发生异常时,返回适当的错误信息。

2. CORS

  • CORS(app): 允许跨域资源共享,解决了浏览器因同源策略阻止跨域请求的问题。在实际开发中,前端和后端可能会部署在不同的域名或端口上,启用 CORS 可以使前端与后端顺利进行数据交互。

3. 腾讯云 TTS API

腾讯云的文字转语音服务 (TTS) 可以将文本内容转换为语音,并返回音频数据。在该项目中,调用腾讯云 TTS API 将输入的文本合成语音,返回音频流给前端。

核心流程:

  • 腾讯云认证:使用腾讯云的 API 密钥(AKIDSecretKey)来进行身份验证。这里的 credential.Credential 是用来创建认证信息的关键类。

  • 配置 HTTP 连接

    • httpProfile.endpoint = "tts.tencentcloudapi.com":设置腾讯云 TTS 服务的 API 端点地址,确保请求能够发送到正确的服务。

  • 创建 TtsClient 客户端

    • 使用 ClientProfile 来配置客户端,包括 HTTP 配置信息。

    • TtsClient 是实际与腾讯云 TTS API 进行交互的客户端类。

请求参数:

  • Text: 要转换为语音的文本。

  • VoiceType: 指定语音的类型,这里使用的是 ID 为 101018 的语音模型。腾讯云提供了多种语音模型,包括男性、女性等不同类型。

  • Codec: 设置输出音频的编码格式,这里选择了 mp3 格式。其他支持的格式可能包括 wav

  • SessionId: 会话 ID,可以用来标识不同的转换请求,帮助用户进行跟踪和记录。

语音合成:

  • TextToVoiceRequest: 构建一个请求对象,将文本和相关参数传递给 API。

  • req.from_json_string(json.dumps(params)): 将请求参数转化为 JSON 格式,然后填充到 TextToVoiceRequest 对象中。

  • client.TextToVoice(req): 发送请求并等待响应,resp 对象包含了音频数据。

  • resp.Audio: 这是腾讯云返回的音频数据,它是以二进制格式存储的音频流,可以直接发送给前端。

错误处理:

  • 使用 try-except 语句捕捉异常,确保即使发生错误时,系统也能返回适当的错误信息,避免服务崩溃。

4. 音频返回与前端交互

  • 返回音频数据:语音合成成功后,通过 Flask 的 return audio_data, 200, {'Content-Type': 'audio/mpeg'} 将合成的音频数据以 audio/mpeg 格式返回。200 表示成功的 HTTP 状态码,Content-Type: audio/mpeg 告诉前端这是一段音频文件。

    • 前端收到后,可以通过 <audio> 标签或其他音频播放方式播放音频。

5.情感分析和可视化

由于通过实时监测和显示用户的情绪曲线,可以让用户感觉到AI更加智能和贴心。用户可以看到自己的情绪变化,并与AI进行更有趣的互动。另外,根据用户的情绪波动,AI可以调整响应方式。例如,当用户情绪低落时,AI可以提供安慰或者更温和的语言;当用户情绪高涨时,AI可以更加活跃和积极回应,从而使对话更加人性化。

我计划添加“查看情绪曲线”按钮,实现情感分析和可视化功能:

1)初步完成曲线

d15bc8fd51c145a39ac620933b03b25e.png

8e9a5f4ad18e4443b223fa2bc2a28711.png

但是运行后发现,曲线的各点始终是0.0,询问AI:

64ba86836fe44730abb5522801756064.png

更改情绪算法后,完成初步的情绪曲线:

5f808d111fc440e682f1587b16f157a7.png

2)修改为浮动窗口

目前的实现方式太占页面,把对话界面都顶到下面去了,我这个项目的重点应该是对话界面,所以我打算把曲线作为浮动窗口显示。

1d0c9987cbd1445da5c91733114292be.pnga1bc612471d74b65b7130158b6977ec3.png

应用后,成功实现了浮动效果:

2e0f2c5e7413421ea67f6930fac434fe.png

3)优化情绪算法

我打算进一步打磨情绪算法

3bd81b72b28043a2a3f7180779e3b400.png

根据AI的建议,我最终选择了hfl/chinese-roberta-wwm-ext这个模型:hfl/chinese-roberta-wwm-ext 这个模型非常适合用于中文情感分析任务。它在中文文本处理上具有很好的性能和鲁棒性,能够提高情感分析的准确性。

d1a08070a09c42868f12af6bffaeff69.pnge9d29e59e04240d1af1dd770d9c793b4.png

现在对情绪的识别有显著提升。

4)技术解析

以下是对该功能的完整技术解析:

1. Flask框架

  • Flask 是一个轻量级的 Python Web 框架,常用于快速构建小型的 web 应用和服务。在这个项目中,Flask 被用作后端框架,负责处理来自前端的请求,并将情感分析的结果返回给前端。

  • request: 用于从前端获取数据。在这个应用中,request.json 用于获取前端传递的 JSON 数据,包括聊天记录(chatHistory)。

  • jsonify: 用于将数据结构(如字典、列表等)转换为 JSON 格式,并作为 HTTP 响应返回给前端。

  • CORS: CORS 是跨域资源共享(Cross-Origin Resource Sharing)的缩写,允许前端与后端进行跨域请求。这对于前端和后端部署在不同服务器上的情况非常重要。在本项目中,CORS 使得前端(可能使用 Vue 3 等框架)可以访问后端的 API。

2. BERT模型与分词器

  • BERT(Bidirectional Encoder Representations from Transformers)是一个基于 Transformer 的预训练语言模型,通过对大量文本数据进行预训练,能够捕捉上下文信息和语言的深层次关系。本项目使用的是 RoBERTa 变种,即 hfl/chinese-roberta-wwm-ext,专门针对中文文本处理进行优化。

  • Tokenizer:

    • BertTokenizer.from_pretrained('hfl/chinese-roberta-wwm-ext'): 这个步骤加载了 RoBERTa 模型的分词器。分词器的作用是将输入文本转换为模型可以理解的数字化格式(token)。例如,将中文文本切分成子词或字符,并为每个子词分配一个唯一的编号。

    • 在代码中,tokenizer(message['content'], return_tensors='pt', truncation=True, padding=True) 对每条用户输入的消息进行编码,处理文本的截断(truncation=True)和填充(padding=True),确保每条输入的长度一致,适合输入到模型。

3. 情感分析

  • 情感分类模型:

    • BertForSequenceClassification.from_pretrained('hfl/chinese-roberta-wwm-ext'): 这一步加载了预训练的 RoBERTa 模型,它已经在大量中文文本数据上进行了训练,能够执行如情感分析、文本分类等任务。加载的模型是专门用于文本分类的变种,可以根据输入文本输出情感分类的标签或分数。

  • 情感得分计算:

    • outputs.logits: 在执行推理时,模型返回的是 logits,即未经过归一化的预测分数。这些分数表示文本属于各个类别的可能性。

    • torch.softmax(outputs.logits, dim=1): softmax 函数将 logits 转换为概率分布,表示每个类别的预测概率。在情感分析中,假设 1 代表正面情绪,0 代表负面情绪,那么 outputs.logits 中的第二个位置(即 outputs.logits[0][1])即为正面情绪的概率。

    • sentiment_score = torch.softmax(outputs.logits, dim=1)[0][1].item(): 从模型输出的结果中获取正面情绪的概率,并通过 .item() 方法将其从张量转换为 Python 数值类型(float)。

4. API设计

  • 情感分析接口 (/api/analyze-emotion):

    • 该接口采用 POST 方法,接收一个包含聊天历史记录(chatHistory)的 JSON 请求。每条消息包含以下信息:

      • role: 消息的角色,可能是 usersystem

      • content: 消息的文本内容。

      • datetime: 消息发送的时间戳,用于在返回结果中展示每条消息的情感分析时间。

  • 情感分析数据的返回:

    • 后端通过循环处理每条用户输入的消息,并调用预训练的 RoBERTa 模型进行情感分析,最后将每条消息的情感得分(sentimentScore)和时间戳(timestamp)返回给前端。返回数据格式为 JSON,前端可以根据这些数据来展示用户的情感波动。

5. PyTorch与Tensor处理

  • PyTorch: 是一个开源的深度学习框架,用于训练和推理。它支持 GPU 加速,在这个项目中被用于执行 BERT 模型的推理任务。

  • torch.no_grad(): 在进行推理时,我们不需要计算梯度,因此可以通过 torch.no_grad() 来禁用梯度计算,以节省内存和计算资源。

六、代码评审

到这里,新增功能已经全部做完,最后我使用腾讯云AI的代码评审功能,最后检查一下我的代码:

cecfdcdf31d540c39b1a01b056b3f360.png

2e122d3826c849eba2f9f4314aa34ceb.png

464548fe10a5445b9c953a79169b0491.png

鼠标在代码上停留就能查看评审结构,确实写的不错,但是我都懒得改了(代码能跑就行)。

七、生成单元测试

我对项目的核心功能做了单元测试,生成的方式也很简单,选中想测试的代码后右击,选择生成单元测试就行:

36e7dcb2366945499bbecd5556d628f0.png

八、总结

以上的修改90%都是腾讯云AI代码助手实现的,另外还提供了这些功能:智能补全代码信息,精准修复错误代码,清晰解释既有代码,按需生成单元测试,人工智能技术对话,按RAG知识库查询。

腾讯云AI代码助手作为一个idea里的插件,在使用AI时不用在浏览器和idea之间来回切换,也不用把代码粘贴来粘贴去,可以在idea里完成一站式编程,极大地提高了编程的速度。

以下这几个操作是我最常用的:

在使用过程中先选中代码,然后再在右边对话框输入问题,这样可以让AI读到你的代码,如下:

c00c902aee884146aa3460c08ba3aa90.png

然后就是使用RAG知识库回答,选择对应的知识库后,回答准确率有明显提高:

73d4e3daf870463a8a89b5f2b41872d9.png

39b57f83d6114fde87512e8c032ec2a1.png

另外,在选择一段代码后右键,可以进行对选中代码的一系列问答:

7eac6a12857d41c8834354934bf6e84a.png

以下是最终的项目演示视频。腾讯云AI代码助手编程挑战赛-“情声共鸣”演示视频-CSDN直播

九、使用方法

我已经把我的项目发送到gitee,有兴趣可以下载下来看看:yfjgvh/TD-AI

注意阅读我的README.md文件,里面有如何运行我的项目的详细说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值