mirror of
https://github.com/SHOGGOTH-SECTOR/sica-fondt.git
synced 2026-08-01 00:23:15 +00:00
Place useful parts of the surrounding repos into sica-fondt by layer, per the
body model (Ada = membrane; brain/endocrine/capabilities/knowledge non-Ada):
- brain/ LLM reasoning + providers (dapr, hermes, MoMoA)
- capabilities/ REPRAG sidecars: hermes tools/skills, dapr tools, parallel
dispatch, A51 channels, and the OSINT cluster
- knowledge/ LORAG corpus: 754 cyber-skills, agency personas, secure-coding,
MITRE ATT&CK data
- reference/ defensive threat-reference (C3, shhbruh doc) + AdaYaml parser
License handling: AGPL sources (worldosint, advanced_evolution, mercury,
Reticulum) and GPL DeTTECT are SPEC-only clean-room/port descriptions — no
copyleft code copied. MIT/Apache/data parts copied as working trees.
Safety: shhbruh escape/persistence material and C3 covert-C2 kept as reference
only, not wired into the running organism. See CONSOLIDATION.md.
https://claude.ai/code/session_01UehUqEXXJJCsHoA4voCU5c
154 lines
6.9 KiB
Python
154 lines
6.9 KiB
Python
#
|
|
# Copyright 2026 The Dapr Authors
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
from dapr_agents.llm.elevenlabs.client import ElevenLabsClientBase
|
|
from typing import Optional, Union, Any
|
|
from pydantic import Field
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ElevenLabsSpeechClient(ElevenLabsClientBase):
|
|
"""
|
|
Client for ElevenLabs speech generation functionality.
|
|
Handles text-to-speech conversions with customizable options.
|
|
"""
|
|
|
|
voice: Optional[str] = Field(
|
|
default="JBFqnCBsd6RMkjVDRZzb", # George
|
|
description="Default voice (ID, name) for speech generation.",
|
|
)
|
|
model: Optional[str] = Field(
|
|
default="eleven_multilingual_v2",
|
|
description="Default model for speech generation.",
|
|
)
|
|
output_format: Optional[str] = Field(
|
|
default="mp3_44100_128", description="Default audio output format."
|
|
)
|
|
optimize_streaming_latency: Optional[int] = Field(
|
|
default=0,
|
|
description="Default latency optimization level (0 means no optimizations).",
|
|
)
|
|
voice_settings: Optional[Any] = Field(
|
|
default=None,
|
|
description="Default voice settings (stability, similarity boost, etc.).",
|
|
)
|
|
|
|
def model_post_init(self, __context: Any) -> None:
|
|
"""
|
|
Post-initialization logic for the ElevenLabsSpeechClient.
|
|
Dynamically imports ElevenLabs components and validates voice attributes.
|
|
"""
|
|
super().model_post_init(__context)
|
|
|
|
if self.voice_settings is None:
|
|
self.voice_settings = self.client.voices.settings.get_default()
|
|
|
|
def create_speech(
|
|
self,
|
|
text: str,
|
|
file_name: Optional[str] = None,
|
|
voice: Optional[Union[str, Any]] = None,
|
|
model: Optional[str] = None,
|
|
output_format: Optional[str] = None,
|
|
optimize_streaming_latency: Optional[int] = None,
|
|
voice_settings: Optional[Any] = None,
|
|
pronunciation_dictionary_locators: Optional[Any] = None,
|
|
seed: Optional[int] = None,
|
|
previous_text: Optional[str] = None,
|
|
next_text: Optional[str] = None,
|
|
previous_request_ids: Optional[Any] = None,
|
|
next_request_ids: Optional[Any] = None,
|
|
language_code: Optional[str] = None,
|
|
use_pvc_as_ivc: Optional[bool] = None,
|
|
apply_text_normalization: Optional[Any] = None,
|
|
apply_language_text_normalization: Optional[bool] = None,
|
|
enable_logging: Optional[bool] = None,
|
|
overwrite_file: bool = True,
|
|
) -> Union[bytes, None]:
|
|
"""
|
|
Generate speech audio from text and optionally save it to a file.
|
|
|
|
Args:
|
|
text (str): The text to convert to speech.
|
|
file_name (Optional[str]): Optional file name to save the generated audio.
|
|
voice (Optional[Union[str, Voice]]): Override default voice for this request (ID, name, or object).
|
|
model (Optional[str]): Override default model for this request.
|
|
output_format (Optional[str]): Override default output format for this request.
|
|
optimize_streaming_latency (Optional[int]): Override default latency optimization level.
|
|
voice_settings (Optional[VoiceSettings]): Override default voice settings (stability, similarity boost, etc.).
|
|
pronunciation_dictionary_locators (Optional[Any]): Pronunciation dictionary locators for custom pronunciations.
|
|
seed (Optional[int]): Seed for deterministic output.
|
|
previous_text (Optional[str]): Text before this request for continuity.
|
|
next_text (Optional[str]): Text after this request for continuity.
|
|
previous_request_ids (Optional[Any]): Previous request IDs for continuity.
|
|
next_request_ids (Optional[Any]): Next request IDs for continuity.
|
|
language_code (Optional[str]): Enforce a specific language code.
|
|
use_pvc_as_ivc (Optional[bool]): Use IVC version of the voice for lower latency.
|
|
apply_text_normalization (Optional[Any]): Control text normalization ('auto', 'on', 'off').
|
|
apply_language_text_normalization (Optional[bool]): Language-specific normalization.
|
|
enable_logging (Optional[bool]): Enable/disable logging for privacy.
|
|
overwrite_file (bool): Whether to overwrite the file if it exists. Defaults to True.
|
|
|
|
Returns:
|
|
Union[bytes, None]: The generated audio as bytes if no `file_name` is provided; otherwise, None.
|
|
"""
|
|
# Apply defaults if arguments are not provided
|
|
voice = voice or self.voice
|
|
model = model or self.model
|
|
output_format = output_format or self.output_format
|
|
optimize_streaming_latency = (
|
|
optimize_streaming_latency or self.optimize_streaming_latency
|
|
)
|
|
voice_settings = voice_settings or self.voice_settings
|
|
|
|
logger.info(f"Generating speech with voice '{voice}', model '{model}'.")
|
|
|
|
try:
|
|
audio_chunks = self.client.text_to_speech.convert(
|
|
voice_id=voice,
|
|
text=text,
|
|
model_id=model,
|
|
output_format=output_format,
|
|
optimize_streaming_latency=optimize_streaming_latency,
|
|
voice_settings=voice_settings,
|
|
pronunciation_dictionary_locators=pronunciation_dictionary_locators,
|
|
seed=seed,
|
|
previous_text=previous_text,
|
|
next_text=next_text,
|
|
previous_request_ids=previous_request_ids,
|
|
next_request_ids=next_request_ids,
|
|
language_code=language_code,
|
|
use_pvc_as_ivc=use_pvc_as_ivc,
|
|
apply_text_normalization=apply_text_normalization,
|
|
apply_language_text_normalization=apply_language_text_normalization,
|
|
enable_logging=enable_logging,
|
|
)
|
|
|
|
if file_name:
|
|
file_mode = "wb" if overwrite_file else "ab"
|
|
logger.info(f"Saving audio to file: {file_name} (mode: {file_mode})")
|
|
with open(file_name, file_mode) as audio_file:
|
|
for chunk in audio_chunks:
|
|
audio_file.write(chunk)
|
|
logger.info(f"Audio saved to {file_name}")
|
|
return None
|
|
else:
|
|
logger.info("Collecting audio bytes.")
|
|
return b"".join(audio_chunks)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to generate speech: {e}")
|
|
raise ValueError(f"An error occurred during speech generation: {e}")
|