diff --git a/extra/grpc/bark/Makefile b/extra/grpc/bark/Makefile new file mode 100644 index 000000000000..d050493025f1 --- /dev/null +++ b/extra/grpc/bark/Makefile @@ -0,0 +1,5 @@ +.PONY: ttsbark +ttsbark: + @echo "Creating virtual environment..." + @conda env create --name ttsbark --file ttsbark.yml + @echo "Virtual environment created." \ No newline at end of file diff --git a/extra/grpc/bark/README.md b/extra/grpc/bark/README.md new file mode 100644 index 000000000000..5b571e47b9d9 --- /dev/null +++ b/extra/grpc/bark/README.md @@ -0,0 +1,16 @@ +# Creating a separate environment for ttsbark project + +``` +make ttsbark +``` + +# Testing the gRPC server + +``` + -m unittest test_ttsbark.py +``` + +For example +``` +/opt/conda/envs/bark/bin/python -m unittest extra/grpc/bark/test_ttsbark.py +`````` \ No newline at end of file diff --git a/extra/grpc/bark/test_ttsbark.py b/extra/grpc/bark/test_ttsbark.py new file mode 100644 index 000000000000..372df1678ec1 --- /dev/null +++ b/extra/grpc/bark/test_ttsbark.py @@ -0,0 +1,32 @@ +import unittest +import subprocess +import time +import backend_pb2 +import backend_pb2_grpc + +import grpc + +class TestBackendServicer(unittest.TestCase): + """ + TestBackendServicer is the class that tests the gRPC service + """ + def setUp(self): + self.service = subprocess.Popen(["python3", "ttsbark.py", "--addr", "localhost:50051"]) + + def tearDown(self) -> None: + self.service.terminate() + self.service.wait() + + def test_server_startup(self): + time.sleep(2) + try: + self.setUp() + with grpc.insecure_channel("localhost:50051") as channel: + stub = backend_pb2_grpc.BackendStub(channel) + response = stub.Health(backend_pb2.HealthMessage()) + self.assertEqual(response.message, b'OK') + except Exception as err: + print(err) + self.fail("Server failed to start") + finally: + self.tearDown() diff --git a/extra/grpc/bark/ttsbark.py b/extra/grpc/bark/ttsbark.py index 313dc3a463ea..d9891b3979b2 100644 --- a/extra/grpc/bark/ttsbark.py +++ b/extra/grpc/bark/ttsbark.py @@ -1,18 +1,23 @@ +""" +This is the extra gRPC server of LocalAI +""" + #!/usr/bin/env python3 -import grpc from concurrent import futures import time -import backend_pb2 -import backend_pb2_grpc import argparse import signal import sys import os -from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig -from pathlib import Path -from bark import SAMPLE_RATE, generate_audio, preload_models from scipy.io.wavfile import write as write_wav +import backend_pb2 +import backend_pb2_grpc +from bark import SAMPLE_RATE, generate_audio, preload_models + +import grpc + + _ONE_DAY_IN_SECONDS = 60 * 60 * 24 # If MAX_WORKERS are specified in the environment use it, otherwise default to 1 @@ -20,6 +25,9 @@ # Implement the BackendServicer class with the service methods class BackendServicer(backend_pb2_grpc.BackendServicer): + """ + BackendServicer is the class that implements the gRPC service + """ def Health(self, request, context): return backend_pb2.Reply(message=bytes("OK", 'utf-8')) def LoadModel(self, request, context): @@ -83,4 +91,4 @@ def signal_handler(sig, frame): ) args = parser.parse_args() - serve(args.addr) \ No newline at end of file + serve(args.addr) diff --git a/extra/grpc/bark/ttsbark.yml b/extra/grpc/bark/ttsbark.yml new file mode 100644 index 000000000000..bbeb49344e34 --- /dev/null +++ b/extra/grpc/bark/ttsbark.yml @@ -0,0 +1,96 @@ +name: bark +channels: + - defaults +dependencies: + - _libgcc_mutex=0.1=main + - _openmp_mutex=5.1=1_gnu + - bzip2=1.0.8=h7b6447c_0 + - ca-certificates=2023.08.22=h06a4308_0 + - ld_impl_linux-64=2.38=h1181459_1 + - libffi=3.4.4=h6a678d5_0 + - libgcc-ng=11.2.0=h1234567_1 + - libgomp=11.2.0=h1234567_1 + - libstdcxx-ng=11.2.0=h1234567_1 + - libuuid=1.41.5=h5eee18b_0 + - ncurses=6.4=h6a678d5_0 + - openssl=3.0.11=h7f8727e_2 + - pip=23.2.1=py311h06a4308_0 + - python=3.11.5=h955ad1f_0 + - readline=8.2=h5eee18b_0 + - setuptools=68.0.0=py311h06a4308_0 + - sqlite=3.41.2=h5eee18b_0 + - tk=8.6.12=h1ccaba5_0 + - wheel=0.41.2=py311h06a4308_0 + - xz=5.4.2=h5eee18b_0 + - zlib=1.2.13=h5eee18b_0 + - pip: + - accelerate==0.23.0 + - aiohttp==3.8.5 + - aiosignal==1.3.1 + - async-timeout==4.0.3 + - attrs==23.1.0 + - bark==0.1.5 + - boto3==1.28.61 + - botocore==1.31.61 + - certifi==2023.7.22 + - charset-normalizer==3.3.0 + - datasets==2.14.5 + - dill==0.3.7 + - einops==0.7.0 + - encodec==0.1.1 + - filelock==3.12.4 + - frozenlist==1.4.0 + - fsspec==2023.6.0 + - funcy==2.0 + - grpcio==1.59.0 + - huggingface-hub==0.16.4 + - idna==3.4 + - jinja2==3.1.2 + - jmespath==1.0.1 + - markupsafe==2.1.3 + - mpmath==1.3.0 + - multidict==6.0.4 + - multiprocess==0.70.15 + - networkx==3.1 + - numpy==1.26.0 + - nvidia-cublas-cu12==12.1.3.1 + - nvidia-cuda-cupti-cu12==12.1.105 + - nvidia-cuda-nvrtc-cu12==12.1.105 + - nvidia-cuda-runtime-cu12==12.1.105 + - nvidia-cudnn-cu12==8.9.2.26 + - nvidia-cufft-cu12==11.0.2.54 + - nvidia-curand-cu12==10.3.2.106 + - nvidia-cusolver-cu12==11.4.5.107 + - nvidia-cusparse-cu12==12.1.0.106 + - nvidia-nccl-cu12==2.18.1 + - nvidia-nvjitlink-cu12==12.2.140 + - nvidia-nvtx-cu12==12.1.105 + - packaging==23.2 + - pandas==2.1.1 + - peft==0.5.0 + - protobuf==4.24.4 + - psutil==5.9.5 + - pyarrow==13.0.0 + - python-dateutil==2.8.2 + - pytz==2023.3.post1 + - pyyaml==6.0.1 + - regex==2023.10.3 + - requests==2.31.0 + - rouge==1.0.1 + - s3transfer==0.7.0 + - safetensors==0.3.3 + - scipy==1.11.3 + - six==1.16.0 + - sympy==1.12 + - tokenizers==0.14.0 + - torch==2.1.0 + - torchaudio==2.1.0 + - tqdm==4.66.1 + - transformers==4.34.0 + - triton==2.1.0 + - typing-extensions==4.8.0 + - tzdata==2023.3 + - urllib3==1.26.17 + - xxhash==3.4.1 + - yarl==1.9.2 +prefix: /opt/conda/envs/bark