拥有一个能倾听你心声的「微信AI小助理」,是一种什么体验?

news2025/3/17 1:43:31

前两天,搞了个微信 AI 小助理-小爱(AI),爸妈玩的不亦乐乎。

  • 零风险!零费用!我把AI接入微信群,爸妈玩嗨了,附教程(上)
  • 零风险!零费用!我把AI接入微信群,爸妈玩嗨了,附教程(下)

有朋友问:平时不喜欢打字,发语音多方便,小助理能听懂语音么?

必须能!

这背后的用到的其实就是语音识别,之前的教程中猴哥也多次分享过。

不过在语音识别之前,我们还需要能正确接收语音并解码。

本次分享,将继续基于wechatbot-wehook框架,带大家实操:如何接收微信语音,并通过语音识别,让小爱听懂你的心声!

1. 接收微信语音

参考:https://github.com/foyoux/pilk

1.1 语音数据简介

我们先来简单认识一下语音数据:

通常,保存和传输的语音数据分为多个独立的 frame,每个 frame 开头两字节存储剩余 frame 数据的大小,每个 frame 默认存储 20ms 的音频数据。

我们正常使用的音频格式为 mp3/wav 等,而微信传输的音频均为Silk v3格式,这种格式占用空间非常小。

为此,处理过程中需要对二者进行转换:

  • SILK->PCM->MP3,这个过程叫做Silk v3的解码;
  • MP3->PCM->SILK,这个过程叫做silk v3的编码

你会发现:这两的转换需要一个中间格式 PCM。

1.2 微信音频转换

当你给小爱发送一段语音,后台接收到的文件就是 Silk 格式,文件名类似:message-666-audio.silcontent-typeaudio/silk

标准 SILK 文件,以 b’#!SILK_V3’ 开始,以 b’\xFF\xFF’ 结束,中间为语音数据。

微信语音在标准 SILK 文件的基础上,开头插入了 b’\x02’,去除了结尾的 b’\xFF\xFF’,中间不变。

为此,我们可以通过以下两步,对.sil文件进行解码。

step1: SILK->PCM

import av
import pilk

def convert_to_pcm(in_path='output/test.sil'):
    out_path = os.path.splitext(in_path)[0] + '.pcm'
    with av.open(in_path) as in_container:
        in_stream = in_container.streams.audio[0]
        sample_rate = in_stream.codec_context.sample_rate
        channels = in_stream.codec_context.channels
        with av.open(out_path, 'w', 's16le') as out_container:
            out_stream = out_container.add_stream('pcm_s16le', rate=sample_rate, layout='mono')
           for frame in in_container.decode(in_stream):
              frame.pts = None
              for packet in out_stream.encode(frame):
                 out_container.mux(packet)
    return out_path, sample_rate, channels

step2: PCM->MP3

def pcm_to_mp3(pcm_file, sample_rate=44100, channels=2):
    mp3_file = os.path.splitext(pcm_file)[0] + '.mp3'
    ffmpeg.input(pcm_file, format='s16le', ar=sample_rate, ac=channels)\
            .output(mp3_file)\
            .run(overwrite_output=True, quiet=True)

注意:上述步骤,需要依赖ffmpeg,一键安装指令如下:

sudo apt install ffmpeg
pip install ffmpeg-python

最后,我们来看下三种格式的文件大小:

du -h output/test.*
12K     output/test.mp3
96K     output/test.pcm
12K     output/test.sil

一段 3 秒左右的语音.sil大概有 12K!微信语音默认采样率为 16000,单通道。

2. 语音识别-ASR

语音识别简称 ASR,之前和大家过两款 ASR 项目,并部署实战过,这不就派上用场了?

  • FunASR
  • SenseVoice

实测效果SenseVoice更佳,这次我们就用它!

不过你无需本地部署,siliconflow 提供了免费调用的接口。

给大家贴下调用代码:

def asr_sensevoice(file_path="output/test.mp3"):
    url = "https://api.siliconflow.cn/v1/audio/transcriptions"
    headers = {
        "accept": "application/json",
        "Authorization": "Bearer xxx"
    }
    files = {
        "file": open(file_path, "rb"),  # The key "file" should match the expected parameter name on the server
        "model": (None, "iic/SenseVoiceSmall")  # "None" is used because model is just a string, not a file
    }
    response = requests.post(url, files=files, headers=headers)
    data = response.json()
    return data["text"]

3. 语音合成-TTS

如果你还期待能够合成语音返回,就得用到语音合成技术。之前和大家过几款最近爆火的 TTS 项目:

  • EdgeTTS
  • ChatTTS
  • CosyVoice

因为EdgeTTS底层是微软在线语音合成服务,无需本地部署,所以优先考虑。使用也非常简单,只需几行代码:

def tts_edge(text='', filename='output/tts.wav'):
    communicate = edge_tts.Communicate(text=text,
        voice="zh-CN-XiaoxiaoNeural", # zh-HK-HiuGaaiNeural
        rate='+0%',
        volume= '+0%',
        pitch= '+0Hz')
    communicate.save_sync(filename)

不过,wechatbot-wehook框架只支持发送音频文件,不支持发送语音到微信端侧直接显示。

先暂且搁置,等后续有空再进行二次开发。

4. 效果展示

给大家展示两个对话案例:

怎么样?

当作你口袋中的口语陪练,没问题吧?

写在最后

终于,又给小爱装上了耳朵不想打字,只想发语音的必备神器。

当然,小爱还有无限想象空间,下一篇打算把文件处理也接入进来。

大家有更好的想法,欢迎评论区交流。

如果本文对你有帮助,不妨点个免费的赞收藏备用。


为了方便大家交流,新建了一个 AI 交流群,欢迎感兴趣的小伙伴加入。

小爱也在群里,想进群体验的朋友,公众号后台「联系我」即可,拉你进群。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Django会话中的竞态条件

Django 会话中的竞态条件(race condition)问题通常发生在多个请求几乎同时修改同一个会话数据时,导致数据丢失或数据不一致。这种情况在需要频繁更新会话数据的场景(如实时聊天应用、并发请求处理等)中尤为常见。 1、问…

一次性解决 | 网站被提示“不安全 ”

当网站被提示“不安全”时,这通常意味着用户的个人信息、登录凭证和其他数据可能面临风险。为了一次性解决这个问题,可以从一下方面入手。 一、检查并启用HTTPS协议 检查URL:确保网站地址以“https”开头,而非“http”。HTTPS协议…

Java项目: 基于SpringBoot+mybatis+maven学科竞赛管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven学科竞赛管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简…

[Redis] 分布式系统与Redis介绍

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

研1日记6

1. 一般输入参数为batch_sizenum_featuresheightwidth 当高度和宽度不一样时,分别计算即可。 2.ReLU函数的表达式为:f(x) max(0, x)。 3.Pytorch中最大池化层Maxpool的作用说明及实例使用(附代码)-CSDN博客 4.假设x的形状是(A…

设计模式 第一次复学

创建者模式 单例模式(Singleton Pattern) 单例模式(Singleton)确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式实现分为两种饿汉式和懒汉式,即创建时机,一个是类…

衡石分析平台使用手册-系统指引

首页​ 首页是用户进入衡石系统后的第一个页面,这里汇聚了平台最新动态信息、行业模板案例、用户的操作记录等,引导用户快速方便地使用平台功能。 首页包括以下版块,可以帮助用户继续之前的工作,开启新的工作,使用内置…

Spire.PDF for .NET【文档操作】演示:创建 PDF 文档

通过代码创建 PDF 文档具有多种优势。例如,您可以轻松合并动态内容,如用户输入、数据库记录或实时数据。基于代码的 PDF 生成允许更大的自定义和自动化,最大限度地减少创建高度定制文档时的手动干预。在本文中,您将学习如何使用Sp…

A*(A star)搜索算法

A*搜索算法是一种启发式算法,利用现有的信息进行搜索的一种方法。 首先,定义横纵相邻方格之间的距离为10,对角相邻方格的距离为14(本文设定可以向8个方向前进,也可以根据需求设置为4个,比如只能横纵相邻方格…

简单的spring batch学习

前言 公司批量任务是数据库执行的,想修改成java执行批量任务,所以简单了解了下springbatch批量任务框架,此处是其学习笔记,具体学习视频地址为bilibili springbatch,以下为其学习笔记内容以及源码信息 一、课程目标 …

sobel_dir 方向图和sobel的一些想法

怎么使用呢! 1,通过方向图可以提取 直线 或水平线region区域,提出来的dirregion区域 2,通过sobel的幅度度,分割出变化剧烈的区域 fuduregion 3,两个region相交,可以准确定位幅度范围内方向的…

ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名

前言 当我们需要把本地开发的应用展示给外部用户时,常常会因为无法直接访问而陷入困境。 就为了展示一下,买服务、域名,搭环境,费钱又费事。 那有没有办法,让客户直接访问自己本机开发的应用呢? 这种需…

Qt信号和槽【2】

文章目录 1. 带参数的信号槽2. 信号和槽存在的意义3. 信号和槽断开连接4. lambda表达式定义槽函数 1. 带参数的信号槽 Qt的信号和槽也支持带参数。 当信号带有参数的时候,槽的参数必须和信号的参数一致,此时发射信号的时候,就可以给信号函数…

Material xxx SDF Material doesn‘t have _Stencil property

Unity 中导入第三方package后出现警告:Material xxx SDF Material doesnt have _Stencil property,原因是导入的库使用了TextMesh Pro组件,这时组件里的文本无法正常显示; 解决方法是导入两个包:TMP Essential Resour…

VScode 的简单使用

目录 1. VScode 的使用 1.1 常用插件 1.2 常用快捷键 1. VScode 的使用 1.1 常用插件 1.2 常用快捷键 也可以“ CTRLD ”;使用“CTRL滚轮”即可; ctrl /-,是用来展开/收起代码的; 比如:js 的多行注释是 shiftalt…

python的sqlalchemy使用@contextmanager来定义上下文管理器

Python通过函数名调用函数的几种场景 华为或超聚变服务器安装linux 你知道":“和”//"在python里面代表什么吗?这篇《python运算符》介绍,你肯定不想错过 SQLAlchemy通过contextmanager简化回滚操作 如何理解python的sqlalchemy这种orm框架&am…

某城user_dun,js逆向分析

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除! 前言 这次会简单的讲解…

Windows下Python和PyCharm的应用(三)__Numpy与矩阵

1、背景介绍 矩阵运算是Python语言的基石。 而支持矩阵运算的基础语言包就是Numpy。 参考链接: Python中Numpy的使用_numpy在python中的用法-CSDN博客 这篇博客介绍的numpy比我的这篇博客介绍的更加的详细。本博客只是根据本人 的实际应用,对最关键的…

scRNA-data中的R值

愿武艺晴小朋友一定得每天都开心 当我们测序拿得到各个样本中基因的表达值&#xff0c;就可以用基因表达值来表征样本间的相关性 代码如下&#xff1a; #样本间相似性&#xff1a;R值 相关性 捕获到的基因在两个样本间表达趋势一致性 exp_RNA <- AverageExpression(fasti…

[SDK]-组合框 和 列表框控件

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解组合框和列表框控件的相关知识 组合框 组合框由一个列表和一个选择字段,该列表显示用户可以选择的选项 创建组合框&#xff1a; CreateWindow(L"Combobox",//窗口类名L"",//标题C…