保存时间:2026/4/3 01:33:24
pip install speechrecognition pyaudio requests volcengine - python - sdk。然后写 Python 脚本,用 SpeechRecognition 录语音转文字,再调用豆包 API 传文字拿回复。核心代码大概这样:import speech_recognition as sr
import requests
from volcengine.api import ApiClient, Config
# 初始化语音识别和豆包 API 客户端
r = sr.Recognizer()
config = Config(region="cn - beijing")
client = ApiClient(config=config)
def voice_to_text():
with sr.Microphone() as source:
print("请口述请求:")
audio = r.listen(source)
try:
text = r.recognize_google(audio, language='zh - CN')
print(f"识别到:{text}")
return text
except:
return "识别失败"
def call_doubao_api(prompt):
try:
response = client.post(
"/v1/doubao/generation",
body='{"prompt":"%s","max_tokens":150}' % prompt,
headers={"Content - Type": "application/json"}
)
return response.json()['choices'][0]['text']
except Exception as e:
return f"调用失败:{e}"
if __name__ == "__main__":
prompt = voice_to_text()
if prompt != "识别失败":
result = call_doubao_api(prompt)
print(f"豆包回复:{result}")
pip install vosk 装库,创建虚拟环境 python -m venv vosk - env 并激活(激活命令:vosk - env\scripts\activate(Windows)/source vosk - env/bin/activate(Linux/macOS)),还可装 pydub 处理音频 pip install pydub 。然后从 https://alphacephei.com/vosk/models 下载中文模型,解压后,写测试脚本:from vosk import Model, KaldiRecognizer
import sys, os
if not os.path.exists('model'):
print('去 https://alphacephei.com/vosk/models 下载模型放这儿!')
sys.exit(1)
model = Model('model')
recognizer = KaldiRecognizer(model, 16000)
print('Vosk ready!')
pip install vosk ,再去官网下中文模型(比如 vosk - model - small - cn - 0.22)。然后写 Python 代码:import vosk
import pyaudio
# 加载模型
model = vosk.Model("模型路径")
recognizer = vosk.KaldiRecognizer(model, 16000)
# 开麦克风
mic = pyaudio.PyAudio()
stream = mic.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=8192)
stream.start_stream()
# 实时识别
while True:
data = stream.read(4096)
if recognizer.AcceptWaveform(data):
print(recognizer.Result())
else:
print(recognizer.PartialResult())
conversation_id 这类标识,就能创建有上下文的对话,维持 session 感!比如用 Python 调用,每次请求都传相同的 conversation_id,豆包就会把这一系列交互当成同个对话来理解~不过 API 调用产生的对话,默认不会同步到豆包 APP 里哦,但从功能连贯性上,是能实现有记忆的对话流哒!10 × 512(10 行,512 列)512 × 512 的方阵。当输入矩阵 10 × 512 与 WQ 相乘时:10 × 512 的矩阵(行数不变,列数与 WQ 列数相同)10K - 实际长度 行的零向量 输入矩阵 (X) × WQ矩阵 = Q矩阵
[句子长度 × 词向量维度] [词向量维度 × 词向量维度] [句子长度 × 词向量维度]
↓ ↓ ↓
10 × 512 512 × 512 10 × 512
┌─────────┐ ┌─────────────────────────────┐
│ 词1 │ │ w11 w12 ... w1,512 │
│ (512维) │ │ w21 w22 ... w2,512 │
├─────────┤ │ ... ... ... ... │
│ 词2 │ │ w512,1 w512,2 ... w512,512 │
│ (512维) │ └─────────────────────────────┘
├─────────┤ ↑
│ ... │ │
├─────────┤ 方阵,大小与词向量维度一致
│ 词10 │
│ (512维) │
└─────────┘
X 的每一行是一个词的 512 维向量,共 10 行代表 10 个词┌─────────────────────────────────────────────┐
│ 词1: [v1, v2, ..., v64, v65, ..., v128, ..., v512] │
│ 词2: [v1, v2, ..., v64, v65, ..., v128, ..., v512] │
│ ... │
│ 词10: [v1, v2, ..., v64, v65, ..., v128, ..., v512] │
└─────────────────────────────────────────────┘
| 头 1 (10×64) | 头 2 (10×64) | ... | 头 8 (10×64) |
|---|---|---|---|
| ┌────────────┐ | ┌────────────┐ | ... | ┌────────────┐ |
| │ 词 1: v1-64 │ | │ 词 1: v65-128 │ | ... | │ 词 1: v449-512 │ |
| │ 词 2: v1-64 │ | │ 词 2: v65-128 │ | ... | │ 词 2: v449-512 │ |
| │ ... │ | │ ... │ | ... | │ ... │ |
| │ 词 10: v1-64 │ | │ 词 10: v65-128 │ | ... | │ 词 10: v449-512 │ |
| └────────────┘ | └────────────┘ | ... | └────────────┘ |
┌────────────┐ ┌────────────┐ ┌────────────┐
│ 词1: 头1输出 │ │ 词1: 头2输出 │ ... │ 词1: 头8输出 │
│ 词2: 头1输出 │ │ 词2: 头2输出 │ ... │ 词2: 头8输出 │
│ ... │ │ ... │ ... │ ... │
│ 词10: 头1输出 │ │ 词10: 头2输出 │ ... │ 词10: 头8输出 │
└────────────┘ └────────────┘ └────────────┘
↓
┌─────────────────────────────────────────────┐
│ 词1: [头1输出, 头2输出, ..., 头8输出] │
│ 词2: [头1输出, 头2输出, ..., 头8输出] │
│ ... │
│ 词10: [头1输出, 头2输出, ..., 头8输出] │
└─────────────────────────────────────────────┘
[句子长度, 词向量维度] 的输入矩阵。<SOS> 开始。它的第一个任务是预测 <SOS> 后面的第一个词。<EOS>,推理过程结束。| 特性 | 滑动窗口 (Sliding Window) | 稀疏注意力 (Sparse Attention) | 普通截断 (Truncation) |
|---|---|---|---|
| 工作原理 | 像人看书一样,用固定大小的窗口逐段处理长文本。 | 只关注与当前词相关的少数词,忽略大部分不相关词。 | 直接截取文本开头或结尾的部分内容,丢弃中间部分。 |
| 优点 | - 实现简单,效果稳定- 能捕捉局部上下文信息 | - 效率极高,处理速度快- 能捕捉长距离依赖关系 | - 实现最简单,计算成本最低 |
| 缺点 | - 难以处理窗口之外的长距离依赖- 可能重复处理相同内容 | - 实现复杂,训练难度高- 对注意力的 "稀疏化" 策略依赖大 | - 丢失大量信息,可能影响理解 |
| 适用场景 | 处理中等长度文本,或对长距离依赖要求不高的场景。 | 处理超长文本,且需要捕捉全局信息的场景。 | 对处理速度要求极高,且能容忍信息丢失的场景。 |
我今天早上出门买了一杯咖啡,然后去公司上班,路上遇到了一个老朋友。公司。我今天早上出门买了一杯咖啡,然后去公司 直接被截断丢弃了。[我今天早上出门买了一杯][早上出门买了一杯咖啡,][买了一杯咖啡,然后去][一杯咖啡,然后去公司上] ← 这个窗口包含了 公司[咖啡,然后去公司上班,][然后去公司上班,路上遇][去公司上班,路上遇到了][公司上班,路上遇到了一][上班,路上遇到了一个老][路上遇到了一个老朋友。]公司 只能看到它所在窗口内的词,如 咖啡、然后去、上班。我今天早上出门买了一杯,也看不到后面的 路上遇到了一个老朋友。公司 相关的词。我今天早上出门买了一杯咖啡,然后去[公司]上班,路上遇到了一个老朋友。去、上班 这些直接相关的词。我、早上出门 这些提供背景信息的词。一杯咖啡、路上遇到了 这些关联不大的词。