Skip to main content
Glama
balloonf

Windows TTS MCP Server

by balloonf

speak_quiet

Convert text to speech at a low volume using Windows TTS MCP Server, enabling discreet audio playback for private or quiet environments.

Instructions

텍스트를 작은 볼륨으로 읽어줍니다

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
textYes

Implementation Reference

  • The primary handler for the 'speak_quiet' tool. Decorated with @mcp.tool() for automatic registration in FastMCP. Splits long text into chunks using split_text_for_tts, executes TTS playback in a background thread using a nested _speak_quiet helper that calls powershell_tts with volume=50 for quiet speech, and returns a status message.
    @mcp.tool()
    def speak_quiet(text: str) -> str:
        """텍스트를 작은 볼륨으로 읽어줍니다"""
        try:
            # 텍스트 분할
            text_chunks = split_text_for_tts(text, 400)
            total_chunks = len(text_chunks)
            
            def _speak_quiet():
                for i, chunk in enumerate(text_chunks, 1):
                    safe_print(f"[QUIET TTS] {i}/{total_chunks} 부분 재생 중: {chunk[:50]}...")
                    powershell_tts(chunk, rate=0, volume=50)  # 작은 볼륨
                    if i < total_chunks:
                        time.sleep(0.5)
            
            thread = threading.Thread(target=_speak_quiet, daemon=True)
            thread.start()
            
            if total_chunks > 1:
                return f"[QUIET] 작은 볼륨 재생 시작 ({total_chunks}개 부분): '{text[:50]}...'"
            else:
                return f"[QUIET] 작은 볼륨 재생 시작: '{text[:50]}...'"
            
        except Exception as e:
            return f"[ERROR] 작은 볼륨 재생 오류: {str(e)}"
  • Core helper function that executes TTS via PowerShell with configurable rate and volume. Called by speak_quiet with rate=0, volume=50 to produce quiet speech. Handles process management, text escaping, and error handling.
    def powershell_tts(text: str, rate: int = 0, volume: int = 100) -> bool:
        """PowerShell을 사용한 TTS 실행"""
        process = None
        try:
            if platform.system() != "Windows":
                safe_print("[ERROR] Windows가 아닙니다")
                return False
            
            # 텍스트에서 작은따옴표 이스케이프 처리
            escaped_text = text.replace("'", "''")
            
            # PowerShell TTS 명령어
            cmd = [
                "powershell", "-Command",
                f"Add-Type -AssemblyName System.Speech; "
                f"$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer; "
                f"$synth.Rate = {rate}; "
                f"$synth.Volume = {volume}; "
                f"$synth.Speak('{escaped_text}'); "
                f"$synth.Dispose()"
            ]
            
            # 프로세스 시작
            process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
            
            # 실행 중인 프로세스 목록에 추가
            with process_lock:
                running_processes.append(process)
            
            # 프로세스 완료 대기
            stdout, stderr = process.communicate(timeout=180)
            
            # 완료된 프로세스 목록에서 제거
            with process_lock:
                if process in running_processes:
                    running_processes.remove(process)
            
            if process.returncode == 0:
                safe_print(f"[SUCCESS] TTS 완료: {text[:30]}...")
                return True
            else:
                safe_print(f"[ERROR] TTS 오류: {stderr}")
                return False
                
        except subprocess.TimeoutExpired:
            safe_print("[WARNING] TTS 시간 초과")
            if process:
                process.kill()
                with process_lock:
                    if process in running_processes:
                        running_processes.remove(process)
            return False
        except Exception as e:
            safe_print(f"[ERROR] TTS 예외: {e}")
            if process:
                try:
                    process.kill()
                    with process_lock:
                        if process in running_processes:
                            running_processes.remove(process)
                except:
                    pass
            return False
  • Helper function to split long text into TTS-friendly chunks (max 500 chars by default, 400 for speak_quiet). Ensures natural sentence boundaries for smooth playback. Used by speak_quiet.
    def split_text_for_tts(text: str, max_length: int = 500) -> list:
        """텍스트를 TTS용으로 적절히 분할"""
        if len(text) <= max_length:
            return [text]
        
        # 문장 단위로 분할 시도
        import re
        sentences = re.split(r'[.!?。!?]\s*', text)
        
        chunks = []
        current_chunk = ""
        
        for sentence in sentences:
            # 문장이 너무 긴 경우 더 작게 분할
            if len(sentence) > max_length:
                # 쉼표나 기타 구두점으로 분할
                sub_parts = re.split(r'[,;:\s]\s*', sentence)
                for part in sub_parts:
                    if len(current_chunk + part) <= max_length:
                        current_chunk += part + " "
                    else:
                        if current_chunk.strip():
                            chunks.append(current_chunk.strip())
                        current_chunk = part + " "
            else:
                # 현재 청크에 문장을 추가할 수 있는지 확인
                if len(current_chunk + sentence) <= max_length:
                    current_chunk += sentence + ". "
                else:
                    if current_chunk.strip():
                        chunks.append(current_chunk.strip())
                    current_chunk = sentence + ". "
        
        # 마지막 청크 추가
        if current_chunk.strip():
            chunks.append(current_chunk.strip())
        
        return chunks
Install Server

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/balloonf/widows_tts_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server