Add files via upload
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
from autotranscript.__main__ import *
|
||||
from autotranscript.version import get_version as _get_version
|
||||
|
||||
__version__ = _get_version()
|
||||
@@ -0,0 +1,126 @@
|
||||
|
||||
import whisper
|
||||
from time import time
|
||||
import os
|
||||
from moviepy.editor import *
|
||||
from typing import Union
|
||||
|
||||
class Transcribe:
|
||||
def __init__(self, audiofile : Union[bool, str, list] = None, model : str = "medium", language :str = "German"):
|
||||
"""
|
||||
Class to autotranscript audio and video files with the Whisper model
|
||||
:param audiofile: audio file or list of audio files
|
||||
:param model: model to use for transcription
|
||||
:param language: language of the audio file
|
||||
"""
|
||||
|
||||
self.audiofile = audiofile
|
||||
|
||||
self.language = language
|
||||
|
||||
"""
|
||||
Create folder structure
|
||||
"""
|
||||
|
||||
self.currentpath,\
|
||||
self.audiopath,\
|
||||
self.transcriptionpath,\
|
||||
self.audiofiles = self.create_folder_structure() # create folder structure
|
||||
|
||||
print("loading model")
|
||||
self.model = whisper.load_model(model) # load model
|
||||
print("model loaded")
|
||||
|
||||
def create_folder_structure(self):
|
||||
"""
|
||||
Create folder structure for audio and transcription files
|
||||
|
||||
:return: currentpath, audiopath, transcriptionpath, audiofiles
|
||||
"""
|
||||
currentpath = os.getcwd() # get current path
|
||||
|
||||
if not os.path.exists(os.path.join(currentpath, 'audiofiles')):
|
||||
print('Creating audiofiles folder')
|
||||
os.makedirs(os.path.join(currentpath, 'audiofiles'))
|
||||
if not os.path.exists(os.path.join(currentpath, 'transcription')):
|
||||
print('Creating transcription folder')
|
||||
os.makedirs(os.path.join(currentpath, 'transcription'))
|
||||
|
||||
audiopath = os.path.join(currentpath, 'audiofiles') # path to audio files
|
||||
transcriptionpath = os.path.join(currentpath, 'transcription') # path to transcription files
|
||||
|
||||
audiofiles = os.listdir(audiopath) # list of audio files
|
||||
|
||||
return currentpath, audiopath, transcriptionpath, audiofiles
|
||||
|
||||
def video_to_audio(self,file, remove_video=True):
|
||||
clip = VideoFileClip(file)
|
||||
clip.audio.write_audiofile(os.path.join(file[:-4] + '.mp3'))
|
||||
if remove_video:
|
||||
os.remove(file)
|
||||
print(f'Video {file} removed')
|
||||
return os.path.join(file[:-4] + '.mp3')
|
||||
|
||||
|
||||
def transcribe(self):
|
||||
|
||||
if self.audiofile is not None:
|
||||
if self.audiofile in self.audiofiles:
|
||||
audiofile = os.path.join(self.audiopath, self.audiofile)
|
||||
else:
|
||||
raise ValueError('Audio file not found')
|
||||
|
||||
if audiofile.endswith('.mp4'):
|
||||
print('Converting video to audio')
|
||||
audiofile = self.video_to_audio(audiofile)
|
||||
|
||||
print(f'Start transcribing Audio file: {audiofile}')
|
||||
_stime = time()
|
||||
result = self.model.transcribe(audiofile, verbose=True, language= self.language)
|
||||
|
||||
print(f'Transcription finished in {time() - _stime} seconds')
|
||||
|
||||
txtfilename = str(audiofile.split('/')[-1][:-4]) + '.txt'
|
||||
|
||||
savepath = os.path.join(self.transcriptionpath, txtfilename)
|
||||
|
||||
with open(savepath, 'w') as f:
|
||||
f.write(result["text"])
|
||||
elif self.audiofile is None or isinstance(self.audiofile, list):
|
||||
print('No audio file specified or list of audio files')
|
||||
print(f"{len(self.audiofiles)} audio files found in {self.audiopath}")
|
||||
print("Start transcribing all audio files")
|
||||
i = 0
|
||||
for audiofile in self.audiofiles:
|
||||
|
||||
audiofile = os.path.join(self.audiopath, audiofile)
|
||||
|
||||
if audiofile.endswith('.mp4'):
|
||||
audiofile = self.video_to_audio(audiofile)
|
||||
|
||||
print(f'Start transcribing Audio file: {audiofile}')
|
||||
_stime = time()
|
||||
result = self.model.transcribe(audiofile, verbose=True, language=self.language)
|
||||
print(f'Transcription finished in {time() - _stime} seconds')
|
||||
|
||||
txtfilename = str(audiofile.split('/')[-1][:-4]) + '.txt'
|
||||
|
||||
savepath = os.path.join(self.transcriptionpath, txtfilename)
|
||||
|
||||
with open(savepath, 'w') as f:
|
||||
f.write(result["text"])
|
||||
|
||||
i += 1
|
||||
print(f'{i} of {len(self.audiofiles)} files transcribed')
|
||||
|
||||
else:
|
||||
raise ValueError('Audio file not found')
|
||||
|
||||
print('Transcription finished')
|
||||
|
||||
def __call__(self):
|
||||
return self.transcribe()
|
||||
def __repr__(self):
|
||||
return f"Transcribe(audiofile={self.audiofile}, model={self.model}, language={self.language})"
|
||||
def __str__(self):
|
||||
return f"Transcribe(audiofile={self.audiofile}, model={self.model}, language={self.language})"
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,69 @@
|
||||
import os
|
||||
import subprocess as sp
|
||||
|
||||
MAJOR = 1
|
||||
MINOR = 0
|
||||
MICRO = 0
|
||||
MICRO_POST = 0
|
||||
ISRELEASED = False
|
||||
VERSION = '%d.%d.%d.%d' % (MAJOR, MINOR, MICRO, MICRO_POST)
|
||||
|
||||
# Return the git revision as a string
|
||||
# taken from numpy/numpy
|
||||
def git_version():
|
||||
def _minimal_ext_cmd(cmd):
|
||||
# construct minimal environment
|
||||
env = {}
|
||||
for k in ['SYSTEMROOT', 'PATH', 'HOME']:
|
||||
v = os.environ.get(k)
|
||||
if v is not None:
|
||||
env[k] = v
|
||||
|
||||
# LANGUAGE is used on win32
|
||||
env['LANGUAGE'] = 'C'
|
||||
env['LANG'] = 'C'
|
||||
env['LC_ALL'] = 'C'
|
||||
|
||||
out = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE, env=env).communicate()[0]
|
||||
return out
|
||||
|
||||
try:
|
||||
out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
|
||||
GIT_REVISION = out.strip().decode('ascii')
|
||||
except OSError:
|
||||
GIT_REVISION = "Unknown"
|
||||
|
||||
return GIT_REVISION
|
||||
|
||||
def _get_git_version():
|
||||
cwd = os.getcwd()
|
||||
|
||||
# go to the main directory
|
||||
fdir = os.path.dirname(os.path.abspath(__file__))
|
||||
maindir = os.path.abspath(os.path.join(fdir, ".."))
|
||||
# maindir = fdir # os.path.join(fdir, "..")
|
||||
os.chdir(maindir)
|
||||
|
||||
# get git version
|
||||
res = git_version()
|
||||
|
||||
# restore the cwd
|
||||
os.chdir(cwd)
|
||||
return res
|
||||
|
||||
def get_version(build_version=False):
|
||||
if ISRELEASED:
|
||||
return VERSION
|
||||
|
||||
# unreleased version
|
||||
GIT_REVISION = _get_git_version()
|
||||
|
||||
if build_version:
|
||||
import datetime as dt
|
||||
date = dt.date.strftime(dt.datetime.now(), "%Y%m%d%H%M%S")
|
||||
return VERSION + ".dev" + date
|
||||
else:
|
||||
return VERSION + ".dev0+" + GIT_REVISION[:7]
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
name: whisper
|
||||
channels:
|
||||
- pytorch
|
||||
- conda-forge
|
||||
- defaults
|
||||
dependencies:
|
||||
- _libgcc_mutex=0.1=main
|
||||
- _openmp_mutex=5.1=1_gnu
|
||||
- blas=1.0=mkl
|
||||
- bzip2=1.0.8=h7b6447c_0
|
||||
- ca-certificates=2022.10.11=h06a4308_0
|
||||
- certifi=2022.9.24=py39h06a4308_0
|
||||
- cudatoolkit=11.3.1=h9edb442_10
|
||||
- ffmpeg=4.2.2=h20bf706_0
|
||||
- freetype=2.12.1=h4a9f257_0
|
||||
- giflib=5.2.1=h7b6447c_0
|
||||
- gmp=6.2.1=h295c915_3
|
||||
- gnutls=3.6.15=he1e5248_0
|
||||
- intel-openmp=2021.4.0=h06a4308_3561
|
||||
- jpeg=9e=h7f8727e_0
|
||||
- lame=3.100=h7b6447c_0
|
||||
- lcms2=2.12=h3be6417_0
|
||||
- ld_impl_linux-64=2.38=h1181459_1
|
||||
- lerc=3.0=h295c915_0
|
||||
- libdeflate=1.8=h7f8727e_5
|
||||
- libffi=3.3=he6710b0_2
|
||||
- libgcc-ng=11.2.0=h1234567_1
|
||||
- libgomp=11.2.0=h1234567_1
|
||||
- libidn2=2.3.2=h7f8727e_0
|
||||
- libopus=1.3.1=h7b6447c_0
|
||||
- libpng=1.6.37=hbc83047_0
|
||||
- libstdcxx-ng=11.2.0=h1234567_1
|
||||
- libtasn1=4.16.0=h27cfd23_0
|
||||
- libtiff=4.4.0=hecacb30_2
|
||||
- libunistring=0.9.10=h27cfd23_0
|
||||
- libuv=1.40.0=h7b6447c_0
|
||||
- libvpx=1.7.0=h439df22_0
|
||||
- libwebp=1.2.4=h11a3e52_0
|
||||
- libwebp-base=1.2.4=h5eee18b_0
|
||||
- lz4-c=1.9.3=h295c915_1
|
||||
- mkl=2021.4.0=h06a4308_640
|
||||
- mkl-service=2.4.0=py39h7f8727e_0
|
||||
- mkl_fft=1.3.1=py39hd3c417c_0
|
||||
- mkl_random=1.2.2=py39h51133e4_0
|
||||
- ncurses=6.3=h5eee18b_3
|
||||
- nettle=3.7.3=hbbd107a_1
|
||||
- numpy=1.23.4=py39h14f4228_0
|
||||
- numpy-base=1.23.4=py39h31eccc5_0
|
||||
- openh264=2.1.1=h4ff587b_0
|
||||
- openssl=1.1.1s=h7f8727e_0
|
||||
- pillow=9.2.0=py39hace64e9_1
|
||||
- pip=22.2.2=py39h06a4308_0
|
||||
- python=3.9.15=haa1d7c7_0
|
||||
- pytorch=1.10.1=py3.9_cuda11.3_cudnn8.2.0_0
|
||||
- pytorch-mutex=1.0=cuda
|
||||
- readline=8.2=h5eee18b_0
|
||||
- setuptools=65.5.0=py39h06a4308_0
|
||||
- six=1.16.0=pyhd3eb1b0_1
|
||||
- sqlite=3.39.3=h5082296_0
|
||||
- tk=8.6.12=h1ccaba5_0
|
||||
- torchaudio=0.10.1=py39_cu113
|
||||
- torchvision=0.11.2=py39_cu113
|
||||
- typing_extensions=4.3.0=py39h06a4308_0
|
||||
- tzdata=2022f=h04d1e81_0
|
||||
- wheel=0.37.1=pyhd3eb1b0_0
|
||||
- x264=1!157.20191217=h7b6447c_0
|
||||
- xz=5.2.6=h5eee18b_0
|
||||
- zlib=1.2.13=h5eee18b_0
|
||||
- zstd=1.5.2=ha4553b6_0
|
||||
- pip:
|
||||
- charset-normalizer==2.1.1
|
||||
- decorator==4.4.2
|
||||
- ffmpeg-python==0.2.0
|
||||
- filelock==3.8.0
|
||||
- future==0.18.2
|
||||
- huggingface-hub==0.11.0
|
||||
- idna==3.4
|
||||
- imageio==2.23.0
|
||||
- imageio-ffmpeg==0.4.7
|
||||
- more-itertools==9.0.0
|
||||
- moviepy==1.0.3
|
||||
- packaging==21.3
|
||||
- proglog==0.1.10
|
||||
- pydub==0.25.1
|
||||
- pyparsing==3.0.9
|
||||
- pyyaml==6.0
|
||||
- regex==2022.10.31
|
||||
- requests==2.28.1
|
||||
- semantic-version==2.10.0
|
||||
- setuptools-rust==1.5.2
|
||||
- tokenizers==0.13.2
|
||||
- tqdm==4.64.1
|
||||
- transformers==4.24.0
|
||||
- urllib3==1.26.12
|
||||
- whisper==1.0
|
||||
prefix: /home/jacob/anaconda3/envs/whisper
|
||||
@@ -0,0 +1,3 @@
|
||||
whisper~=1.0
|
||||
moviepy~=1.0.3
|
||||
setuptools~=65.5.0
|
||||
@@ -0,0 +1,38 @@
|
||||
import pkg_resources
|
||||
import os
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
module_name = "autotranscript"
|
||||
github_url = "https://github.com/Jaikinator/transcriptor"
|
||||
|
||||
file_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
absdir = lambda p: os.path.join(file_dir, p)
|
||||
|
||||
############### versioning ###############
|
||||
verfile = os.path.abspath(os.path.join(module_name, "version.py"))
|
||||
version = {"__file__": verfile}
|
||||
|
||||
with open(verfile, "r") as fp:
|
||||
exec(fp.read(), version)
|
||||
|
||||
############### setup ###############
|
||||
|
||||
build_version = "OPTB_BUILD" in os.environ
|
||||
|
||||
setup(
|
||||
name=module_name,
|
||||
version=version["get_version"](build_version),
|
||||
packages=find_packages(),
|
||||
python_requires="~=3.9",
|
||||
readme="README.md",
|
||||
install_requires = [str(r) for r in pkg_resources.parse_requirements(
|
||||
open(os.path.join(os.path.dirname(__file__), "requirements.txt"))
|
||||
)
|
||||
],
|
||||
url= github_url,
|
||||
license='',
|
||||
author='Jacob Schmieder',
|
||||
author_email='',
|
||||
description='Transcription tool for audio files based on Whisper',
|
||||
#entry_points={'console_scripts': ['autotranscript = autotranscript.__main__:main']}
|
||||
)
|
||||
@@ -0,0 +1,4 @@
|
||||
from autotranscript import Transcribe
|
||||
|
||||
Transcribe().transcribe()
|
||||
|
||||
Reference in New Issue
Block a user