Spaces:
Sleeping
Sleeping
import os | |
from smolagents import tool # Assuming smolagents.tool is the correct decorator | |
def transcribe_mp3_audio_file(mp3_file_path: str) -> str: | |
""" | |
Transcribes an MP3 audio file using OpenAI's Whisper 'base' model. | |
Args: | |
mp3_file_path (str): The absolute local path to the MP3 audio file. | |
This path should be obtained from the 'File Information' section | |
if the file was downloaded by the agent. | |
Returns: | |
str: The transcribed text from the audio file, or an error message if transcription fails. | |
""" | |
try: | |
import whisper # Attempt to import whisper only when the tool is called | |
except ImportError: | |
return ("Error: The 'openai-whisper' library is required but not installed. " | |
"Please install it using 'pip install openai-whisper' and ensure ffmpeg is also installed.") | |
if not os.path.exists(mp3_file_path): | |
return f"Error: Audio file not found at the specified path: '{mp3_file_path}'. Please verify the path." | |
if not mp3_file_path.lower().endswith(".mp3"): | |
return f"Error: The provided file path '{mp3_file_path}' does not appear to be an MP3 file. This tool currently only supports .mp3 files." | |
try: | |
print( | |
f"AudioTool: Loading Whisper 'base' model to transcribe '{mp3_file_path}'...") | |
# You can choose different model sizes: "tiny", "base", "small", "medium", "large" | |
# "base" is a good balance of speed and accuracy for many use cases. | |
# Larger models are more accurate but slower and require more resources. | |
model = whisper.load_model("base") | |
print(f"AudioTool: Transcribing audio from '{mp3_file_path}'...") | |
# fp16=False can improve compatibility on CPU | |
result = model.transcribe(mp3_file_path, fp16=False) | |
transcribed_text = result.get("text", "") | |
if transcribed_text: | |
print( | |
f"AudioTool: Transcription successful for '{mp3_file_path}'.") | |
return transcribed_text | |
else: | |
# This case might occur if the audio is silent or whisper couldn't detect speech | |
return f"Notice: Transcription resulted in empty text for '{mp3_file_path}'. The audio might be silent or contain no clear speech." | |
except FileNotFoundError: # Should be caught by os.path.exists, but as a fallback for whisper's internal handling | |
return f"Error: Whisper could not find the audio file at path: '{mp3_file_path}' (even if it was initially detected)." | |
except Exception as e: | |
# Check if the error is due to ffmpeg not being found | |
if "ffmpeg" in str(e).lower() and ("not found" in str(e).lower() or "not installed" in str(e).lower()): | |
return ("Error during transcription: ffmpeg not found. " | |
"OpenAI Whisper requires ffmpeg to be installed and in your system's PATH. " | |
f"Details: {type(e).__name__} - {str(e)}") | |
return f"Error during audio transcription for '{mp3_file_path}': {type(e).__name__} - {str(e)}" | |
if __name__ == '__main__': | |
# This is a placeholder for testing. | |
# To test, you would need an actual MP3 file. | |
# For example: | |
# test_mp3_path = "path/to/your/test_audio.mp3" | |
# if os.path.exists(test_mp3_path): | |
# print(f"--- Testing with MP3 file: {test_mp3_path} ---") | |
# transcript = transcribe_mp3_audio_file(test_mp3_path) | |
# print("Transcription Result:") | |
# print(transcript) | |
# else: | |
# print(f"Test MP3 file not found at: {test_mp3_path}. Cannot run local test.") | |
print("Audio transcription tool defined. To test, provide a path to an MP3 file in the example block.") | |
# Test with a non-existent file | |
print("\n--- Testing with non-existent file ---") | |
print(transcribe_mp3_audio_file("non_existent_file.mp3")) | |
# Test with a non-mp3 file | |
print("\n--- Testing with non-MP3 file extension ---") | |
# Create a dummy file for this test | |
dummy_file = "dummy.txt" | |
with open(dummy_file, "w") as f: | |
f.write("this is not an mp3") | |
print(transcribe_mp3_audio_file(dummy_file)) | |
os.remove(dummy_file) | |