xCoDGAS

Untitled

Apr 17th, 2026 (edited)
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.55 KB | None | 0 0
  1. cat << 'EOF' > /home/santos/.openclaw/workspace/scripts/jervasio-manual.py
  2. #!/usr/bin/env python3
  3. import time, json, subprocess, sys, re, queue, threading
  4. import numpy as np
  5. import sounddevice as sd
  6. import requests
  7. from faster_whisper import WhisperModel
  8.  
  9. # Configurações
  10. PIPER_EXE = "/home/santos/.openclaw/workspace/jervasio_env/bin/piper"
  11. PIPER_MODEL = "/home/santos/.openclaw/workspace/models/pt_PT-tugao-medium.onnx"
  12. WHISPER_MODEL_SIZE = "base"
  13. RECORD_SECONDS = 6
  14.  
  15. GATEWAY_URL = "http://127.0.0.1:18789/v1/responses"
  16. GATEWAY_TOKEN = "55b6988ba106c77aa19159079166fe0f810fe397bc117f81"
  17.  
  18. tts_queue = queue.Queue()
  19.  
  20. print("\n🤖 Jervásio: Modelos prontos. À escuta...", flush=True)
  21. try:
  22. whisper = WhisperModel(WHISPER_MODEL_SIZE, device="cpu", compute_type="int8")
  23. except Exception as e:
  24. print(f"❌ Erro Whisper: {e}", flush=True); sys.exit(1)
  25.  
  26. def speak(text):
  27. t_start = time.time()
  28. clean_text = text.replace('"', "").replace("\n", " ").replace("*", "").strip()
  29. if not clean_text:
  30. return
  31. cmd = f'echo "{clean_text}" | {PIPER_EXE} --model {PIPER_MODEL} --output_raw | paplay --raw --rate=22050 --channels=1 --format=s16le'
  32. subprocess.run(cmd, shell=True)
  33. print(f" ⏱️ [TTS (Piper)]: {time.time() - t_start:.2f}s", flush=True)
  34.  
  35. def tts_worker():
  36. while True:
  37. chunk = tts_queue.get()
  38. if chunk is None: break
  39. try:
  40. speak(chunk)
  41. finally:
  42. tts_queue.task_done()
  43.  
  44. threading.Thread(target=tts_worker, daemon=True).start()
  45.  
  46. def pop_speakable_chunk(buf: str):
  47. m = re.search(r"(.+?[.!?;:])(\s|$)", buf, re.S)
  48. if not m: return None, buf
  49. chunk = m.group(1).strip()
  50. rest = buf[m.end():].lstrip()
  51. return chunk, rest
  52.  
  53. def send_via_gateway_stream(text):
  54. headers = {
  55. "Authorization": f"Bearer {GATEWAY_TOKEN}",
  56. "Content-Type": "application/json",
  57. "x-openclaw-agent-id": "main",
  58. "x-openclaw-session-key": "agent:main:main",
  59. "x-openclaw-message-channel": "webchat"
  60. }
  61. payload = {"model": "openclaw", "input": text, "stream": True}
  62.  
  63. full_text, tts_buffer = "", ""
  64. event_type, primeira_palavra = None, False
  65. t_start = time.time()
  66.  
  67. print("⏳ A enviar para o Gateway...", flush=True)
  68. try:
  69. with requests.post(GATEWAY_URL, headers=headers, json=payload, stream=True) as r:
  70. r.raise_for_status()
  71. print("🤖 Jervásio: ", end="", flush=True)
  72. for line in r.iter_lines(decode_unicode=True):
  73. if line == "" or line.startswith("event: ") or not line.startswith("data: "):
  74. continue
  75. data = line[6:]
  76. if data == "[DONE]": break
  77. try:
  78. obj = json.loads(data)
  79. delta = obj.get("delta", "")
  80. if delta:
  81. if not primeira_palavra:
  82. print(f"\n ⏱️ [Cérebro TTFT]: {time.time() - t_start:.2f}s", flush=True)
  83. print("🤖 ", end="", flush=True)
  84. primeira_palavra = True
  85. full_text += delta
  86. tts_buffer += delta
  87. print(delta, end="", flush=True)
  88. while True:
  89. chunk, tts_buffer = pop_speakable_chunk(tts_buffer)
  90. if not chunk: break
  91. tts_queue.put(chunk)
  92. except: pass
  93. except Exception as e: print(f"\n❌ Erro: {e}")
  94. if tts_buffer.strip(): tts_queue.put(tts_buffer.strip())
  95. return full_text.strip()
  96.  
  97. while True:
  98. try:
  99. input("\n[ ENTER PARA FALAR ]")
  100. t_rec_start = time.time()
  101. print(f"🎤 Gravando ({RECORD_SECONDS}s)...", flush=True)
  102. audio = sd.rec(int(RECORD_SECONDS * 16000), samplerate=16000, channels=1, dtype="float32")
  103. sd.wait()
  104. print(f" ⏱️ [Gravação]: {time.time() - t_rec_start:.2f}s", flush=True)
  105.  
  106. t_stt_start = time.time()
  107. segments, _ = whisper.transcribe(np.squeeze(audio), language="pt", initial_prompt="Jervásio")
  108. user_text = " ".join([s.text for s in segments]).strip()
  109. print(f" ⏱️ [STT (Whisper)]: {time.time() - t_stt_start:.2f}s", flush=True)
  110.  
  111. if user_text:
  112. print(f"👤 Tu: {user_text}", flush=True)
  113. send_via_gateway_stream(user_text)
  114. tts_queue.join()
  115. except KeyboardInterrupt:
  116. print("\nAté breve!"); break
  117. EOF
Advertisement
Add Comment
Please, Sign In to add comment