mirror of
https://github.com/ggerganov/whisper.cpp.git
synced 2024-12-30 17:26:57 +00:00
1e8f28c42a
* make : use pkg-config for finding CFLAGS & LDFLAGS needed by OpenBLAS That way building on *nix like environments (including MSYS2 on Windows) with WHISPER_OPENBLAS=1 works out of the box. Fix handling of WHISPER_OPENBLAS, so that empty value or 0 won't be misinterpreted by make as enabled. Mind that it's not intended to detect CMake false constants (OFF NO FALSE N). make is not CMake. By default OpenBLAS with 64-bit interface is used, but that can be changed with `WHISPER_OPENBLAS_INTERFACE64=0` if 32-bit one is desired. If OpenBLAS headers and library are respectively in include/ and lib/ subdirectories of given path, then you can specify it, e.g. `OPENBLAS_PATH=/usr/local/openblas`, and this will take precedence over any pkg-config file. If there is no pkg-config file (.pc) for OpenBLAS and OPENBLAS_PATH is empty, then headers are assumed to be in /usr/include/openblas and library as assumed to be called 'openblas64' (or 'openblas' if `WHISPER_OPENBLAS_INTERFACE64=0`). If different headers location should be used, then it can be done, e.g. `WHISPER_BLAS_CFLAGS=-I/usr/local/include/openblas`. If different library should be used, it can be specified, e.g. `WHISPER_BLAS_LIB=openblasp64` (pthreads version as seen on Fedora), or you can provide LDFLAGS needed to link with OpenBLAS directly: `WHISPER_BLAS_LDFLAGS="-L/usr/local/lib/openblas -lopenblas64"`. Current solution is flexible enough to handle most cases out there without needlessly hardcoding possible OpenBLAS installation details. * cmake : fix how pkg-config is used for finding include dirs and libraries needed by OpenBLAS That way building on *nix like environments (including MSYS2 on Windows) with -DWHISPER_OPENBLAS=ON should work out of the box as long as you have CMake 3.25 or newer. Make OPENBLAS_PATH environment variable supported not only on Windows. It sets OpenBLAS include dir to ${OPENBLAS_PATH}/include and library to ${WHISPER_BLAS_LIB} (name without prefixes and suffixes) in ${OPENBLAS_PATH}/lib and avoids further package finding. By default OpenBLAS with 64-bit interface is used (equivalent to setting `-DWHISPER_BLAS_LIB=openblas64`), but that can be changed with `-DWHISPER_OPENBLAS_INTERFACE64=OFF` (equivalent to setting `-DWHISPER_BLAS_LIB=openblas`) if 32-bit one is desired. Turn on BLA_STATIC for FindBLAS only when WHISPER_STATIC is enabled. BLA_STATIC may not work as expected for pkg-config based operation. Get rid of supporting BLAS_HOME environment variable. If OPENBLAS_PATH is insufficient in your case, there is no pkg-config file to rely on, then you can manually specify include dir, e.g. `-DBLAS_INCLUDE_DIRS=/usr/local/include/openblas`, and library, e.g. `-DBLAS_LIBRARIES=/usr/local/lib/libopenblas.so`. * make / cmake : use OpenBLAS with 32-bit interface by default. OpenBLAS w/o INTERFACE64=1 vel USE_64BITINT=1 seems to be more common. * cmake : hardcode "lib" prefix for OpenBLAS lib filename (even on Windows) * cmake : hardcode OpenBLAS library name when building in MSVC (Windows) Most *nix like environments (including MSYS2 on Windows) have OpenBLAS packages that allow coexistence of OpenBLAS builds with 32-bit and 64-bit interface (w/o and w/ OPENBLAS_USE64BITINT defined) and they differ by not having or having "64" suffix in their library filenames. That's not the case for OpenBLAS prebuilt libraries for Windows.
524 lines
17 KiB
Makefile
524 lines
17 KiB
Makefile
default: main bench quantize server
|
|
|
|
ifndef UNAME_S
|
|
UNAME_S := $(shell uname -s)
|
|
endif
|
|
|
|
ifndef UNAME_P
|
|
UNAME_P := $(shell uname -p)
|
|
endif
|
|
|
|
ifndef UNAME_M
|
|
UNAME_M := $(shell uname -m)
|
|
endif
|
|
|
|
ifndef NVCC_VERSION
|
|
ifeq ($(call,$(shell which nvcc))$(.SHELLSTATUS),0)
|
|
NVCC_VERSION := $(shell nvcc --version | egrep -o "V[0-9]+.[0-9]+.[0-9]+" | cut -c2-)
|
|
endif
|
|
endif
|
|
|
|
CCV := $(shell $(CC) --version | head -n 1)
|
|
CXXV := $(shell $(CXX) --version | head -n 1)
|
|
|
|
# Mac OS + Arm can report x86_64
|
|
# ref: https://github.com/ggerganov/whisper.cpp/issues/66#issuecomment-1282546789
|
|
ifeq ($(UNAME_S),Darwin)
|
|
ifneq ($(UNAME_P),arm)
|
|
SYSCTL_M := $(shell sysctl -n hw.optional.arm64)
|
|
ifeq ($(SYSCTL_M),1)
|
|
# UNAME_P := arm
|
|
# UNAME_M := arm64
|
|
warn := $(warning Your arch is announced as x86_64, but it seems to actually be ARM64. Not fixing that can lead to bad performance. For more info see: https://github.com/ggerganov/whisper.cpp/issues/66\#issuecomment-1282546789)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
#
|
|
# Compile flags
|
|
#
|
|
|
|
CFLAGS = -I. -O3 -DNDEBUG -std=c11 -fPIC
|
|
CXXFLAGS = -I. -I./examples -O3 -DNDEBUG -std=c++11 -fPIC
|
|
LDFLAGS =
|
|
|
|
ifdef MACOSX_DEPLOYMENT_TARGET
|
|
CFLAGS += -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET)
|
|
CXXFLAGS += -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET)
|
|
LDFLAGS += -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET)
|
|
endif
|
|
|
|
# clock_gettime came in POSIX.1b (1993)
|
|
# CLOCK_MONOTONIC came in POSIX.1-2001 / SUSv3 as optional
|
|
# posix_memalign came in POSIX.1-2001 / SUSv3
|
|
# M_PI is an XSI extension since POSIX.1-2001 / SUSv3, came in XPG1 (1985)
|
|
CFLAGS += -D_XOPEN_SOURCE=600
|
|
CXXFLAGS += -D_XOPEN_SOURCE=600
|
|
|
|
# Somehow in OpenBSD whenever POSIX conformance is specified
|
|
# some string functions rely on locale_t availability,
|
|
# which was introduced in POSIX.1-2008, forcing us to go higher
|
|
ifeq ($(UNAME_S),OpenBSD)
|
|
CFLAGS += -U_XOPEN_SOURCE -D_XOPEN_SOURCE=700
|
|
CXXFLAGS += -U_XOPEN_SOURCE -D_XOPEN_SOURCE=700
|
|
endif
|
|
|
|
# Data types, macros and functions related to controlling CPU affinity
|
|
# are available on Linux through GNU extensions in libc
|
|
ifeq ($(UNAME_S),Linux)
|
|
CFLAGS += -D_GNU_SOURCE
|
|
CXXFLAGS += -D_GNU_SOURCE
|
|
endif
|
|
|
|
# RLIMIT_MEMLOCK came in BSD, is not specified in POSIX.1,
|
|
# and on macOS its availability depends on enabling Darwin extensions
|
|
# similarly on DragonFly, enabling BSD extensions is necessary
|
|
ifeq ($(UNAME_S),Darwin)
|
|
CFLAGS += -D_DARWIN_C_SOURCE
|
|
CXXFLAGS += -D_DARWIN_C_SOURCE
|
|
endif
|
|
ifeq ($(UNAME_S),DragonFly)
|
|
CFLAGS += -D__BSD_VISIBLE
|
|
CXXFLAGS += -D__BSD_VISIBLE
|
|
endif
|
|
|
|
# alloca is a non-standard interface that is not visible on BSDs when
|
|
# POSIX conformance is specified, but not all of them provide a clean way
|
|
# to enable it in such cases
|
|
ifeq ($(UNAME_S),FreeBSD)
|
|
CFLAGS += -D__BSD_VISIBLE
|
|
CXXFLAGS += -D__BSD_VISIBLE
|
|
endif
|
|
ifeq ($(UNAME_S),NetBSD)
|
|
CFLAGS += -D_NETBSD_SOURCE
|
|
CXXFLAGS += -D_NETBSD_SOURCE
|
|
endif
|
|
ifeq ($(UNAME_S),OpenBSD)
|
|
CFLAGS += -D_BSD_SOURCE
|
|
CXXFLAGS += -D_BSD_SOURCE
|
|
endif
|
|
|
|
# OS specific
|
|
# TODO: support Windows
|
|
ifeq ($(filter $(UNAME_S),Linux Darwin DragonFly FreeBSD NetBSD OpenBSD Haiku),$(UNAME_S))
|
|
CFLAGS += -pthread
|
|
CXXFLAGS += -pthread
|
|
endif
|
|
|
|
# detect Windows
|
|
ifneq ($(findstring _NT,$(UNAME_S)),)
|
|
_WIN32 := 1
|
|
endif
|
|
|
|
# Windows Sockets 2 (Winsock) for network-capable apps
|
|
ifeq ($(_WIN32),1)
|
|
LWINSOCK2 := -lws2_32
|
|
endif
|
|
|
|
# Architecture specific
|
|
# TODO: probably these flags need to be tweaked on some architectures
|
|
# feel free to update the Makefile for your architecture and send a pull request or issue
|
|
ifeq ($(UNAME_M),$(filter $(UNAME_M),x86_64 i686 amd64))
|
|
ifeq ($(UNAME_S),Darwin)
|
|
CPUINFO_CMD := sysctl machdep.cpu.features machdep.cpu.leaf7_features
|
|
else ifeq ($(UNAME_S),Linux)
|
|
CPUINFO_CMD := cat /proc/cpuinfo
|
|
else ifneq (,$(filter MINGW32_NT% MINGW64_NT% MSYS_NT%,$(UNAME_S)))
|
|
CPUINFO_CMD := cat /proc/cpuinfo
|
|
else ifneq (,$(filter DragonFly FreeBSD,$(UNAME_S)))
|
|
CPUINFO_CMD := grep Features /var/run/dmesg.boot
|
|
else ifeq ($(UNAME_S),Haiku)
|
|
CPUINFO_CMD := sysinfo -cpu
|
|
endif
|
|
|
|
ifdef CPUINFO_CMD
|
|
AVX_M := $(shell $(CPUINFO_CMD) | grep -iwE 'AVX|AVX1.0')
|
|
ifneq (,$(AVX_M))
|
|
CFLAGS += -mavx
|
|
CXXFLAGS += -mavx
|
|
endif
|
|
|
|
AVX2_M := $(shell $(CPUINFO_CMD) | grep -iw 'AVX2')
|
|
ifneq (,$(AVX2_M))
|
|
CFLAGS += -mavx2
|
|
CXXFLAGS += -mavx2
|
|
endif
|
|
|
|
FMA_M := $(shell $(CPUINFO_CMD) | grep -iw 'FMA')
|
|
ifneq (,$(FMA_M))
|
|
CFLAGS += -mfma
|
|
CXXFLAGS += -mfma
|
|
endif
|
|
|
|
F16C_M := $(shell $(CPUINFO_CMD) | grep -iw 'F16C')
|
|
ifneq (,$(F16C_M))
|
|
CFLAGS += -mf16c
|
|
CXXFLAGS += -mf16c
|
|
endif
|
|
|
|
SSE3_M := $(shell $(CPUINFO_CMD) | grep -iwE 'PNI|SSE3')
|
|
ifneq (,$(SSE3_M))
|
|
CFLAGS += -msse3
|
|
CXXFLAGS += -msse3
|
|
endif
|
|
|
|
SSSE3_M := $(shell $(CPUINFO_CMD) | grep -iw 'SSSE3')
|
|
ifneq (,$(SSSE3_M))
|
|
CFLAGS += -mssse3
|
|
CXXFLAGS += -mssse3
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifneq ($(filter ppc64%,$(UNAME_M)),)
|
|
POWER9_M := $(shell grep "POWER9" /proc/cpuinfo)
|
|
ifneq (,$(findstring POWER9,$(POWER9_M)))
|
|
CFLAGS += -mpower9-vector
|
|
endif
|
|
# Require c++23's std::byteswap for big-endian support.
|
|
ifeq ($(UNAME_M),ppc64)
|
|
CXXFLAGS += -std=c++23 -DGGML_BIG_ENDIAN
|
|
endif
|
|
endif
|
|
|
|
ifndef WHISPER_NO_ACCELERATE
|
|
# Mac M1 - include Accelerate framework
|
|
ifeq ($(UNAME_S),Darwin)
|
|
CFLAGS += -DGGML_USE_ACCELERATE
|
|
CFLAGS += -DACCELERATE_NEW_LAPACK
|
|
CFLAGS += -DACCELERATE_LAPACK_ILP64
|
|
LDFLAGS += -framework Accelerate
|
|
endif
|
|
endif
|
|
|
|
ifdef WHISPER_COREML
|
|
CXXFLAGS += -DWHISPER_USE_COREML
|
|
LDFLAGS += -framework Foundation -framework CoreML
|
|
|
|
ifdef WHISPER_COREML_ALLOW_FALLBACK
|
|
CXXFLAGS += -DWHISPER_COREML_ALLOW_FALLBACK
|
|
endif
|
|
endif
|
|
|
|
ifndef WHISPER_NO_METAL
|
|
ifeq ($(UNAME_S),Darwin)
|
|
WHISPER_METAL := 1
|
|
|
|
CFLAGS += -DGGML_USE_METAL
|
|
CXXFLAGS += -DGGML_USE_METAL
|
|
LDFLAGS += -framework Foundation -framework Metal -framework MetalKit
|
|
endif
|
|
endif
|
|
|
|
ifneq ($(filter-out 0,$(WHISPER_OPENBLAS)),) # OpenBLAS
|
|
WHISPER_OPENBLAS_INTERFACE64 ?= 0 # use 32-bit interface by default
|
|
ifneq ($(filter-out 0,$(WHISPER_OPENBLAS_INTERFACE64)),)
|
|
WHISPER_BLAS_LIB := openblas64
|
|
else
|
|
WHISPER_BLAS_LIB := openblas
|
|
endif
|
|
ifneq ($(OPENBLAS_PATH),)
|
|
WHISPER_BLAS_CFLAGS := -I$(OPENBLAS_PATH)/include
|
|
WHISPER_BLAS_LDFLAGS := -L$(OPENBLAS_PATH)/lib -l$(WHISPER_BLAS_LIB)
|
|
else
|
|
WHISPER_BLAS_LIB_PC_EXISTS := $(shell pkg-config --exists $(WHISPER_BLAS_LIB) && echo 1)
|
|
ifneq ($(filter-out 0,$(WHISPER_BLAS_LIB_PC_EXISTS)),)
|
|
WHISPER_BLAS_CFLAGS := $(shell pkg-config --cflags $(WHISPER_BLAS_LIB))
|
|
WHISPER_BLAS_LDFLAGS := $(shell pkg-config --libs $(WHISPER_BLAS_LIB))
|
|
else
|
|
WHISPER_BLAS_CFLAGS := -I/usr/include/openblas
|
|
WHISPER_BLAS_LDFLAGS := -l$(WHISPER_BLAS_LIB)
|
|
endif
|
|
endif
|
|
CFLAGS += $(WHISPER_BLAS_CFLAGS) -DGGML_USE_OPENBLAS
|
|
LDFLAGS += $(WHISPER_BLAS_LDFLAGS)
|
|
endif
|
|
|
|
ifdef WHISPER_CUBLAS
|
|
# WHISPER_CUBLAS is deprecated and will be removed in the future
|
|
WHISPER_CUDA := 1
|
|
endif
|
|
|
|
ifdef WHISPER_CUDA
|
|
ifeq ($(shell expr $(NVCC_VERSION) \>= 11.6), 1)
|
|
CUDA_ARCH_FLAG ?= native
|
|
else
|
|
CUDA_ARCH_FLAG ?= all
|
|
endif
|
|
|
|
CFLAGS += -DGGML_USE_CUDA -I/usr/local/cuda/include -I/opt/cuda/include -I$(CUDA_PATH)/targets/$(UNAME_M)-linux/include
|
|
CXXFLAGS += -DGGML_USE_CUDA -I/usr/local/cuda/include -I/opt/cuda/include -I$(CUDA_PATH)/targets/$(UNAME_M)-linux/include
|
|
LDFLAGS += -lcuda -lcublas -lculibos -lcudart -lcublasLt -lpthread -ldl -lrt -L/usr/local/cuda/lib64 -L/opt/cuda/lib64 -L$(CUDA_PATH)/targets/$(UNAME_M)-linux/lib -L/usr/lib/wsl/lib
|
|
WHISPER_OBJ += ggml-cuda.o
|
|
WHISPER_OBJ += $(patsubst %.cu,%.o,$(wildcard ggml-cuda/*.cu))
|
|
NVCC = nvcc
|
|
NVCCFLAGS = --forward-unknown-to-host-compiler -arch=$(CUDA_ARCH_FLAG)
|
|
|
|
ggml-cuda/%.o: ggml-cuda/%.cu ggml-cuda/%.cuh ggml.h ggml-common.h ggml-cuda/common.cuh
|
|
$(NVCC) $(NVCCFLAGS) $(CXXFLAGS) -c $< -o $@
|
|
|
|
ggml-cuda.o: ggml-cuda.cu ggml-cuda.h ggml.h ggml-backend.h ggml-backend-impl.h ggml-common.h $(wildcard ggml-cuda/*.cuh)
|
|
$(NVCC) $(NVCCFLAGS) $(CXXFLAGS) -Wno-pedantic -c $< -o $@
|
|
endif
|
|
|
|
ifdef WHISPER_HIPBLAS
|
|
ROCM_PATH ?= /opt/rocm
|
|
HIPCC ?= $(ROCM_PATH)/bin/hipcc
|
|
GPU_TARGETS ?= $(shell $(ROCM_PATH)/llvm/bin/amdgpu-arch)
|
|
CFLAGS += -DGGML_USE_HIPBLAS -DGGML_USE_CUDA
|
|
CXXFLAGS += -DGGML_USE_HIPBLAS -DGGML_USE_CUDA
|
|
LDFLAGS += -L$(ROCM_PATH)/lib -Wl,-rpath=$(ROCM_PATH)/lib
|
|
LDFLAGS += -lhipblas -lamdhip64 -lrocblas
|
|
HIPFLAGS += $(addprefix --offload-arch=,$(GPU_TARGETS))
|
|
WHISPER_OBJ += ggml-cuda.o
|
|
WHISPER_OBJ += $(patsubst %.cu,%.o,$(wildcard ggml-cuda/*.cu))
|
|
|
|
ggml-cuda/%.o: ggml-cuda/%.cu ggml-cuda/%.cuh ggml.h ggml-common.h ggml-cuda/common.cuh
|
|
$(HIPCC) $(CXXFLAGS) $(HIPFLAGS) -x hip -c -o $@ $<
|
|
|
|
ggml-cuda.o: ggml-cuda.cu ggml-cuda.h ggml.h ggml-backend.h ggml-backend-impl.h ggml-common.h $(wildcard ggml-cuda/*.cuh)
|
|
$(HIPCC) $(CXXFLAGS) $(HIPFLAGS) -x hip -c -o $@ $<
|
|
endif
|
|
|
|
ifdef WHISPER_CLBLAST
|
|
CFLAGS += -DGGML_USE_CLBLAST
|
|
CXXFLAGS += -DGGML_USE_CLBLAST
|
|
LDFLAGS += -lclblast
|
|
ifeq ($(UNAME_S),Darwin)
|
|
LDFLAGS += -framework OpenCL
|
|
else
|
|
LDFLAGS += -lOpenCL
|
|
endif
|
|
WHISPER_OBJ += ggml-opencl.o
|
|
|
|
ggml-opencl.o: ggml-opencl.cpp ggml-opencl.h
|
|
$(CXX) $(CXXFLAGS) -c $< -o $@
|
|
endif
|
|
|
|
ifdef WHISPER_GPROF
|
|
CFLAGS += -pg
|
|
CXXFLAGS += -pg
|
|
endif
|
|
|
|
ifneq ($(filter aarch64%,$(UNAME_M)),)
|
|
CFLAGS += -mcpu=native
|
|
CXXFLAGS += -mcpu=native
|
|
endif
|
|
|
|
ifneq ($(filter armv6%,$(UNAME_M)),)
|
|
# 32-bit Raspberry Pi 1, 2, 3
|
|
CFLAGS += -mfpu=neon -mfp16-format=ieee -mno-unaligned-access
|
|
endif
|
|
|
|
ifneq ($(filter armv7%,$(UNAME_M)),)
|
|
# 32-bit ARM, for example on Armbian or possibly raspbian
|
|
#CFLAGS += -mfpu=neon -mfp16-format=ieee -funsafe-math-optimizations -mno-unaligned-access
|
|
#CXXFLAGS += -mfpu=neon -mfp16-format=ieee -funsafe-math-optimizations -mno-unaligned-access
|
|
|
|
# 64-bit ARM on 32-bit OS, use these (TODO: auto-detect 64-bit)
|
|
CFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -funsafe-math-optimizations -mno-unaligned-access
|
|
CXXFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -funsafe-math-optimizations -mno-unaligned-access
|
|
endif
|
|
|
|
ifneq ($(filter armv8%,$(UNAME_M)),)
|
|
# Raspberry Pi 4
|
|
CFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -funsafe-math-optimizations -mno-unaligned-access
|
|
CXXFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -funsafe-math-optimizations -mno-unaligned-access
|
|
endif
|
|
|
|
#
|
|
# Print build information
|
|
#
|
|
|
|
$(info I whisper.cpp build info: )
|
|
$(info I UNAME_S: $(UNAME_S))
|
|
$(info I UNAME_P: $(UNAME_P))
|
|
$(info I UNAME_M: $(UNAME_M))
|
|
$(info I CFLAGS: $(CFLAGS))
|
|
$(info I CXXFLAGS: $(CXXFLAGS))
|
|
$(info I LDFLAGS: $(LDFLAGS))
|
|
$(info I CC: $(CCV))
|
|
$(info I CXX: $(CXXV))
|
|
$(info )
|
|
|
|
ifdef WHISPER_CUBLAS
|
|
$(info !!!!)
|
|
$(info WHISPER_CUBLAS is deprecated and will be removed in the future. Use WHISPER_CUDA instead.)
|
|
$(info !!!!)
|
|
$(info )
|
|
endif
|
|
|
|
#
|
|
# Build library
|
|
#
|
|
|
|
ggml.o: ggml.c ggml.h ggml-cuda.h
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
ggml-alloc.o: ggml-alloc.c ggml.h ggml-alloc.h
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
ggml-backend.o: ggml-backend.c ggml.h ggml-backend.h
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
ggml-quants.o: ggml-quants.c ggml.h ggml-quants.h
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
WHISPER_OBJ += ggml.o ggml-alloc.o ggml-backend.o ggml-quants.o
|
|
|
|
whisper.o: whisper.cpp whisper.h ggml.h ggml-cuda.h
|
|
$(CXX) $(CXXFLAGS) -c $< -o $@
|
|
|
|
ifndef WHISPER_COREML
|
|
WHISPER_OBJ += whisper.o
|
|
else
|
|
whisper-encoder.o: coreml/whisper-encoder.mm coreml/whisper-encoder.h
|
|
$(CXX) -O3 -I . -fobjc-arc -c coreml/whisper-encoder.mm -o whisper-encoder.o
|
|
|
|
whisper-encoder-impl.o: coreml/whisper-encoder-impl.m coreml/whisper-encoder-impl.h
|
|
$(CXX) -O3 -I . -fobjc-arc -c coreml/whisper-encoder-impl.m -o whisper-encoder-impl.o
|
|
|
|
WHISPER_OBJ += whisper.o whisper-encoder.o whisper-encoder-impl.o
|
|
endif
|
|
|
|
ifdef WHISPER_METAL
|
|
ggml-metal.o: ggml-metal.m ggml-metal.h
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
WHISPER_OBJ += ggml-metal.o
|
|
|
|
ifdef WHISPER_METAL_EMBED_LIBRARY
|
|
CFLAGS += -DGGML_METAL_EMBED_LIBRARY
|
|
|
|
ggml-metal-embed.o: ggml-metal.metal
|
|
@echo "Embedding Metal library"
|
|
$(eval TEMP_ASSEMBLY=$(shell mktemp))
|
|
@echo ".section __DATA, __ggml_metallib" > $(TEMP_ASSEMBLY)
|
|
@echo ".globl _ggml_metallib_start" >> $(TEMP_ASSEMBLY)
|
|
@echo "_ggml_metallib_start:" >> $(TEMP_ASSEMBLY)
|
|
@echo ".incbin \"$<\"" >> $(TEMP_ASSEMBLY)
|
|
@echo ".globl _ggml_metallib_end" >> $(TEMP_ASSEMBLY)
|
|
@echo "_ggml_metallib_end:" >> $(TEMP_ASSEMBLY)
|
|
@$(AS) $(TEMP_ASSEMBLY) -o $@
|
|
@rm -f ${TEMP_ASSEMBLY}
|
|
|
|
WHISPER_OBJ += ggml-metal-embed.o
|
|
endif
|
|
endif
|
|
|
|
libwhisper.a: $(WHISPER_OBJ)
|
|
$(AR) rcs libwhisper.a $(WHISPER_OBJ)
|
|
|
|
libwhisper.so: $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) -shared -o libwhisper.so $(WHISPER_OBJ) $(LDFLAGS)
|
|
|
|
clean:
|
|
rm -f *.o main stream command talk talk-llama bench quantize server lsp libwhisper.a libwhisper.so
|
|
|
|
#
|
|
# Examples
|
|
#
|
|
|
|
CC_SDL=`sdl2-config --cflags --libs`
|
|
|
|
SRC_COMMON = examples/common.cpp examples/common-ggml.cpp examples/grammar-parser.cpp
|
|
SRC_COMMON_SDL = examples/common-sdl.cpp
|
|
|
|
main: examples/main/main.cpp $(SRC_COMMON) $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) examples/main/main.cpp $(SRC_COMMON) $(WHISPER_OBJ) -o main $(LDFLAGS)
|
|
./main -h
|
|
|
|
bench: examples/bench/bench.cpp $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) examples/bench/bench.cpp $(WHISPER_OBJ) -o bench $(LDFLAGS)
|
|
|
|
quantize: examples/quantize/quantize.cpp $(WHISPER_OBJ) $(SRC_COMMON)
|
|
$(CXX) $(CXXFLAGS) examples/quantize/quantize.cpp $(SRC_COMMON) $(WHISPER_OBJ) -o quantize $(LDFLAGS)
|
|
|
|
server: examples/server/server.cpp $(SRC_COMMON) $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) examples/server/server.cpp $(SRC_COMMON) $(WHISPER_OBJ) -o server $(LDFLAGS) $(LWINSOCK2)
|
|
|
|
stream: examples/stream/stream.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) examples/stream/stream.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ) -o stream $(CC_SDL) $(LDFLAGS)
|
|
|
|
command: examples/command/command.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) examples/command/command.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ) -o command $(CC_SDL) $(LDFLAGS)
|
|
|
|
lsp: examples/lsp/lsp.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) examples/lsp/lsp.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ) -o lsp $(CC_SDL) $(LDFLAGS)
|
|
|
|
talk: examples/talk/talk.cpp examples/talk/gpt-2.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) examples/talk/talk.cpp examples/talk/gpt-2.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ) -o talk $(CC_SDL) $(LDFLAGS)
|
|
|
|
talk-llama: examples/talk-llama/talk-llama.cpp examples/talk-llama/llama.cpp examples/talk-llama/unicode.cpp examples/talk-llama/unicode-data.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ)
|
|
$(CXX) $(CXXFLAGS) examples/talk-llama/talk-llama.cpp examples/talk-llama/llama.cpp examples/talk-llama/unicode.cpp examples/talk-llama/unicode-data.cpp $(SRC_COMMON) $(SRC_COMMON_SDL) $(WHISPER_OBJ) -o talk-llama $(CC_SDL) $(LDFLAGS)
|
|
|
|
#
|
|
# Audio samples
|
|
#
|
|
|
|
# download a few audio samples into folder "./samples":
|
|
.PHONY: samples
|
|
samples:
|
|
@echo "Downloading samples..."
|
|
@mkdir -p samples
|
|
@wget --quiet --show-progress -O samples/gb0.ogg https://upload.wikimedia.org/wikipedia/commons/2/22/George_W._Bush%27s_weekly_radio_address_%28November_1%2C_2008%29.oga
|
|
@wget --quiet --show-progress -O samples/gb1.ogg https://upload.wikimedia.org/wikipedia/commons/1/1f/George_W_Bush_Columbia_FINAL.ogg
|
|
@wget --quiet --show-progress -O samples/hp0.ogg https://upload.wikimedia.org/wikipedia/en/d/d4/En.henryfphillips.ogg
|
|
@wget --quiet --show-progress -O samples/mm1.wav https://cdn.openai.com/whisper/draft-20220913a/micro-machines.wav
|
|
@wget --quiet --show-progress -O samples/a13.mp3 https://upload.wikimedia.org/wikipedia/commons/transcoded/6/6f/Apollo13-wehaveaproblem.ogg/Apollo13-wehaveaproblem.ogg.mp3
|
|
@wget --quiet --show-progress -O samples/diffusion2023-07-03.flac https://archive.org/download/diffusion2023-07-03/diffusion2023-07-03.flac
|
|
@echo "Converting to 16-bit WAV ..."
|
|
@ffmpeg -loglevel -0 -y -i samples/gb0.ogg -ar 16000 -ac 1 -c:a pcm_s16le samples/gb0.wav
|
|
@ffmpeg -loglevel -0 -y -i samples/gb1.ogg -ar 16000 -ac 1 -c:a pcm_s16le samples/gb1.wav
|
|
@ffmpeg -loglevel -0 -y -i samples/hp0.ogg -ar 16000 -ac 1 -c:a pcm_s16le samples/hp0.wav
|
|
@rm samples/*.ogg
|
|
@ffmpeg -loglevel -0 -y -i samples/mm1.wav -ar 16000 -ac 1 -c:a pcm_s16le samples/mm0.wav
|
|
@rm samples/mm1.wav
|
|
@ffmpeg -loglevel -0 -y -i samples/a13.mp3 -ar 16000 -ac 1 -c:a pcm_s16le -ss 00:00:00 -to 00:00:30 samples/a13.wav
|
|
@rm samples/a13.mp3
|
|
@ffmpeg -loglevel -0 -y -i samples/diffusion2023-07-03.flac -ar 16000 -ac 1 -c:a pcm_s16le samples/diffusion2023-07-03.wav
|
|
@rm samples/diffusion2023-07-03.flac
|
|
|
|
#
|
|
# Models
|
|
#
|
|
|
|
# if not already downloaded, the following targets download the specified model and
|
|
# runs it on all samples in the folder "./samples":
|
|
|
|
.PHONY: tiny.en
|
|
.PHONY: tiny
|
|
.PHONY: base.en
|
|
.PHONY: base
|
|
.PHONY: small.en
|
|
.PHONY: small
|
|
.PHONY: medium.en
|
|
.PHONY: medium
|
|
.PHONY: large-v1
|
|
.PHONY: large-v2
|
|
.PHONY: large-v3
|
|
|
|
tiny.en tiny base.en base small.en small medium.en medium large-v1 large-v2 large-v3: main
|
|
bash ./models/download-ggml-model.sh $@
|
|
@echo ""
|
|
@echo "==============================================="
|
|
@echo "Running $@ on all samples in ./samples ..."
|
|
@echo "==============================================="
|
|
@echo ""
|
|
@for f in samples/*.wav; do \
|
|
echo "----------------------------------------------" ; \
|
|
echo "[+] Running $@ on $$f ... (run 'ffplay $$f' to listen)" ; \
|
|
echo "----------------------------------------------" ; \
|
|
echo "" ; \
|
|
./main -m models/ggml-$@.bin -f $$f ; \
|
|
echo "" ; \
|
|
done
|
|
|
|
#
|
|
# Tests
|
|
#
|
|
|
|
.PHONY: tests
|
|
tests:
|
|
bash ./tests/run-tests.sh $(word 2, $(MAKECMDGOALS))
|