Spaces:
Running
Running
File size: 7,332 Bytes
b108c0c 2ec5e31 b108c0c 2ec5e31 b108c0c 2ec5e31 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
from fastapi import FastAPI, File, UploadFile, HTTPException
import speech_recognition as sr
from io import BytesIO
import os
from pydantic import BaseModel
import google.generativeai as genai
import openai
app = FastAPI()
def audio_to_text_intern(audio_data, language='fr-FR'):
with sr.AudioFile(audio_data) as source:
recognizer = sr.Recognizer()
audio = recognizer.record(source)
try:
text = recognizer.recognize_google(audio, language=language)
return text
except sr.UnknownValueError:
return "Unable to understand the audio"
except sr.RequestError as e:
return f"Service error: {e}"
def generate_job_description_gemini(input_text, key):
# Set up the model
import google.generativeai as genai
genai.configure(api_key=key)
prompt = f"""
Transforme le texte ci-dessous, qui est une transcription d'un enregistrement audio où un recruteur décrit un projet, en une description d'offre d'emploi complète et structurée. La description doit suivre le format ci-dessous :
1. Description de l'activité de l'entreprise :
2. Description du contexte du projet :
3. Objectifs et livrables identifiés :
4. Compétences fonctionnelles et techniques :
Texte :
"{input_text}"
La description d'offre d'emploi doit être détaillée et couvrir les points suivants :
- L'activité de l'entreprise et ses domaines d'expertise.
- Le contexte du projet et sa pertinence pour l'entreprise.
- Les objectifs spécifiques du projet et les livrables attendus.
- Les compétences techniques et fonctionnelles requises pour le poste, ainsi que les conditions de travail (par exemple, la possibilité de travail en remote et la rémunération)."""
generation_config = {
"temperature": 1,
"top_p": 0.95,
"max_output_tokens": 5000000,
}
model = genai.GenerativeModel(model_name="gemini-1.0-pro-latest",
generation_config=generation_config)
response = model.generate_content(prompt)
return response.text
def generate_job_description_gpt(input_text, key):
import openai
openai.api_key = key
prompt = f"""
Transforme le texte ci-dessous, qui est une transcription d'un enregistrement audio où un recruteur décrit un projet, en une description d'offre d'emploi complète et structurée. La description doit suivre le format ci-dessous :
1. Description de l'activité de l'entreprise :
2. Description du contexte du projet :
3. Objectifs et livrables identifiés :
4. Compétences fonctionnelles et techniques :
Texte :
"{input_text}"
La description d'offre d'emploi doit être détaillée et couvrir les points suivants :
- L'activité de l'entreprise et ses domaines d'expertise.
- Le contexte du projet et sa pertinence pour l'entreprise.
- Les objectifs spécifiques du projet et les livrables attendus.
- Les compétences techniques et fonctionnelles requises pour le poste, ainsi que les conditions de travail (par exemple, la possibilité de travail en remote et la rémunération)."""
generation_config = {
"temperature": 1,
"top_p": 0.95,
"max_output_tokens": 5000000,
}
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[
# {"role": "system", "content": "Vous êtes un createur de contenu qui génère des fausses réponses pour une question."},
{"role": "user", "content": prompt}
],
**generation_config
)
answers_text = response.choices[0].message['content']
return answers_text
@app.post("/audio-to-text/")
async def audio_to_text_endpoint(file: UploadFile, language: str = 'fr-FR'):
"""
Endpoint to upload an audio file and convert its content to text.
Args:
file (UploadFile): The audio file uploaded by the client. The file should be in .wav format.
language (str, optional): The language code to be used in speech-to-text conversion. Defaults to 'fr-FR' for French.
Returns:
dict: A dictionary containing the converted text under the key 'text'.
Raises:
HTTPException: An error 500 if there is any issue during the file processing.
"""
try:
# Read the audio file provided by the client
audio_data = await file.read()
# Convert byte data to a BytesIO object for processing
audio_stream = BytesIO(audio_data)
# Convert the audio stream to text using a speech-to-text conversion function
text = audio_to_text_intern(audio_stream, language)
# Return the converted text as part of the response
return {"text": text}
except Exception as e:
# Raise an HTTP 500 error if any exceptions occur
raise HTTPException(status_code=500, detail=f"An error occurred while processing the file: {e}")
@app.post("/audio-to-offer-with-gemini-endpoint/")
async def audio_to_offer_endpoint(file: UploadFile, language: str, api_key: str):
"""
Endpoint to convert uploaded audio content to a job offer text.
Parameters:
- file (UploadFile): The audio file uploaded by the client. The file should be in .wav format.
- language (str): Language code to guide the speech recognition process. Default is French ('fr-FR').
- api_key (str, optional): API key for accessing extended features or third-party services used in generating the job offer.
Returns:
- A JSON object with a key 'offer' containing the generated job description text based on the audio content.
Raises:
- HTTPException: If an error occurs during the processing of the audio or the generation of the job offer.
"""
try:
text_response = await audio_to_text_endpoint(file, language)
text = text_response["text"]
offer = generate_job_description_gemini(text, api_key)
return {"text": offer}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error generating job offer: {e}")
@app.post("/audio-to-offer-with-gpt-endpoint/")
async def audio_to_offer_endpoint(file: UploadFile, language: str, api_key: str):
"""
Endpoint to convert uploaded audio content to a job offer text.
Parameters:
- file (UploadFile): The audio file uploaded by the client. The file should be in .wav format.
- language (str): Language code to guide the speech recognition process. Default is French ('fr-FR').
- api_key (str, optional): API key for accessing extended features or third-party services used in generating the job offer.
Returns:
- A JSON object with a key 'offer' containing the generated job description text based on the audio content.
Raises:
- HTTPException: If an error occurs during the processing of the audio or the generation of the job offer.
"""
try:
text_response = await audio_to_text_endpoint(file, language)
text = text_response["text"]
offer = generate_job_description_gpt(text, api_key)
return {"text": offer}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error generating job offer: {e}")
|