Qwen2-Audio 是 Qwen 大型音频-语言模型的新系列。Qwen2-Audio 能够接受各种音频信号输入,并根据语音指令进行音频分析或直接文本响应。我们介绍了两种不同的音频交互模式
**网络连接**:如果你选择了 `gTTS` 作为 TTS 引擎,请确保你的网络连接稳定,并且防火墙或代理设置不会阻止对 `translate.google.com` 的访问。按照上述步骤,你应该能够成功安装所有所需的依赖项,并准备好运行语音助手项目。- **环境变量**:在 Windows 上,安装 FFmpeg 后记得将它的二进制文件目录添加到系统的 PATH 环境变量中。- **FFmpeg
为了确保语音助手项目能够顺利运行,你需要安装以下依赖项。本指南将指导你完成所有必要的安装步骤。
#### 环境准备
1. **Python 版本**
- 确保你使用的是 Python 3.x 版本。建议使用 Conda 来管理环境和包,因为它可以简化依赖管理和环境隔离。
2. **创建并激活 Conda 环境**
- 如果你还没有为这个项目创建一个专门的 Conda 环境,请按照以下步骤操作:
```bash
conda create --name qwen_audio python=3.9
conda activate qwen_audio
```
#### 安装依赖
以下是需要安装的主要依赖项及其安装命令:
1. **Transformers 和相关库**
- 这些库用于加载预训练模型和处理音频数据。
```bash
pip install transformers
pip install librosa
pip install torch
```
2. **PyAudio**
- 用于访问麦克风设备。推荐通过 Conda 安装以避免编译问题。
```bash
conda install -c conda-forge pyaudio
```
3. **SpeechRecognition**
- 用于从麦克风捕获音频。
```bash
pip install SpeechRecognition
```
4. **Pydub**
- 用于音频文件的处理和格式转换。
```bash
pip install pydub
```
- 注意:`pydub` 需要 FFmpeg 或 Libav 工具来处理音频文件。你可以从 [FFmpeg官网](https://ffmpeg.org/download.html) 下载并安装适合你系统的版本,并将其添加到系统路径中。
5. **gTTS (可选)**
- 如果选择使用 Google Text-to-Speech 服务,则需要安装 `gTTS`。
```bash
pip install gtts
```
- 注意:由于 `gTTS` 依赖于互联网连接,可能会遇到网络问题。如果你倾向于使用离线 TTS 引擎,可以跳过这一步骤。
6. **pyttsx3**
- 推荐的本地 TTS 引擎,不需要互联网连接即可工作。
```bash
pip install pyttsx3
```
7. **其他工具**
- 可能还需要一些辅助工具或库,如 `tempfile`、`contextlib` 等,但这些通常是 Python 标准库的一部分,无需额外安装。
#### 示例安装命令
```bash
conda create --name qwen_audio python=3.9
conda activate qwen_audio
conda install -c conda-forge pyaudio
pip install transformers librosa torch SpeechRecognition pydub pyttsx3
```
#### 注意事项
- **网络连接**:如果你选择了 `gTTS` 作为 TTS 引擎,请确保你的网络连接稳定,并且防火墙或代理设置不会阻止对 `translate.google.com` 的访问。
- **FFmpeg 安装**:对于 `pydub` 的使用,确保已经正确安装了 FFmpeg 并配置好了环境变量。
- **环境变量**:在 Windows 上,安装 FFmpeg 后记得将它的二进制文件目录添加到系统的 PATH 环境变量中。
#### 总结
按照上述步骤,你应该能够成功安装所有所需的依赖项,并准备好运行语音助手项目。如果在安装过程中遇到任何问题或需要进一步的帮助,请随时联系开发团队获取支持。希望这份文档对你有所帮助!
from transformers import AutoProcessor, Qwen2AudioForConditionalGeneration
import librosa
import torch
from pydub import AudioSegment
import os
import speech_recognition as sr
import wave
from gtts import gTTS
import tempfile
import contextlib
import pyaudio
import pyttsx3 # 使用本地 TTS 引擎
# 模型和音频文件的本地路径
model_dir = "E:\\qwen2\\Qwen2-Audio-7B"
# 加载预训练的Qwen2-Audio-7B模型和处理器
try:
model = Qwen2AudioForConditionalGeneration.from_pretrained(model_dir, local_files_only=True, trust_remote_code=True)
processor = AutoProcessor.from_pretrained(model_dir, local_files_only=True, trust_remote_code=True)
print("Qwen2-Audio-7B 模型加载成功。")
except Exception as e:
print(f"加载模型失败: {e}")
exit()
def recognize_speech_from_mic(device_index=None):
recognizer = sr.Recognizer()
microphone = sr.Microphone(device_index=device_index)
with microphone as source:
print("请说话...")
recognizer.adjust_for_ambient_noise(source) # 调整麦克风噪音
audio = recognizer.listen(source)
print("音频录制完成。")
return audio
def save_audio_to_file(audio_data, filename="captured_audio.wav"):
"""保存音频数据到文件"""
with open(filename, 'wb') as f:
f.write(audio_data.get_wav_data())
print(f"音频已保存为 {filename}")
def load_audio_from_file(filename, target_sr):
"""从文件加载音频并转换为适合模型的格式"""
audio, sr = librosa.load(filename, sr=target_sr)
return audio, sr
def generate_caption_from_audio(audio_data, sr, prompt):
"""使用 Qwen2-Audio-7B 模型从音频生成文本描述"""
inputs = processor(text=prompt, audios=[audio_data], sampling_rate=sr, return_tensors="pt")
with torch.no_grad():
generated_ids = model.generate(**inputs, max_length=256)
generated_ids = generated_ids[:, inputs.input_ids.size(1):]
response = processor.batch_decode(generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
return response
def text_to_speech(text):
engine = pyttsx3.init()
engine.say(text)
engine.runAndWait()
def voice_assistant_loop(device_index=None):
while True:
try:
# 使用麦克风捕获音频
audio = recognize_speech_from_mic(device_index=device_index)
# 保存音频以供后续处理(可选)
temp_wav = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
save_audio_to_file(audio, temp_wav.name)
# 加载并转换音频文件为适合模型的格式
audio_data, sr = load_audio_from_file(temp_wav.name, target_sr=processor.feature_extractor.sampling_rate)
# 生成文本描述
prompt = "<|audio_bos|><|AUDIO|><|audio_eos|>Generate the caption in Chinese:"
response_text = generate_caption_from_audio(audio_data, sr, prompt)
print(f"生成的文本描述: {response_text}")
# 文本转语音并播放
text_to_speech(response_text)
# 清理临时文件
os.unlink(temp_wav.name)
except Exception as e:
print(f"发生错误: {e}")
continue
if __name__ == "__main__":
print("语音助手已启动,等待您的命令...")
# 列出所有可用的麦克风设备并让用户选择
p = pyaudio.PyAudio()
info = p.get_host_api_info_by_index(0)
num_devices = info.get('deviceCount')
available_devices = []
print("Available audio devices:")
for i in range(0, num_devices):
device_info = p.get_device_info_by_host_api_device_index(0, i)
if device_info.get('maxInputChannels') > 0:
available_devices.append((i, device_info.get('name')))
print(f"Device ID {i} - {device_info.get('name')}")
p.terminate()
if not available_devices:
print("没有找到可用的麦克风设备。")
exit()
selected_device_id = None
if len(available_devices) == 1:
selected_device_id = available_devices[0][0]
print(f"自动选择了唯一的麦克风设备:{available_devices[0][1]}")
else:
print("请选择要使用的麦克风设备ID:")
for device in available_devices:
print(f"选择 {device[0]} 使用 {device[1]}")
try:
selected_device_id = int(input("请输入设备ID: "))
except ValueError:
print("无效的设备ID。")
exit()
print(f"正在使用设备ID {selected_device_id} 进行语音识别...")
voice_assistant_loop(device_index=selected_device_id)
更多推荐
所有评论(0)