Spaces:
Paused
Paused
| # | |
| # SPDX-FileCopyrightText: Hadad <[email protected]> | |
| # SPDX-License-Identifier: Apache-2.0 | |
| # | |
| import aiohttp # Import aiohttp library to handle asynchronous HTTP requests and responses | |
| from urllib.parse import quote # Import quote function to safely encode URL query parameters | |
| from src.utils.ip_generator import generate_ip # Import custom utility to generate random IP addresses for request headers | |
| from src.utils.tools import initialize_tools # Import initialize_tools function to set up necessary API tools and retrieve tokens | |
| # Define a class to handle audio generation tasks asynchronously | |
| class AudioGeneration: | |
| """ | |
| This class provides functionality to generate audio content based on textual instructions asynchronously. | |
| It encapsulates all necessary steps including preparing the request, encoding parameters, initializing tools, | |
| making HTTP requests to the audio generation service, and handling the response. | |
| The design leverages asynchronous programming to efficiently manage network I/O without blocking the main thread. | |
| It uses external utilities for IP generation to simulate diverse client requests and for tool initialization to | |
| obtain API endpoints and authorization tokens securely. | |
| This class is intended for integration in larger applications requiring dynamic audio content creation from text, | |
| supporting scalability and responsiveness in asynchronous environments. | |
| """ | |
| # Decorator indicating this method does not depend on instance state | |
| # Asynchronous method to create an audio based on given instructions and parameters | |
| async def create_audio(generate_audio_instruction: str) -> str: | |
| """ | |
| Asynchronously generates an audio URL from a given textual instruction describing the desired audio content. | |
| This method performs the following steps: | |
| - Encodes the input text to ensure it is safe for URL transmission | |
| - Initializes necessary tools and retrieves the audio generation endpoint and authorization token | |
| - Constructs the request URL and query parameters specifying the audio model and voice characteristics | |
| - Sets up HTTP headers including authorization and IP address to simulate client diversity | |
| - Opens an asynchronous HTTP session and sends a GET request to the audio generation service | |
| - Checks the response status and content type to verify successful audio generation | |
| - Returns the URL of the generated audio if successful, otherwise raises an exception | |
| The method is designed to be non-blocking and suitable for use in asynchronous workflows. | |
| Args: | |
| generate_audio_instruction (str): A textual description or instruction for the audio to be generated | |
| Returns: | |
| str: The URL pointing to the generated audio resource | |
| Raises: | |
| Exception: If the HTTP response indicates failure or the content is not audio | |
| """ | |
| # Encode the textual instruction to be safely included in a URL path segment | |
| generate_audio_instruct = quote(generate_audio_instruction) | |
| # Initialize external tools and retrieve the audio generation endpoint and authorization token | |
| _, _, audio_tool, poll_token = initialize_tools() | |
| # Construct the full URL by appending the encoded instruction to the audio tool base URL | |
| url = f"{audio_tool}/{generate_audio_instruct}" | |
| # Define query parameters specifying the audio generation model and voice style to be used | |
| params = { | |
| "model": "openai-audio", # Specify the audio generation model identifier | |
| "voice": "echo" # Specify the voice style or effect to apply to the generated audio | |
| } | |
| # Prepare HTTP headers | |
| headers = { | |
| "Authorization": f"Bearer {poll_token}", # Bearer token for API authorization | |
| "X-Forwarded-For": generate_ip() # Random IP address for request header to simulate client origin | |
| } | |
| # Create an asynchronous HTTP client session to manage connections efficiently | |
| async with aiohttp.ClientSession() as session: | |
| """ | |
| This block manages the lifecycle of the HTTP client session, ensuring proper connection handling, | |
| resource cleanup, and support for asynchronous request execution to avoid blocking the event loop. | |
| """ | |
| # Send an asynchronous GET request to the audio generation service with specified URL, parameters, and headers | |
| async with session.get( | |
| url, # The fully constructed URL including the encoded instruction | |
| params=params, # Query parameters dictating model and voice options | |
| headers=headers # Authorization and client identity headers | |
| ) as resp: | |
| """ | |
| This context manages the HTTP response object, allowing inspection of status, headers, | |
| and content in an asynchronous manner, suitable for streaming or large payloads. | |
| """ | |
| # Verify that the response status is HTTP 200 OK and the content type indicates an audio MPEG file | |
| if resp.status == 200 and 'audio/mpeg' in resp.headers.get('Content-Type', ''): | |
| # Return the final URL from which the generated audio can be accessed or downloaded | |
| return str(resp.url) | |
| # If the response is not successful or content type is unexpected, raise an exception | |
| raise Exception() |