Dans notre monde globalisé, la communication au-delà des frontières linguistiques est plus essentielle que jamais. Dans cet article, nous explorerons comment mettre en place cette technologie pour rendre la communication plus inclusive et accessible à tous.
Le code est disponible ici
sur mon github
Première chose à faire, c’est d’installer les dépendances
blinker==1.8.2cachetools==5.5.0certifi==2024.8.30chardet==3.0.4charset-normalizer==3.4.0click==8.1.7colorama==0.4.6Flask==3.0.3google-api-core==2.22.0google-auth==2.36.0google-cloud-texttospeech==2.21.0googleapis-common-protos==1.65.0googletrans==4.0.0rc1grpcio==1.67.1grpcio-status==1.67.1gTTS==2.5.3h11==0.9.0h2==3.2.0hpack==3.0.0hstspreload==2024.11.1httpcore==0.9.1httpx==0.13.3hyperframe==5.2.0idna==2.10itsdangerous==2.2.0Jinja2==3.1.4Levenshtein==0.26.1MarkupSafe==3.0.2playsound==1.2.2prompt_toolkit==3.0.48proto-plus==1.25.0protobuf==5.28.3pyasn1==0.6.1pyasn1_modules==0.4.1PyAudio==0.2.14python-Levenshtein==0.26.1RapidFuzz==3.10.1requests==2.32.3rfc3986==1.5.0rsa==4.9sniffio==1.3.1SpeechRecognition==3.11.0typing_extensions==4.12.2urllib3==2.2.3wcwidth==0.2.13Werkzeug==3.1.2wit==6.0.1blinker==1.8.2 cachetools==5.5.0 certifi==2024.8.30 chardet==3.0.4 charset-normalizer==3.4.0 click==8.1.7 colorama==0.4.6 Flask==3.0.3 google-api-core==2.22.0 google-auth==2.36.0 google-cloud-texttospeech==2.21.0 googleapis-common-protos==1.65.0 googletrans==4.0.0rc1 grpcio==1.67.1 grpcio-status==1.67.1 gTTS==2.5.3 h11==0.9.0 h2==3.2.0 hpack==3.0.0 hstspreload==2024.11.1 httpcore==0.9.1 httpx==0.13.3 hyperframe==5.2.0 idna==2.10 itsdangerous==2.2.0 Jinja2==3.1.4 Levenshtein==0.26.1 MarkupSafe==3.0.2 playsound==1.2.2 prompt_toolkit==3.0.48 proto-plus==1.25.0 protobuf==5.28.3 pyasn1==0.6.1 pyasn1_modules==0.4.1 PyAudio==0.2.14 python-Levenshtein==0.26.1 RapidFuzz==3.10.1 requests==2.32.3 rfc3986==1.5.0 rsa==4.9 sniffio==1.3.1 SpeechRecognition==3.11.0 typing_extensions==4.12.2 urllib3==2.2.3 wcwidth==0.2.13 Werkzeug==3.1.2 wit==6.0.1blinker==1.8.2 cachetools==5.5.0 certifi==2024.8.30 chardet==3.0.4 charset-normalizer==3.4.0 click==8.1.7 colorama==0.4.6 Flask==3.0.3 google-api-core==2.22.0 google-auth==2.36.0 google-cloud-texttospeech==2.21.0 googleapis-common-protos==1.65.0 googletrans==4.0.0rc1 grpcio==1.67.1 grpcio-status==1.67.1 gTTS==2.5.3 h11==0.9.0 h2==3.2.0 hpack==3.0.0 hstspreload==2024.11.1 httpcore==0.9.1 httpx==0.13.3 hyperframe==5.2.0 idna==2.10 itsdangerous==2.2.0 Jinja2==3.1.4 Levenshtein==0.26.1 MarkupSafe==3.0.2 playsound==1.2.2 prompt_toolkit==3.0.48 proto-plus==1.25.0 protobuf==5.28.3 pyasn1==0.6.1 pyasn1_modules==0.4.1 PyAudio==0.2.14 python-Levenshtein==0.26.1 RapidFuzz==3.10.1 requests==2.32.3 rfc3986==1.5.0 rsa==4.9 sniffio==1.3.1 SpeechRecognition==3.11.0 typing_extensions==4.12.2 urllib3==2.2.3 wcwidth==0.2.13 Werkzeug==3.1.2 wit==6.0.1
Enter fullscreen mode Exit fullscreen mode
Convertion audio to text
from gtts import gTTSimport playsoundimport osdef speak_translation(text, lang):tts = gTTS(text=text, lang=lang)filename = "translation.mp3"tts.save(filename)playsound.playsound(filename)os.remove(filename)from gtts import gTTS import playsound import os def speak_translation(text, lang): tts = gTTS(text=text, lang=lang) filename = "translation.mp3" tts.save(filename) playsound.playsound(filename) os.remove(filename)from gtts import gTTS import playsound import os def speak_translation(text, lang): tts = gTTS(text=text, lang=lang) filename = "translation.mp3" tts.save(filename) playsound.playsound(filename) os.remove(filename)
Enter fullscreen mode Exit fullscreen mode
Google cloud text Speech
from google.cloud import texttospeechdef synthesize_speech(text, language_code="wo-WO", voice_name="wo-WO-Standard-A", output_file="output.mp3"):client = texttospeech.TextToSpeechClient()input_text = texttospeech.SynthesisInput(text=text)# Configurez la voix pour le Wolofvoice = texttospeech.VoiceSelectionParams(language_code=language_code,name=voice_name,ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL,)# Paramètres audioaudio_config = texttospeech.AudioConfig(audio_encoding=texttospeech.AudioEncoding.MP3)# Synthèse vocaleresponse = client.synthesize_speech(input=input_text, voice=voice, audio_config=audio_config)# Sauvegarder le fichier audiowith open(output_file, "wb") as out:out.write(response.audio_content)print(f"Audio content written to file {output_file}")# Utilisez cette fonction avec votre textesynthesize_speech("Bonjour, je teste la traduction en Wolof.", "wo-WO")from google.cloud import texttospeech def synthesize_speech(text, language_code="wo-WO", voice_name="wo-WO-Standard-A", output_file="output.mp3"): client = texttospeech.TextToSpeechClient() input_text = texttospeech.SynthesisInput(text=text) # Configurez la voix pour le Wolof voice = texttospeech.VoiceSelectionParams( language_code=language_code, name=voice_name, ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL, ) # Paramètres audio audio_config = texttospeech.AudioConfig( audio_encoding=texttospeech.AudioEncoding.MP3 ) # Synthèse vocale response = client.synthesize_speech( input=input_text, voice=voice, audio_config=audio_config ) # Sauvegarder le fichier audio with open(output_file, "wb") as out: out.write(response.audio_content) print(f"Audio content written to file {output_file}") # Utilisez cette fonction avec votre texte synthesize_speech("Bonjour, je teste la traduction en Wolof.", "wo-WO")from google.cloud import texttospeech def synthesize_speech(text, language_code="wo-WO", voice_name="wo-WO-Standard-A", output_file="output.mp3"): client = texttospeech.TextToSpeechClient() input_text = texttospeech.SynthesisInput(text=text) # Configurez la voix pour le Wolof voice = texttospeech.VoiceSelectionParams( language_code=language_code, name=voice_name, ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL, ) # Paramètres audio audio_config = texttospeech.AudioConfig( audio_encoding=texttospeech.AudioEncoding.MP3 ) # Synthèse vocale response = client.synthesize_speech( input=input_text, voice=voice, audio_config=audio_config ) # Sauvegarder le fichier audio with open(output_file, "wb") as out: out.write(response.audio_content) print(f"Audio content written to file {output_file}") # Utilisez cette fonction avec votre texte synthesize_speech("Bonjour, je teste la traduction en Wolof.", "wo-WO")
Enter fullscreen mode Exit fullscreen mode
Translation
from googletrans import Translatordef translate_text(text, target_lang):try:translator = Translator()translation = translator.translate(text, dest=target_lang)print(f"Traduction : {translation.text}")return translation.textexcept Exception as e:print(f"Erreur lors de la traduction : {e}")return "Traduction non disponible"from googletrans import Translator def translate_text(text, target_lang): try: translator = Translator() translation = translator.translate(text, dest=target_lang) print(f"Traduction : {translation.text}") return translation.text except Exception as e: print(f"Erreur lors de la traduction : {e}") return "Traduction non disponible"from googletrans import Translator def translate_text(text, target_lang): try: translator = Translator() translation = translator.translate(text, dest=target_lang) print(f"Traduction : {translation.text}") return translation.text except Exception as e: print(f"Erreur lors de la traduction : {e}") return "Traduction non disponible"
Enter fullscreen mode Exit fullscreen mode
Voice detection
import speech_recognition as srdef record_audio():recognizer = sr.Recognizer()with sr.Microphone() as source:print("Parlez maintenant...")audio = recognizer.listen(source)try:text = recognizer.recognize_google(audio, language="fr-FR")print(f"Vous avez dit : {text}")return textexcept sr.UnknownValueError:print("Désolé, je n'ai pas compris.")except sr.RequestError as e:print(f"Erreur de service : {e}")import speech_recognition as sr def record_audio(): recognizer = sr.Recognizer() with sr.Microphone() as source: print("Parlez maintenant...") audio = recognizer.listen(source) try: text = recognizer.recognize_google(audio, language="fr-FR") print(f"Vous avez dit : {text}") return text except sr.UnknownValueError: print("Désolé, je n'ai pas compris.") except sr.RequestError as e: print(f"Erreur de service : {e}")import speech_recognition as sr def record_audio(): recognizer = sr.Recognizer() with sr.Microphone() as source: print("Parlez maintenant...") audio = recognizer.listen(source) try: text = recognizer.recognize_google(audio, language="fr-FR") print(f"Vous avez dit : {text}") return text except sr.UnknownValueError: print("Désolé, je n'ai pas compris.") except sr.RequestError as e: print(f"Erreur de service : {e}")
Enter fullscreen mode Exit fullscreen mode
Witai params:
Il faut se rendre sur l’api de Meta (Facebook) pour créer votre jeton
import requestsWIT_AI_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'def send_to_wit(text):headers = {'Authorization': f'Bearer {WIT_AI_TOKEN}'}response = requests.get(f'https://api.wit.ai/message?v=20230414&q={text}', headers=headers)return response.json()import requests WIT_AI_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' def send_to_wit(text): headers = {'Authorization': f'Bearer {WIT_AI_TOKEN}'} response = requests.get(f'https://api.wit.ai/message?v=20230414&q={text}', headers=headers) return response.json()import requests WIT_AI_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' def send_to_wit(text): headers = {'Authorization': f'Bearer {WIT_AI_TOKEN}'} response = requests.get(f'https://api.wit.ai/message?v=20230414&q={text}', headers=headers) return response.json()
Enter fullscreen mode Exit fullscreen mode
Le fichier main
from flask import Flask, request, jsonifyfrom convertion_audio_to_text import speak_translationfrom translation import translate_textfrom voice_detection import record_audiofrom witai_params import send_to_witimport Levenshteinapp = Flask(__name__)# Langues disponiblesAVAILABLE_LANGUAGES = {"sw": "Swahili","wo": "Wolof","fon": "Fon","en": "Anglais","fr": "Français"}def calculate_score(reference_text, user_text):similarity = Levenshtein.ratio(reference_text.lower(), user_text.lower()) * 100return round(similarity, 2)@app.route('/available_languages', methods=['GET'])def available_languages():"""Retourne les langues disponibles pour la traduction."""return jsonify(AVAILABLE_LANGUAGES)@app.route('/process_audio', methods=['POST'])def process_audio():"""Traite l'audio, traduit le texte et évalue la prononciation."""try:# Étape 1 : Récupérer la langue cible depuis la requêtetarget_lang = request.json.get('target_lang')if not target_lang:return jsonify({"error": "Paramètre 'target_lang' manquant"}), 400if target_lang not in AVAILABLE_LANGUAGES:return jsonify({"error": f"Langue cible '{target_lang}' non supportée.","available_languages": AVAILABLE_LANGUAGES # Retourner la liste des langues disponibles}), 400# Étape 2 : Traduire le texte initialtext = record_audio()if not text:return jsonify({"error": "No audio detected or transcription failed"}), 400wit_response = send_to_wit(text)print("Wit.ai Response:", wit_response)translation = translate_text(text, target_lang)speak_translation(translation, lang=target_lang)# Étape 3 : Boucle de répétition pour évaluer la prononciationscore = 0while score < 80:repeat_text = record_audio()if not repeat_text:return jsonify({"error": "No repeated audio detected"}), 400score = calculate_score(translation, repeat_text)if score >= 80:message = "Bravo! Félicitations, vous êtes un génie!"return jsonify({"original_text": text,"wit_response": wit_response,"translated_text": translation,"repeated_text": repeat_text,"score": score,"message": message}), 200elif score < 45:message = "Votre score est faible, améliorez-vous en vous entraînant."else:message = "Pas mal! Vous pouvez encore améliorer."return jsonify({"translated_text": translation,"repeated_text": repeat_text,"score": score,"message": message,"retry": True})except Exception as e:return jsonify({"error": str(e)}), 500if __name__ == '__main__':app.run(debug=True)"""tu peux tester avec ce code dans le navigateur, tu decommente, puis tu le met la ou il faut@app.route('/process_audio', methods=['GET', 'POST'])def process_audio():if request.method == 'GET':return jsonify({"message": "Utilisez une requête POST pour traiter l'audio."})# Continue avec la logique POSTtry:text = record_audio()if not text:return jsonify({"error": "No audio detected or transcription failed"}), 400wit_response = send_to_wit(text)print("Wit.ai Response:", wit_response)target_lang = request.json.get('target_lang', 'sw')translation = translate_text(text, target_lang)speak_translation(translation, lang=target_lang)return jsonify({"original_text": text,"wit_response": wit_response,"translated_text": translation}), 200except Exception as e:return jsonify({"error": str(e)}), 500"""from flask import Flask, request, jsonify from convertion_audio_to_text import speak_translation from translation import translate_text from voice_detection import record_audio from witai_params import send_to_wit import Levenshtein app = Flask(__name__) # Langues disponibles AVAILABLE_LANGUAGES = { "sw": "Swahili", "wo": "Wolof", "fon": "Fon", "en": "Anglais", "fr": "Français" } def calculate_score(reference_text, user_text): similarity = Levenshtein.ratio(reference_text.lower(), user_text.lower()) * 100 return round(similarity, 2) @app.route('/available_languages', methods=['GET']) def available_languages(): """Retourne les langues disponibles pour la traduction.""" return jsonify(AVAILABLE_LANGUAGES) @app.route('/process_audio', methods=['POST']) def process_audio(): """Traite l'audio, traduit le texte et évalue la prononciation.""" try: # Étape 1 : Récupérer la langue cible depuis la requête target_lang = request.json.get('target_lang') if not target_lang: return jsonify({"error": "Paramètre 'target_lang' manquant"}), 400 if target_lang not in AVAILABLE_LANGUAGES: return jsonify({ "error": f"Langue cible '{target_lang}' non supportée.", "available_languages": AVAILABLE_LANGUAGES # Retourner la liste des langues disponibles }), 400 # Étape 2 : Traduire le texte initial text = record_audio() if not text: return jsonify({"error": "No audio detected or transcription failed"}), 400 wit_response = send_to_wit(text) print("Wit.ai Response:", wit_response) translation = translate_text(text, target_lang) speak_translation(translation, lang=target_lang) # Étape 3 : Boucle de répétition pour évaluer la prononciation score = 0 while score < 80: repeat_text = record_audio() if not repeat_text: return jsonify({"error": "No repeated audio detected"}), 400 score = calculate_score(translation, repeat_text) if score >= 80: message = "Bravo! Félicitations, vous êtes un génie!" return jsonify({ "original_text": text, "wit_response": wit_response, "translated_text": translation, "repeated_text": repeat_text, "score": score, "message": message }), 200 elif score < 45: message = "Votre score est faible, améliorez-vous en vous entraînant." else: message = "Pas mal! Vous pouvez encore améliorer." return jsonify({ "translated_text": translation, "repeated_text": repeat_text, "score": score, "message": message, "retry": True }) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(debug=True) """ tu peux tester avec ce code dans le navigateur, tu decommente, puis tu le met la ou il faut @app.route('/process_audio', methods=['GET', 'POST']) def process_audio(): if request.method == 'GET': return jsonify({"message": "Utilisez une requête POST pour traiter l'audio."}) # Continue avec la logique POST try: text = record_audio() if not text: return jsonify({"error": "No audio detected or transcription failed"}), 400 wit_response = send_to_wit(text) print("Wit.ai Response:", wit_response) target_lang = request.json.get('target_lang', 'sw') translation = translate_text(text, target_lang) speak_translation(translation, lang=target_lang) return jsonify({ "original_text": text, "wit_response": wit_response, "translated_text": translation }), 200 except Exception as e: return jsonify({"error": str(e)}), 500 """from flask import Flask, request, jsonify from convertion_audio_to_text import speak_translation from translation import translate_text from voice_detection import record_audio from witai_params import send_to_wit import Levenshtein app = Flask(__name__) # Langues disponibles AVAILABLE_LANGUAGES = { "sw": "Swahili", "wo": "Wolof", "fon": "Fon", "en": "Anglais", "fr": "Français" } def calculate_score(reference_text, user_text): similarity = Levenshtein.ratio(reference_text.lower(), user_text.lower()) * 100 return round(similarity, 2) @app.route('/available_languages', methods=['GET']) def available_languages(): """Retourne les langues disponibles pour la traduction.""" return jsonify(AVAILABLE_LANGUAGES) @app.route('/process_audio', methods=['POST']) def process_audio(): """Traite l'audio, traduit le texte et évalue la prononciation.""" try: # Étape 1 : Récupérer la langue cible depuis la requête target_lang = request.json.get('target_lang') if not target_lang: return jsonify({"error": "Paramètre 'target_lang' manquant"}), 400 if target_lang not in AVAILABLE_LANGUAGES: return jsonify({ "error": f"Langue cible '{target_lang}' non supportée.", "available_languages": AVAILABLE_LANGUAGES # Retourner la liste des langues disponibles }), 400 # Étape 2 : Traduire le texte initial text = record_audio() if not text: return jsonify({"error": "No audio detected or transcription failed"}), 400 wit_response = send_to_wit(text) print("Wit.ai Response:", wit_response) translation = translate_text(text, target_lang) speak_translation(translation, lang=target_lang) # Étape 3 : Boucle de répétition pour évaluer la prononciation score = 0 while score < 80: repeat_text = record_audio() if not repeat_text: return jsonify({"error": "No repeated audio detected"}), 400 score = calculate_score(translation, repeat_text) if score >= 80: message = "Bravo! Félicitations, vous êtes un génie!" return jsonify({ "original_text": text, "wit_response": wit_response, "translated_text": translation, "repeated_text": repeat_text, "score": score, "message": message }), 200 elif score < 45: message = "Votre score est faible, améliorez-vous en vous entraînant." else: message = "Pas mal! Vous pouvez encore améliorer." return jsonify({ "translated_text": translation, "repeated_text": repeat_text, "score": score, "message": message, "retry": True }) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(debug=True) """ tu peux tester avec ce code dans le navigateur, tu decommente, puis tu le met la ou il faut @app.route('/process_audio', methods=['GET', 'POST']) def process_audio(): if request.method == 'GET': return jsonify({"message": "Utilisez une requête POST pour traiter l'audio."}) # Continue avec la logique POST try: text = record_audio() if not text: return jsonify({"error": "No audio detected or transcription failed"}), 400 wit_response = send_to_wit(text) print("Wit.ai Response:", wit_response) target_lang = request.json.get('target_lang', 'sw') translation = translate_text(text, target_lang) speak_translation(translation, lang=target_lang) return jsonify({ "original_text": text, "wit_response": wit_response, "translated_text": translation }), 200 except Exception as e: return jsonify({"error": str(e)}), 500 """
Enter fullscreen mode Exit fullscreen mode
Concevoir un bot devient de plus en plus facile aujourd’hui pour résoudre des problèmes complexes de notre quotidien. Cependant, cela n’exclut pas l’importance d’apprendre les langues par soi-même. L’utilisation de technologies comme BotAI pour la traduction vocale instantanée doit servir principalement à enrichir nos interactions dans des contextes complexes. En combinant ces outils avec un apprentissage personnel des langues, nous favorisons une communication plus efficace tout en valorisant la richesse linguistique individuelle.
Le code est disponible ici
sur mon github
原文链接:Comment créer un bot de traduction vocale instantané avec witai
暂无评论内容