适合谁看:资深的嵌入式系统底层专家。技能栈(C、SoC、Bootloader、驱动、系统移植、DSP优化、Cache调优、功耗分析)是芯片设计的核心和基础,具备从硬件(SoC) 到底层固件(ROM Bootloader)再到操作系统层(驱动、RTOS)的全栈知识和实战经验,希望向嵌入式场景的AI部署方向拓展,寻求新的发展空间。
第二天。尽管看到现在行业还在为本地量化部署发愁,但还有一种基本的感觉,
多模态llm放在产品上也是早晚的事
现在政策层面推行的AI+肯定不能像早期的智能产品那样套上触控显示就交差,必须有真正新质的东西拿出来。最直接的就是第六代交互——无感知交互。
- 第一代:大型计算机 - 打字;
- 第二代:GUI和网页 - 点击工具;
- 第三代:智能手机 - 触摸屏幕;
- 第四代:混合现实(mixed reality)- 语音对话,手势,眼睛互动
- 第五代:脑机接口 - 注意力
- 第六代:分布式AI - 无感知
第四代方式至少使用有二十年了,但语音对话和眼睛互动似乎还是相对不便捷。目前的交互方式偏重于视觉,总是需要使用者看着屏幕,用图像或者视频作为信息媒介,这种交互方式意味着产品需要一块屏幕,而且得是触控的,不过似乎也没什么好展示的,于是就放了没那么有用的数据面板,把所有产品都变成了彩电。
但是说实话,咱们现在用眼实在太多了,总体上感觉就是感官负载失衡。服务器还讲个负载均衡呢,小小的老子们就不能把信息分摊到各种感官嘛。眼耳鼻舌身,对应视听嗅味触,五个信道分摊现在的视觉信息,不仅眼睛舒服了,感受也更立体了,也许感官失衡带来的欢愉后的失落也没那么强烈了,人们的生活也越来越充实。
换个角度。机器是服务人的,人就不应该被交互方式约束。不必拘泥什么屏幕触控,也不必因为脑机接口的稀缺性而觉得仍有几十年的路要走。也许脑机接口尚未普及的时候,下一代交互技术就已经成熟并大面积铺开了。毕竟第六代交互技术连注意力都不需要,它就在那里,默默地服务着你。
反正本地部署怎么也达不到云端的性能的。llm出来这么久,免费的纯文本甚至语音的对话应用早就唾手可得了,多模态llm放在产品上也是早晚的事。先搞个云交互,然后借助云端的多模态模型调试产品,基本成熟之后再说部署的事。
这里放一点代码,功能是使用千问的API实现文字-语音对话,这里本地没做语音采集,因为暂时还不需要。云端是多模态大模型,返回文本和音频。模型倒是挺多,但是我们需要的是全模态的,好像就三四个,随便选一个,启用,然后从控制台获取API-KEY,设置环境变量,或者自己改下面的python脚本也行。
client = OpenAI( api_key=os.getenv("QWEN_API_KEY"), # 确认已配置环境变量
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", )
运行前的准备工作——运行下列命令安装第三方依赖
pip install numpy openai soundfile sounddevice
需要import的模块还不少呢
import os
import base64
import io
import wave
import soundfile as sf
import numpy as np
from openai import OpenAI
import sounddevice as sd
import soundfile as sf
1. 初始化客户端
client = OpenAI(
api_key=os.getenv("QWEN_API_KEY"), # 确认已配置环境变量
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
2. 发起请求
try:
completion = client.chat.completions.create(
model="qwen3-omni-flash",
messages=[{"role": "user", "content": {user_input}}],
modalities=["text", "audio"], # 指定输出文本和音频
audio={"voice": "Cherry", "format": "wav"},
stream=True, # 必须设置为 True
stream_options={"include_usage": True},
)
3. 处理流式响应并解码音频
print("模型回复: ")
audio_base64_string = ""
for chunk in completion:
# 处理文本部分
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
# 收集音频部分
if chunk.choices and hasattr(chunk.choices[0].delta, "audio") and chunk.choices[0].delta.audio:
audio_base64_string += chunk.choices[0].delta.audio.get("data", "")
print("\n")
4. 处理音频
if audio_base64_string:
wav_bytes = base64.b64decode(audio_base64_string)
audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
sd.play(audio_np, samplerate=24000)
sd.wait()
# sf.write("audio_assistant.wav", audio_np, samplerate=24000)
# print("\n音频文件已保存至:audio_assistant.wav")
完整代码:
# 运行前的准备工作:
# 运行下列命令安装第三方依赖
# pip install numpy openai soundfile sounddevice
import os
import base64
import io
import wave
import soundfile as sf
import numpy as np
from openai import OpenAI
import sounddevice as sd
import soundfile as sf
# 1. 初始化客户端
client = OpenAI(
api_key=os.getenv("QWEN_API_KEY"), # 确认已配置环境变量
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
while True:
print("初始化完成,可以开始对话\n")
user_input = input("你: ")
# 2. 发起请求
try:
completion = client.chat.completions.create(
model="qwen3-omni-flash",
messages=[{"role": "user", "content": {user_input}}],
modalities=["text", "audio"], # 指定输出文本和音频
audio={"voice": "Cherry", "format": "wav"},
stream=True, # 必须设置为 True
stream_options={"include_usage": True},
)
# 3. 处理流式响应并解码音频
print("模型回复: ")
audio_base64_string = ""
for chunk in completion:
# 处理文本部分
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
# 收集音频部分
if chunk.choices and hasattr(chunk.choices[0].delta, "audio") and chunk.choices[0].delta.audio:
audio_base64_string += chunk.choices[0].delta.audio.get("data", "")
print("\n")
# 4. 处理音频
if audio_base64_string:
wav_bytes = base64.b64decode(audio_base64_string)
audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
sd.play(audio_np, samplerate=24000)
sd.wait()
# sf.write("audio_assistant.wav", audio_np, samplerate=24000)
# print("\n音频文件已保存至:audio_assistant.wav")
except Exception as e:
print(f"请求失败: {e}")