From 89374d2418ad81a3088a679a1b9ef7bca2933b8e Mon Sep 17 00:00:00 2001 From: Tykayn Date: Mon, 30 Sep 2024 14:52:39 +0200 Subject: [PATCH] up --- .idea/.gitignore | 8 --- .idea/modules.xml | 8 --- .idea/transcription-vosk.iml | 11 ---- .idea/vcs.xml | 6 -- Makefile | 2 + base_transcript.sh | 74 +++++++++++++++++++++ en_test_base_transcript.sh | 74 +++++++++++++++++++++ english_transcript.sh | 121 +++++++++++++++++++++++++++++++++++ install.sh | 30 ++++++--- microphone.py | 80 +++++++++++++++++++++++ setup.py | 76 ++++++++++++++++++++++ transcribe_2.py | 58 +++++++++++++++++ transcript.sh | 15 ++--- vosk_builder.py | 14 ++++ 14 files changed, 527 insertions(+), 50 deletions(-) delete mode 100755 .idea/.gitignore delete mode 100755 .idea/modules.xml delete mode 100755 .idea/transcription-vosk.iml delete mode 100755 .idea/vcs.xml create mode 100644 base_transcript.sh create mode 100644 en_test_base_transcript.sh create mode 100755 english_transcript.sh create mode 100644 microphone.py create mode 100644 setup.py create mode 100644 transcribe_2.py create mode 100644 vosk_builder.py diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100755 index 73f69e0..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100755 index e393d9f..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/transcription-vosk.iml b/.idea/transcription-vosk.iml deleted file mode 100755 index c358824..0000000 --- a/.idea/transcription-vosk.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100755 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Makefile b/Makefile index b3a8726..9a35096 100755 --- a/Makefile +++ b/Makefile @@ -5,5 +5,7 @@ wav: bash inputs_to_wav.sh convert: bash transcript.sh $(args) +convert_en: + bash english_transcript.sh $(args) srt: perl clean.sh $(args) > output/clean.srt diff --git a/base_transcript.sh b/base_transcript.sh new file mode 100644 index 0000000..71b83e4 --- /dev/null +++ b/base_transcript.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# utilisation: bash transcript.sh MONFICHIER.wav +# auteur du script: tykayn contact@cipherbliss.com +file="input/already_converted/demo.wav" +echo "########### $(date) : conversion de fichier audio .WAV mono piste uniquement, + avec Vosk installé par pip3, et un modèle de textes en français." +echo " " +echo "########### $(date) : fichier : $file" + +FOLDER_MODEL="fr" + +# existence du modèle demandé +if [ -d "models/$FOLDER_MODEL" ]; then + echo "models/$FOLDER_MODEL le modèle est bien présent." +else + pwd + ls -l models + echo " " + echo "########### $(date) : [ERREUR] le modèle de données dans models/$FOLDER_MODEL n'existe pas, vérifiez son installation :C peut être avez vous oublié de faire une commande 'make'" + + exit 1 +fi +# existence du fichier demandé +if [ -f "$file" ]; then + echo "$file exists." +else + echo "########### $(date) : [ERREUR] voici les fichiers disponibles dans input/converted_to_wav: " + ls -l input/converted_to_wav + echo "########### $(date) : [ERREUR] le fichier $file n'existe PAS :C " + exit 1 +fi +echo " " +FILE_NAME=$(basename $file .wav) +OUT_DIR=$( echo "output/$FILE_NAME") +mkdir output/$FILE_NAME + +python3 ./extract_srt.py "$file" > $OUT_DIR/0_output.json + + + +echo " " +echo "########### $(date) : nettoyer la sortie " +jq .text $OUT_DIR/0_output.json > $OUT_DIR/1_converted.txt +jq .text $OUT_DIR/0_output_$FILE_NAME.json > $OUT_DIR/1_converted_$FILE_NAME.txt + +sed 's/null//g' $OUT_DIR/1_converted.txt > $OUT_DIR/2_without_nulls.txt +sed 's/^ *//; s/ *$//; /^$/d' $OUT_DIR/2_without_nulls.txt > $OUT_DIR/3_without_nulls.txt +sed 's/\"//g' $OUT_DIR/3_without_nulls.txt > $OUT_DIR/4_phrases.txt +sed 's/null//g' $OUT_DIR/1_converted_$FILE_NAME.txt > $OUT_DIR/2_without_nulls_$FILE_NAME.txt +sed 's/^ *//; s/ *$//; /^$/d' $OUT_DIR/2_without_nulls_$FILE_NAME.txt > $OUT_DIR/3_without_nulls_$FILE_NAME.txt +sed 's/\"//g' $OUT_DIR/3_without_nulls_$FILE_NAME.txt > $OUT_DIR/4_phrases_$FILE_NAME.txt +echo "########### $(date) : OK " +echo " " +COUNT_LINES=$(cat $OUT_DIR/phrases.txt |wc -l) +cat $OUT_DIR/4_phrases.txt +COUNT_LINES=$(cat $OUT_DIR/phrases_$FILE_NAME.txt |wc -l) +cat $OUT_DIR/4_phrases_$FILE_NAME.txt +echo " " +echo "########### $(date) : lignes transcriptes $COUNT_LINES " +echo "########### $(date) : conversion faite dans output/converted_out_without_nulls.txt" +echo "########### $(date) : conversion de la sortie en pseudo fichier de sous titres" +perl clean.sh $OUT_DIR/0_output.json > $OUT_DIR/5_phrases_min_sec.txt +perl clean.sh $OUT_DIR/0_output_$FILE_NAME.json > $OUT_DIR/5_phrases_min_sec_$FILE_NAME.txt +cat $OUT_DIR/5_phrases_min_sec.srt + +echo "########### $(date) : conversion de la sortie en fichier de sous titres " +python3 ./extract_srt.py "$file" > $OUT_DIR/5_output.srt +python3 ./extract_srt.py "$file" > $OUT_DIR/5_output_$FILE_NAME.srt + +ls -l $OUT_DIR + +echo "########### $(date) : conversion faite " +exit 0 + diff --git a/en_test_base_transcript.sh b/en_test_base_transcript.sh new file mode 100644 index 0000000..35a62e1 --- /dev/null +++ b/en_test_base_transcript.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# utilisation: bash transcript.sh MONFICHIER.wav +# auteur du script: tykayn contact@cipherbliss.com +file="input/already_converted/audio_drive_thru.wav" +echo "########### $(date) : conversion de fichier audio .WAV mono piste uniquement, + avec Vosk installé par pip3, et un modèle de textes en français." +echo " " +echo "########### $(date) : fichier : $file" + +FOLDER_MODEL="en" + +# existence du modèle demandé +if [ -d "models/$FOLDER_MODEL" ]; then + echo "models/$FOLDER_MODEL le modèle est bien présent." +else + pwd + ls -l models + echo " " + echo "########### $(date) : [ERREUR] le modèle de données dans models/$FOLDER_MODEL n'existe pas, vérifiez son installation :C peut être avez vous oublié de faire une commande 'make'" + + exit 1 +fi +# existence du fichier demandé +if [ -f "$file" ]; then + echo "$file exists." +else + echo "########### $(date) : [ERREUR] voici les fichiers disponibles dans input/converted_to_wav: " + ls -l input/converted_to_wav + echo "########### $(date) : [ERREUR] le fichier $file n'existe PAS :C " + exit 1 +fi +echo " " +FILE_NAME=$(basename $file .wav) +OUT_DIR=$( echo "output/$FILE_NAME") +mkdir -p output/$FILE_NAME + +python3 ./extract_srt_en.py "$file" > $OUT_DIR/0_output.json + + + +echo " " +echo "########### $(date) : nettoyer la sortie " +jq .text $OUT_DIR/0_output.json > $OUT_DIR/1_converted.txt +jq .text $OUT_DIR/0_output_$FILE_NAME.json > $OUT_DIR/1_converted_$FILE_NAME.txt + +sed 's/null//g' $OUT_DIR/1_converted.txt > $OUT_DIR/2_without_nulls.txt +sed 's/^ *//; s/ *$//; /^$/d' $OUT_DIR/2_without_nulls.txt > $OUT_DIR/3_without_nulls.txt +sed 's/\"//g' $OUT_DIR/3_without_nulls.txt > $OUT_DIR/4_phrases.txt +sed 's/null//g' $OUT_DIR/1_converted_$FILE_NAME.txt > $OUT_DIR/2_without_nulls_$FILE_NAME.txt +sed 's/^ *//; s/ *$//; /^$/d' $OUT_DIR/2_without_nulls_$FILE_NAME.txt > $OUT_DIR/3_without_nulls_$FILE_NAME.txt +sed 's/\"//g' $OUT_DIR/3_without_nulls_$FILE_NAME.txt > $OUT_DIR/4_phrases_$FILE_NAME.txt +echo "########### $(date) : OK " +echo " " +COUNT_LINES=$(cat $OUT_DIR/phrases.txt |wc -l) +cat $OUT_DIR/4_phrases.txt +COUNT_LINES=$(cat $OUT_DIR/phrases_$FILE_NAME.txt |wc -l) +cat $OUT_DIR/4_phrases_$FILE_NAME.txt +echo " " +echo "########### $(date) : lignes transcriptes $COUNT_LINES " +echo "########### $(date) : conversion faite dans output/converted_out_without_nulls.txt" +echo "########### $(date) : conversion de la sortie en pseudo fichier de sous titres" +perl clean.sh $OUT_DIR/0_output.json > $OUT_DIR/5_phrases_min_sec.txt +perl clean.sh $OUT_DIR/0_output_$FILE_NAME.json > $OUT_DIR/5_phrases_min_sec_$FILE_NAME.txt +cat $OUT_DIR/5_phrases_min_sec.srt + +echo "########### $(date) : conversion de la sortie en fichier de sous titres " +python3 ./extract_srt.py "$file" > $OUT_DIR/5_output.srt +python3 ./extract_srt.py "$file" > $OUT_DIR/5_output_$FILE_NAME.srt + +ls -l $OUT_DIR + +echo "########### $(date) : conversion faite " +exit 0 + diff --git a/english_transcript.sh b/english_transcript.sh new file mode 100755 index 0000000..e3b384c --- /dev/null +++ b/english_transcript.sh @@ -0,0 +1,121 @@ +#!/bin/bash +# utilisation: bash transcript.sh MONFICHIER.wav +# auteur du script: tykayn contact@cipherbliss.com +# ```bash +# bash transcript.sh myfile fr 1 +# ``` +echo " Transcript of a file - [file relative path \"input/aside/demo.wav\"] [lang en or fr] [enable srt conversion 1 or 0]" +# ----------------- Default parameters ----------------- +#ENABLE_SRT=false +ENABLE_SRT=true +# disponibles: "fr" ou "en", trouvez d'autres modèles prédéfinis https://alphacephei.com/vosk/models +#FOLDER_MODEL="fr" +FOLDER_MODEL="en" +DEFAULT_FILE_TO_TRANSCRIPT="input/aside/demo.wav" +STARTTIME=$(date +%s) + +# ----------------- prise en compte des arguments rentrés par l'utilisateur + echo "=====> langue: $FOLDER_MODEL" + echo "=====> fichier à convertir: $1" + +if [ $1 ]; then + file=$1 + + + else + echo "utilisation du fichier de démo" + file=$DEFAULT_FILE_TO_TRANSCRIPT +fi +if [ $2 ]; then + lang_to_search=$2 + else + lang_to_search=$FOLDER_MODEL +fi +if [ $3 ]; then + ENABLE_SRT=$3 + else + ENABLE_SRT=$ENABLE_SRT +fi + +echo " [file name]: $file, [lang]: $lang_to_search, [enable srt conversion]: $ENABLE_SRT." + +FILE_NAME=$(basename $file .wav) + +output_dir="output" +if [ $2 ]; then + output_dir=$2 +fi +OUT_DIR=$( echo "$output_dir/$FILE_NAME") + +echo "########### $(date) : conversion de fichier audio .WAV mono piste uniquement, + avec Vosk installé par pip3, et un modèle de textes en Anglais." +echo " " +echo "########### $(date) : fichier : $file : $1" + + +# ----------------- recherche de l'existence du modèle de langue demandé ----------------- +if [ -d "models/$lang_to_search" ]; then + echo "models/$lang_to_search le modèle est bien présent." +else + pwd + ls -l models + echo " " + echo "########### $(date) : [ERREUR] le modèle de données dans models/$lang_to_search n'existe pas, vérifiez son installation :C peut être avez vous oublié de faire une commande 'make'" + + exit 1 +fi +# ----------------- existence du fichier demandé ----------------- +if [ -f "$file" ]; then + echo "$file exists." +else + echo "########### $(date) : [ERREUR] fichier introuvable: $file" + echo "########### $(date) : [ERREUR] voici les fichiers disponibles dans input/converted_to_wav: " + echo " " + ls -l input/converted_to_wav + echo " " + echo "########### $(date) : [ERREUR] le fichier $file n'existe PAS :C " + exit 1 +fi +echo " " + +mkdir output/$FILE_NAME -p +echo " convertir en sous titre ? $ENABLE_SRT" +if ($ENABLE_SRT) ; then + echo "########### $(date) : conversion de $file ,sortie en fichier de sous titres .srt" + echo "" + echo "## (cela prend plusieurs minutes généralement 1 / 10ème du temps du fichier audio)" + echo "..." + python3 ./extract_srt.py "$file" > $OUT_DIR/6_output_$FILE_NAME.srt + cat $OUT_DIR/6_output_$FILE_NAME.srt + COUNT_LINES=$(cat $OUT_DIR/6_output_$FILE_NAME.srt |wc -l) + echo " " + echo "-------------- DONE ------------" + echo " $COUNT_LINES lines in $OUT_DIR/6_phrases_min_sec.srt" +else + echo "########### $(date) : conversion de la sortie en divers fichiers marquant les temps et sans marquage" + python3 ./conversion_simple_en.py "$file" > $OUT_DIR/0_output_$FILE_NAME.json + + echo " " + echo "########### $(date) : nettoyer la sortie " + jq .text $OUT_DIR/0_output_$FILE_NAME.json > $OUT_DIR/1_converted_$FILE_NAME.txt + + sed 's/null//g' $OUT_DIR/1_converted_$FILE_NAME.txt > $OUT_DIR/2_without_nulls_$FILE_NAME.txt + sed 's/^ *//; s/ *$//; /^$/d' $OUT_DIR/2_without_nulls_$FILE_NAME.txt > $OUT_DIR/3_without_nulls_$FILE_NAME.txt + sed 's/\"//g' $OUT_DIR/3_without_nulls_$FILE_NAME.txt > $OUT_DIR/4_phrases_$FILE_NAME.txt + echo "########### $(date) : OK " + echo " " + COUNT_LINES=$(cat $OUT_DIR/4_phrases_$FILE_NAME.txt |wc -l) + cat $OUT_DIR/4_phrases_$FILE_NAME.txt + echo " $COUNT_LINES lines in $OUT_DIR/4_phrases_$FILE_NAME.txt" + echo " " + echo "########### $(date) : lignes transcriptes $COUNT_LINES " + echo "########### $(date) : conversion faite dans output/converted_out_without_nulls.txt" + echo "########### $(date) : conversion de la sortie en pseudo fichier de sous titres" + perl clean.sh $OUT_DIR/0_output_$FILE_NAME.json > $OUT_DIR/5_phrases_min_sec_$FILE_NAME.txt + + +fi + +echo "########### $(date) : conversion faite " +echo "########### en $SECONDS seconds" +exit 0 diff --git a/install.sh b/install.sh index 3faac8b..e72a322 100755 --- a/install.sh +++ b/install.sh @@ -26,24 +26,35 @@ echo -e " ${reset}" pip3 -v install vosk echo "${green}########### récupération du modèle de reconnaissance en Français sous licence aGPL, taille: 1.6Go. Choix des modèles disponibles: https://alphacephei.com/vosk/models ${reset}" echo " " - mkdir -p models + mkdir -p models/fr echo -e "${green}########### Procéder au téléchargement du modèle Français (1.6go) pour transcrire les textes ?${reset} (écrivez o pour oui et faites entrée pour valider) ${reset}" read proceed # les autres modèles sont ici https://alphacephei.com/vosk/models if [[ $proceed == o* ]]; then echo "C'est parti." - f="vosk-model-fr-0.6-linto-2.2.0.zip" - if [ "x`find $f -printf %s`" != x1582884866 ]; then - wget https://alphacephei.com/vosk/models/$f + if [ ! -f "vosk-model-fr-0.6-linto-2.2.0.zip" ]; then + echo "Récupération du modèle en Français vosk-model-fr-0.6-linto-2.2.0.zip" + wget https://alphacephei.com/vosk/models/vosk-model-fr-0.6-linto-2.2.0.zip echo -e "${green}########### téléchargement du modèle OK ${reset}" + unzip vosk-model-fr-0.6-linto-2.2.0.zip + mv vosk-model-fr-0.6-linto-2.2.0 models/fr + echo -e "${green}########### décompression du modèle en Français OK ${reset}" + ls -l models/fr else - echo "fichier zip $f déjà présent" + echo "fichier zip vosk-model-fr-0.6-linto-2.2.0.zip déjà présent" + fi + if [ ! -f "vosk-model-en-us-0.42-gigaspeech.zip" ]; then + echo "Récupération du modèle en Anglais vosk-model-fr-0.6-linto-2.2.0.zip" + wget https://alphacephei.com/vosk/models/vosk-model-en-us-0.42-gigaspeech.zip + echo -e "${green}########### téléchargement du modèle OK ${reset}" + unzip vosk-model-en-us-0.42-gigaspeech.zip + mv vosk-model-en-us-0.42-gigaspeech.zip models/en + echo -e "${green}########### décompression du modèle en Français OK ${reset}" + ls -l models/en + else + echo "fichier zip vosk-model-fr-0.6-linto-2.2.0.zip déjà présent" fi - unzip $f - mv vosk-model-fr-0.6-linto-2.2.0 models/fr - echo -e "${green}########### décompression du modèle en Français OK ${reset}" - ls -l models/fr else echo -e "${green}########### vous n'avez pas souhaité télécharger le modèle ${reset}" echo -e "${green}########### fin de l'installation sans télécharger de modèle de langue ${reset}" @@ -53,3 +64,4 @@ fi echo -e "${green}########### installation ok ${reset}" +exit 0 \ No newline at end of file diff --git a/microphone.py b/microphone.py new file mode 100644 index 0000000..8d8722a --- /dev/null +++ b/microphone.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 + +import argparse +import queue +import sys +import sounddevice as sd + +from vosk import Model, KaldiRecognizer + +q = queue.Queue() + +def int_or_str(text): + """Helper function for argument parsing.""" + try: + return int(text) + except ValueError: + return text + +def callback(indata, frames, time, status): + """This is called (from a separate thread) for each audio block.""" + if status: + print(status, file=sys.stderr) + q.put(bytes(indata)) + +parser = argparse.ArgumentParser(add_help=False) +parser.add_argument( + "-l", "--list-devices", action="store_true", + help="show list of audio devices and exit") +args, remaining = parser.parse_known_args() +if args.list_devices: + print(sd.query_devices()) + parser.exit(0) +parser = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter, + parents=[parser]) +parser.add_argument( + "-f", "--filename", type=str, metavar="FILENAME", + help="audio file to store recording to") +parser.add_argument( + "-d", "--device", type=int_or_str, + help="input device (numeric ID or substring)") +parser.add_argument( + "-r", "--samplerate", type=int, help="sampling rate") +args = parser.parse_args(remaining) + +try: + if args.samplerate is None: + device_info = sd.query_devices(args.device, "input") + # soundfile expects an int, sounddevice provides a float: + args.samplerate = int(device_info["default_samplerate"]) + + model = Model("models/fr") + + if args.filename: + dump_fn = open(args.filename, "wb") + else: + dump_fn = None + + with sd.RawInputStream(samplerate=args.samplerate, blocksize = 8000, device=args.device, + dtype="int16", channels=1, callback=callback): + print("#" * 80) + print("Press Ctrl+C to stop the recording") + print("#" * 80) + + rec = KaldiRecognizer(model, args.samplerate) + while True: + data = q.get() + if rec.AcceptWaveform(data): + print(rec.Result()) + # else: + # print(rec.PartialResult()) + if dump_fn is not None: + dump_fn.write(data) + +except KeyboardInterrupt: + print("\nDone") + parser.exit(0) +except Exception as e: + parser.exit(type(e).__name__ + ": " + str(e)) diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..e2b532a --- /dev/null +++ b/setup.py @@ -0,0 +1,76 @@ +import os +import setuptools +import shutil +import glob +import platform + +# Figure out environment for cross-compile +vosk_source = os.getenv("VOSK_SOURCE", os.path.abspath(os.path.join(os.path.dirname(__file__), + ".."))) +system = os.environ.get('VOSK_PLATFORM', platform.system()) +architecture = os.environ.get('VOSK_ARCHITECTURE', platform.architecture()[0]) + +# Copy precompmilled libraries +for lib in glob.glob(os.path.join(vosk_source, "src/lib*.*")): + print ("Adding library", lib) + shutil.copy(lib, "vosk") + +# Create OS-dependent, but Python-independent wheels. +try: + from wheel.bdist_wheel import bdist_wheel +except ImportError: + cmdclass = {} +else: + class bdist_wheel_tag_name(bdist_wheel): + def get_tag(self): + abi = 'none' + if system == 'Darwin': + oses = 'macosx_10_6_universal2' + elif system == 'Windows' and architecture == '32bit': + oses = 'win32' + elif system == 'Windows' and architecture == '64bit': + oses = 'win_amd64' + elif system == 'Linux' and architecture == '64bit': + oses = 'linux_x86_64' + elif system == 'Linux' and architecture == 'aarch64': + oses = 'manylinux2014_aarch64' + elif system == 'Linux': + oses = 'linux_' + architecture + else: + raise TypeError("Unknown build environment") + return 'py3', abi, oses + cmdclass = {'bdist_wheel': bdist_wheel_tag_name} + +with open("README.md", "rb") as fh: + long_description = fh.read().decode("utf-8") + +setuptools.setup( + name="vosk", + version="0.3.43", + author="Alpha Cephei Inc", + author_email="contact@alphacephei.com", + description="Offline open source speech recognition API based on Kaldi and Vosk", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/alphacep/vosk-api", + packages=setuptools.find_packages(), + package_data = {'vosk': ['*.so', '*.dll', '*.dyld']}, + entry_points = { + 'console_scripts': ['vosk-transcriber=vosk.transcriber.cli:main'], + }, + include_package_data=True, + classifiers=[ + 'Programming Language :: Python :: 3', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX :: Linux', + 'Operating System :: MacOS :: MacOS X', + 'Topic :: Software Development :: Libraries :: Python Modules' + ], + cmdclass=cmdclass, + python_requires='>=3', + zip_safe=False, # Since we load so file from the filesystem, we can not run from zip file + setup_requires=['cffi>=1.0', 'requests', 'tqdm', 'srt', 'websockets'], + install_requires=['cffi>=1.0', 'requests', 'tqdm', 'srt', 'websockets'], + cffi_modules=['vosk_builder.py:ffibuilder'], +) diff --git a/transcribe_2.py b/transcribe_2.py new file mode 100644 index 0000000..f8886ff --- /dev/null +++ b/transcribe_2.py @@ -0,0 +1,58 @@ +from vosk import Model, KaldiRecognizer, SetLogLevel +from tqdm.notebook import tqdm +import wave +import os +import json + +def transcript_file(input_file, model_path): + + # Check if file exists + if not os.path.isfile(input_file): + raise FileNotFoundError(os.path.basename(input_file) + " not found") + + # Check if model path exists + if not os.path.exists(model_path): + raise FileNotFoundError(os.path.basename(model_path) + " not found") + + # open audio file + wf = wave.open(input_file, "rb") + + # check if wave file has the right properties + if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE": + raise TypeError("Audio file must be WAV format mono PCM.") + + # Initialize model + model = Model(model_path) + rec = KaldiRecognizer(model, wf.getframerate()) + + # Get file size (to calculate progress bar) + file_size = os.path.getsize(input_file) + + # Run transcription + pbar = tqdm(total=file_size) + + # To store our results + transcription = [] + + while True: + data = wf.readframes(4000) # use buffer of 4000 + pbar.update(len(data)) + if len(data) == 0: + pbar.set_description("Transcription finished") + break + if rec.AcceptWaveform(data): + # Convert json output to dict + result_dict = json.loads(rec.Result()) + # Extract text values and append them to transcription list + transcription.append(result_dict.get("text", "")) + + # Get final bits of audio and flush the pipeline + final_result = json.loads(rec.FinalResult()) + transcription.append(final_result.get("text", "")) + + transcription_text = ' '.join(transcription) + + return transcription_text + +wave_file = '/input/already_converted/drive_thu.wav' +transcription = transcript_file(wave_file, 'models/en') diff --git a/transcript.sh b/transcript.sh index 241600d..fe21812 100755 --- a/transcript.sh +++ b/transcript.sh @@ -6,8 +6,8 @@ # ``` echo " Transcript of a file - [file relative path \"input/aside/demo.wav\"] [lang en or fr] [enable srt conversion 1 or 0]" # ----------------- Default parameters ----------------- -ENABLE_SRT=false -#ENABLE_SRT=true +#ENABLE_SRT=false +ENABLE_SRT=true # disponibles: "fr" ou "en", trouvez d'autres modèles prédéfinis https://alphacephei.com/vosk/models FOLDER_MODEL="fr" #FOLDER_MODEL="en" @@ -15,12 +15,11 @@ DEFAULT_FILE_TO_TRANSCRIPT="input/aside/demo.wav" STARTTIME=$(date +%s) # ----------------- prise en compte des arguments rentrés par l'utilisateur - echo "fichier à convertir: $1" - + echo "=====> langue: $FOLDER_MODEL" + echo "=====> fichier à convertir: $1" + if [ $1 ]; then file=$1 - - else echo "utilisation du fichier de démo" file=$DEFAULT_FILE_TO_TRANSCRIPT @@ -82,7 +81,7 @@ echo " convertir en sous titre ? $ENABLE_SRT" if ($ENABLE_SRT) ; then echo "########### $(date) : conversion de $file ,sortie en fichier de sous titres .srt" echo "" - echo "## (cela prend plusieurs minutes généralement 1 / 10ème du temps du fichier audio)" + echo "## (cela prend plusieurs minutes généralement 1 / 10ème du temps du fichier audio)" echo "..." python3 ./extract_srt.py "$file" > $OUT_DIR/6_output_$FILE_NAME.srt cat $OUT_DIR/6_output_$FILE_NAME.srt @@ -116,6 +115,6 @@ else fi #ls -l $OUT_DIR -echo "########### $(STARTTIME) -- $(date) : conversion faite " +echo "########### $($STARTTIME) -- $(date) : conversion faite " echo "########### en $SECONDS seconds" exit 0 diff --git a/vosk_builder.py b/vosk_builder.py new file mode 100644 index 0000000..902910d --- /dev/null +++ b/vosk_builder.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +import os +from cffi import FFI + +vosk_root=os.environ.get("VOSK_SOURCE", "..") +cpp_command = "cpp " + vosk_root + "/src/vosk_api.h" + +ffibuilder = FFI() +ffibuilder.set_source("vosk.vosk_cffi", None) +ffibuilder.cdef(os.popen(cpp_command).read()) + +if __name__ == '__main__': + ffibuilder.compile(verbose=True)