离线语音识别+青云客语音机器人(幼儿园级别教程)

打印 上一主题 下一主题

主题 2023|帖子 2023|积分 6069

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、利用步调

确保已安装以下库:
  1. pip install vosk sounddevice requests pyttsx3
复制代码

2、下载 Vosk 模型:


下载适合的中文模型,如 vosk-model-small-cn-0.22。
下载地点:
   https://alphacephei.com/vosk/models
  
 
将模型解压后放置在代码中指定的路径 MODEL_PATH。

我选择放到项目的根目次下
如下图:

3、插麦克风

记得插个耳机当麦克风哦!!!

4、完整代码

  1. import os
  2. import sounddevice as sd
  3. import queue
  4. import vosk
  5. import sys
  6. import json
  7. import pyttsx3
  8. import requests
  9. import threading
  10. # 初始化语音合成引擎
  11. def init_tts():
  12.     tts_engine = pyttsx3.init()
  13.     tts_engine.setProperty('rate', 150)  # 设置语速
  14.     tts_engine.setProperty('volume', 1.0)  # 设置音量
  15.     return tts_engine
  16. # 语音输出函数
  17. def speak(tts_engine, text):
  18.     tts_engine.say(text)
  19.     tts_engine.runAndWait()
  20. # 聊天机器人接口
  21. class ChatBot:
  22.     def __init__(self, api_url, key="free", appid="0"):
  23.         self.api_url = api_url
  24.         self.key = key
  25.         self.appid = appid
  26.     def send_message(self, message):
  27.         params = {
  28.             "key": self.key,
  29.             "appid": self.appid,
  30.             "msg": message
  31.         }
  32.         try:
  33.             response = requests.get(self.api_url, params=params)
  34.             response.raise_for_status()  # 检查请求是否成功
  35.             data = response.json()
  36.             if data.get("result") == 0:
  37.                 return data.get("content")
  38.             else:
  39.                 return "对不起,我无法处理您的请求。"
  40.         except requests.RequestException as e:
  41.             return f"请求失败:{e}"
  42. # 初始化模型路径
  43. MODEL_PATH = "vosk-model-small-cn-0.22"  # 替换为模型的路径
  44. if not os.path.exists(MODEL_PATH):
  45.     print(f"模型路径不存在: {MODEL_PATH}")
  46.     sys.exit(1)
  47. # 加载 Vosk 模型
  48. try:
  49.     model = vosk.Model(MODEL_PATH)
  50.     print(f"模型加载成功: {MODEL_PATH}")
  51. except Exception as e:
  52.     print(f"加载模型时出错: {e}")
  53.     sys.exit(1)
  54. q = queue.Queue()
  55. stop_signal = threading.Event()
  56. # 音频流回调函数
  57. def callback(indata, frames, time, status):
  58.     if status:
  59.         print(f"状态错误: {status}", file=sys.stderr)
  60.     q.put(bytes(indata))
  61. # 实时语音识别函数
  62. def recognize(tts_engine, chatbot):
  63.     print("请开始说话...输入 'q' 并按回车退出。")
  64.     try:
  65.         with sd.RawInputStream(samplerate=16000, blocksize=8000, dtype="int16",
  66.                                channels=1, callback=callback):
  67.             rec = vosk.KaldiRecognizer(model, 16000)
  68.             while not stop_signal.is_set():
  69.                 try:
  70.                     # 设置超时,避免队列阻塞导致无法响应中断
  71.                     data = q.get(timeout=0.5)
  72.                     if rec.AcceptWaveform(data):
  73.                         result = json.loads(rec.Result())
  74.                         recognized_text = result.get('text', '')
  75.                         if recognized_text:
  76.                             print(f"\n你: {recognized_text}")
  77.                             # 调用聊天机器人
  78.                             bot_response = chatbot.send_message(recognized_text)
  79.                             print(f"机器人: {bot_response}")
  80.                             # 语音输出机器人回复
  81.                             speak(tts_engine, bot_response)
  82.                     else:
  83.                         partial_result = json.loads(rec.PartialResult()).get('partial', '')
  84.                         if partial_result:
  85.                             print(f"\r临时识别中: {partial_result}", end="")
  86.                 except queue.Empty:
  87.                     # 超时后检查停止信号
  88.                     continue
  89.     except Exception as e:
  90.         print(f"发生错误: {e}")
  91.     finally:
  92.         print("清理资源并退出。")
  93. # 主线程监听用户输入
  94. def listen_for_exit():
  95.     while True:
  96.         user_input = input()
  97.         if user_input.strip().lower() == 'q':
  98.             stop_signal.set()
  99.             print("退出指令收到,程序即将退出。")
  100.             break
  101. if __name__ == "__main__":
  102.     # 初始化语音合成引擎
  103.     tts_engine = init_tts()
  104.     # 初始化聊天机器人
  105.     chatbot = ChatBot(api_url="http://api.qingyunke.com/api.php")
  106.     # 欢迎语音介绍
  107.     welcome_message = "我是小菲菲,很高兴为你服务!"
  108.     print(f"机器人: {welcome_message}")
  109.     speak(tts_engine, welcome_message)
  110.     # 创建监听输入的线程
  111.     input_thread = threading.Thread(target=listen_for_exit)
  112.     input_thread.daemon = True
  113.     input_thread.start()
  114.     # 启动实时语音识别和对话
  115.     recognize(tts_engine, chatbot)
复制代码
感谢您的支持和关注!!
也支持您的继续创新!!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表