为了确保语音助手项目能够顺利运行,你需要安装以下依赖项。本指南将指导你完成所有必要的安装步骤。

#### 环境准备

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)

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐