Add morshu server start/stop/status bot commands
This commit is contained in:
+100
-1
@@ -314,8 +314,11 @@ class TtsToy(Cog):
|
|||||||
self.dectalk_process = None
|
self.dectalk_process = None
|
||||||
self.dectalk_port = 3001
|
self.dectalk_port = 3001
|
||||||
|
|
||||||
# Morshu TTS engine
|
# Morshu TTS engine + server
|
||||||
self.morshu = Morshu() if MORSHU_AVAILABLE else None
|
self.morshu = Morshu() if MORSHU_AVAILABLE else None
|
||||||
|
self.morshu_dir = Path(__file__).resolve().parent / "morshu-server"
|
||||||
|
self.morshu_process = None
|
||||||
|
self.morshu_port = 3002
|
||||||
|
|
||||||
# TTS queue system - one queue per guild
|
# TTS queue system - one queue per guild
|
||||||
self.tts_queues = {} # guild_id -> asyncio.Queue
|
self.tts_queues = {} # guild_id -> asyncio.Queue
|
||||||
@@ -512,6 +515,51 @@ class TtsToy(Cog):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.exception(f"Error stopping DECTalk server: {e}")
|
log.exception(f"Error stopping DECTalk server: {e}")
|
||||||
|
|
||||||
|
async def _start_morshu_server(self) -> bool:
|
||||||
|
"""Start the built-in Morshu TTS server."""
|
||||||
|
try:
|
||||||
|
if self.morshu_process and self.morshu_process.poll() is None:
|
||||||
|
log.info("Morshu server already running")
|
||||||
|
return True
|
||||||
|
|
||||||
|
server_py = self.morshu_dir / "server.py"
|
||||||
|
if not server_py.exists():
|
||||||
|
log.error(f"Morshu server not found: {server_py}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
self.morshu_process = await asyncio.to_thread(
|
||||||
|
subprocess.Popen,
|
||||||
|
["python3", "server.py"],
|
||||||
|
cwd=str(self.morshu_dir),
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
text=True
|
||||||
|
)
|
||||||
|
|
||||||
|
await asyncio.sleep(3)
|
||||||
|
|
||||||
|
if self.morshu_process.poll() is not None:
|
||||||
|
log.error("Morshu server failed to start")
|
||||||
|
return False
|
||||||
|
|
||||||
|
log.info(f"Morshu server started on port {self.morshu_port}")
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
log.exception(f"Failed to start Morshu server: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
async def _stop_morshu_server(self):
|
||||||
|
"""Stop the built-in Morshu server."""
|
||||||
|
if self.morshu_process and self.morshu_process.poll() is None:
|
||||||
|
try:
|
||||||
|
self.morshu_process.terminate()
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
if self.morshu_process.poll() is None:
|
||||||
|
self.morshu_process.kill()
|
||||||
|
log.info("Morshu server stopped")
|
||||||
|
except Exception as e:
|
||||||
|
log.exception(f"Error stopping Morshu server: {e}")
|
||||||
|
|
||||||
async def _get_effective_minimax_voice(self, user: discord.abc.User) -> str:
|
async def _get_effective_minimax_voice(self, user: discord.abc.User) -> str:
|
||||||
mode = await self._get_tts_mode()
|
mode = await self._get_tts_mode()
|
||||||
|
|
||||||
@@ -2069,6 +2117,57 @@ class TtsToy(Cog):
|
|||||||
else:
|
else:
|
||||||
await ctx.send(f"You'll need to manually start DECTalk with `{ctx.clean_prefix}ttstoy dectalkstart`")
|
await ctx.send(f"You'll need to manually start DECTalk with `{ctx.clean_prefix}ttstoy dectalkstart`")
|
||||||
|
|
||||||
|
@ttstoy_group.command(name="morshustart")
|
||||||
|
@commands.is_owner()
|
||||||
|
async def morshu_start(self, ctx: commands.Context):
|
||||||
|
"""Start the built-in Morshu TTS server."""
|
||||||
|
await ctx.send("🚀 Starting Morshu server...")
|
||||||
|
|
||||||
|
success = await self._start_morshu_server()
|
||||||
|
|
||||||
|
if success:
|
||||||
|
await ctx.send(
|
||||||
|
f"✅ Morshu server started on port {self.morshu_port}!\n"
|
||||||
|
f"Switch to Morshu mode: `{ctx.clean_prefix}ttstoy mode morshu`"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
await ctx.send("❌ Failed to start Morshu server. Check bot logs.")
|
||||||
|
|
||||||
|
@ttstoy_group.command(name="morshustop")
|
||||||
|
@commands.is_owner()
|
||||||
|
async def morshu_stop(self, ctx: commands.Context):
|
||||||
|
"""Stop the built-in Morshu server."""
|
||||||
|
if not self.morshu_process or self.morshu_process.poll() is not None:
|
||||||
|
return await ctx.send("❌ Morshu server is not running")
|
||||||
|
|
||||||
|
await self._stop_morshu_server()
|
||||||
|
await ctx.send("✅ Morshu server stopped")
|
||||||
|
|
||||||
|
@ttstoy_group.command(name="morshustatus")
|
||||||
|
@commands.is_owner()
|
||||||
|
async def morshu_status(self, ctx: commands.Context):
|
||||||
|
"""Check Morshu server status."""
|
||||||
|
process_running = self.morshu_process and self.morshu_process.poll() is None
|
||||||
|
|
||||||
|
api_responding = False
|
||||||
|
try:
|
||||||
|
r = requests.get(f"http://127.0.0.1:{self.morshu_port}/health", timeout=2)
|
||||||
|
api_responding = r.status_code == 200
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
lines = [
|
||||||
|
"**Morshu Server Status**",
|
||||||
|
f"Process Running: {'✅ Yes' if process_running else '❌ No'}",
|
||||||
|
f"API Responding: {'✅ Yes' if api_responding else '❌ No'}",
|
||||||
|
f"URL: `http://127.0.0.1:{self.morshu_port}`",
|
||||||
|
]
|
||||||
|
|
||||||
|
if not process_running:
|
||||||
|
lines.append(f"\nStart with: `{ctx.clean_prefix}ttstoy morshustart`")
|
||||||
|
|
||||||
|
await ctx.send("\n".join(lines))
|
||||||
|
|
||||||
@ttstoy_group.command(name="accessibility")
|
@ttstoy_group.command(name="accessibility")
|
||||||
@commands.is_owner()
|
@commands.is_owner()
|
||||||
async def accessibility_toggle(self, ctx: commands.Context):
|
async def accessibility_toggle(self, ctx: commands.Context):
|
||||||
|
|||||||
Reference in New Issue
Block a user