diff --git a/.github/workflows/build-push-image.yml b/.github/workflows/build-push-image.yml
new file mode 100644
index 00000000..5e568ede
--- /dev/null
+++ b/.github/workflows/build-push-image.yml
@@ -0,0 +1,28 @@
+name: Build and Push Docker Image
+on:
+ push:
+ branches:
+ - '*'
+
+env:
+ DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
+ DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
+
+jobs:
+ build-and-push:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v2
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ env.DOCKERHUB_USERNAME }}
+ password: ${{ env.DOCKERHUB_TOKEN }}
+ - name: Build Docker image
+ run: |
+ docker build -t bark:latest .
+ - name: Push Docker image
+ run: |
+ docker tag bark:latest ${{ env.DOCKERHUB_USERNAME }}/bark:latest
+ docker push ${{ env.DOCKERHUB_USERNAME }}/bark:latest
\ No newline at end of file
diff --git a/.github/workflows/generate-sphinx-doc.yml b/.github/workflows/generate-sphinx-doc.yml
new file mode 100644
index 00000000..140e510c
--- /dev/null
+++ b/.github/workflows/generate-sphinx-doc.yml
@@ -0,0 +1,18 @@
+name: Docs Build And Check
+on:
+ push:
+ branches:
+ - '*'
+
+jobs:
+ docs:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - uses: ammaraskar/sphinx-action@master
+ with:
+ docs-folder: "docs/"
+ - uses: actions/upload-artifact@v1
+ with:
+ name: DocumentationHTML
+ path: docs/build/html/
\ No newline at end of file
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 00000000..0136d2e7
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,18 @@
+name: Python Linter
+on:
+ push:
+ branches:
+ - '*'
+
+jobs:
+ docs:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Python Linter
+ uses: sunnysid3up/python-linter@master
+ with:
+ source: "bark"
+ mypy-options: "--ignore-missing-imports --show-error-codes"
+ pylint-options: "--rcfile=setup.cfg"
+ isort-options: "-w 100"
diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml
new file mode 100644
index 00000000..ed02bc46
--- /dev/null
+++ b/.github/workflows/unit-test.yml
@@ -0,0 +1,25 @@
+name: Unit Test
+on:
+ push:
+ branches:
+ - '*'
+
+jobs:
+ docs:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: '3.11.3'
+ - name: Install dependencies
+ run: |
+ sudo apt update -y
+ sudo apt install -y python3-pip
+
+ pip3 install .
+ pip3 install -e '.[dev]'
+ - name: Test with pytest
+ run: |
+ pytest
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..173205e5
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,25 @@
+# Copyright (c) Meta, Inc. and its affiliates.
+# This source code is licensed under the MIT license found in the
+# LICENSE file in the root directory of this source tree.
+FROM ubuntu:22.04
+
+# Installing the required packages
+RUN apt update -y
+RUN apt install -y git curl
+RUN apt install -y python3-pip
+
+WORKDIR /root
+
+COPY . .
+
+# Download the Bark Github repo
+RUN git clone https://github.com/luis-furtado/bark-with-voice-clone.git ~/app
+
+RUN cd ~/app
+
+# Install dependencies and dev dependencies to run tests
+RUN cd ~/app && \
+ pip3 install . && \
+ pip3 install -e '.[dev]'
+
+CMD ["python3", "setup.py", "--help"]
\ No newline at end of file
diff --git a/bark/test_sample.py b/bark/test_sample.py
new file mode 100644
index 00000000..dcc82513
--- /dev/null
+++ b/bark/test_sample.py
@@ -0,0 +1,5 @@
+def func(x):
+ return x + 1
+
+def test_answer():
+ assert func(4) == 5
\ No newline at end of file
diff --git a/build/html/.gitkeep b/build/html/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 00000000..ed880990
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = .
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/bark.rst b/docs/bark.rst
new file mode 100644
index 00000000..7204eb14
--- /dev/null
+++ b/docs/bark.rst
@@ -0,0 +1,45 @@
+bark package
+============
+
+Submodules
+----------
+
+bark.api module
+---------------
+
+.. automodule:: bark.api
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+bark.generation module
+----------------------
+
+.. automodule:: bark.generation
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+bark.model module
+-----------------
+
+.. automodule:: bark.model
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+bark.model\_fine module
+-----------------------
+
+.. automodule:: bark.model_fine
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: bark
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/build/doctrees/bark.doctree b/docs/build/doctrees/bark.doctree
new file mode 100644
index 00000000..005e0b94
Binary files /dev/null and b/docs/build/doctrees/bark.doctree differ
diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle
new file mode 100644
index 00000000..0661c8d1
Binary files /dev/null and b/docs/build/doctrees/environment.pickle differ
diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree
new file mode 100644
index 00000000..d844d806
Binary files /dev/null and b/docs/build/doctrees/index.doctree differ
diff --git a/docs/build/doctrees/modules.doctree b/docs/build/doctrees/modules.doctree
new file mode 100644
index 00000000..94a53d18
Binary files /dev/null and b/docs/build/doctrees/modules.doctree differ
diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo
new file mode 100644
index 00000000..72a1030c
--- /dev/null
+++ b/docs/build/html/.buildinfo
@@ -0,0 +1,4 @@
+# Sphinx build info version 1
+# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
+config: 3c3a45f7380646673145bdabaed7ce09
+tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/build/html/_sources/bark.rst.txt b/docs/build/html/_sources/bark.rst.txt
new file mode 100644
index 00000000..7204eb14
--- /dev/null
+++ b/docs/build/html/_sources/bark.rst.txt
@@ -0,0 +1,45 @@
+bark package
+============
+
+Submodules
+----------
+
+bark.api module
+---------------
+
+.. automodule:: bark.api
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+bark.generation module
+----------------------
+
+.. automodule:: bark.generation
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+bark.model module
+-----------------
+
+.. automodule:: bark.model
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+bark.model\_fine module
+-----------------------
+
+.. automodule:: bark.model_fine
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: bark
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt
new file mode 100644
index 00000000..26c953bf
--- /dev/null
+++ b/docs/build/html/_sources/index.rst.txt
@@ -0,0 +1,20 @@
+.. Bark documentation master file, created by
+ sphinx-quickstart on Tue Jun 27 10:35:37 2023.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to Bark's documentation!
+================================
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents:
+
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/docs/build/html/_sources/modules.rst.txt b/docs/build/html/_sources/modules.rst.txt
new file mode 100644
index 00000000..77bc686f
--- /dev/null
+++ b/docs/build/html/_sources/modules.rst.txt
@@ -0,0 +1,7 @@
+bark
+====
+
+.. toctree::
+ :maxdepth: 4
+
+ bark
diff --git a/docs/build/html/_static/alabaster.css b/docs/build/html/_static/alabaster.css
new file mode 100644
index 00000000..517d0b29
--- /dev/null
+++ b/docs/build/html/_static/alabaster.css
@@ -0,0 +1,703 @@
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ font-family: Georgia, serif;
+ font-size: 17px;
+ background-color: #fff;
+ color: #000;
+ margin: 0;
+ padding: 0;
+}
+
+
+div.document {
+ width: 940px;
+ margin: 30px auto 0 auto;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 220px;
+}
+
+div.sphinxsidebar {
+ width: 220px;
+ font-size: 14px;
+ line-height: 1.5;
+}
+
+hr {
+ border: 1px solid #B1B4B6;
+}
+
+div.body {
+ background-color: #fff;
+ color: #3E4349;
+ padding: 0 30px 0 30px;
+}
+
+div.body > .section {
+ text-align: left;
+}
+
+div.footer {
+ width: 940px;
+ margin: 20px auto 30px auto;
+ font-size: 14px;
+ color: #888;
+ text-align: right;
+}
+
+div.footer a {
+ color: #888;
+}
+
+p.caption {
+ font-family: inherit;
+ font-size: inherit;
+}
+
+
+div.relations {
+ display: none;
+}
+
+
+div.sphinxsidebar a {
+ color: #444;
+ text-decoration: none;
+ border-bottom: 1px dotted #999;
+}
+
+div.sphinxsidebar a:hover {
+ border-bottom: 1px solid #999;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 18px 10px;
+}
+
+div.sphinxsidebarwrapper p.logo {
+ padding: 0;
+ margin: -10px 0 0 0px;
+ text-align: center;
+}
+
+div.sphinxsidebarwrapper h1.logo {
+ margin-top: -10px;
+ text-align: center;
+ margin-bottom: 5px;
+ text-align: left;
+}
+
+div.sphinxsidebarwrapper h1.logo-name {
+ margin-top: 0px;
+}
+
+div.sphinxsidebarwrapper p.blurb {
+ margin-top: 0;
+ font-style: normal;
+}
+
+div.sphinxsidebar h3,
+div.sphinxsidebar h4 {
+ font-family: Georgia, serif;
+ color: #444;
+ font-size: 24px;
+ font-weight: normal;
+ margin: 0 0 5px 0;
+ padding: 0;
+}
+
+div.sphinxsidebar h4 {
+ font-size: 20px;
+}
+
+div.sphinxsidebar h3 a {
+ color: #444;
+}
+
+div.sphinxsidebar p.logo a,
+div.sphinxsidebar h3 a,
+div.sphinxsidebar p.logo a:hover,
+div.sphinxsidebar h3 a:hover {
+ border: none;
+}
+
+div.sphinxsidebar p {
+ color: #555;
+ margin: 10px 0;
+}
+
+div.sphinxsidebar ul {
+ margin: 10px 0;
+ padding: 0;
+ color: #000;
+}
+
+div.sphinxsidebar ul li.toctree-l1 > a {
+ font-size: 120%;
+}
+
+div.sphinxsidebar ul li.toctree-l2 > a {
+ font-size: 110%;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #CCC;
+ font-family: Georgia, serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar hr {
+ border: none;
+ height: 1px;
+ color: #AAA;
+ background: #AAA;
+
+ text-align: left;
+ margin-left: 0;
+ width: 50%;
+}
+
+div.sphinxsidebar .badge {
+ border-bottom: none;
+}
+
+div.sphinxsidebar .badge:hover {
+ border-bottom: none;
+}
+
+/* To address an issue with donation coming after search */
+div.sphinxsidebar h3.donation {
+ margin-top: 10px;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+a {
+ color: #004B6B;
+ text-decoration: underline;
+}
+
+a:hover {
+ color: #6D4100;
+ text-decoration: underline;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: Georgia, serif;
+ font-weight: normal;
+ margin: 30px 0px 10px 0px;
+ padding: 0;
+}
+
+div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
+div.body h2 { font-size: 180%; }
+div.body h3 { font-size: 150%; }
+div.body h4 { font-size: 130%; }
+div.body h5 { font-size: 100%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+ color: #DDD;
+ padding: 0 4px;
+ text-decoration: none;
+}
+
+a.headerlink:hover {
+ color: #444;
+ background: #EAEAEA;
+}
+
+div.body p, div.body dd, div.body li {
+ line-height: 1.4em;
+}
+
+div.admonition {
+ margin: 20px 0px;
+ padding: 10px 30px;
+ background-color: #EEE;
+ border: 1px solid #CCC;
+}
+
+div.admonition tt.xref, div.admonition code.xref, div.admonition a tt {
+ background-color: #FBFBFB;
+ border-bottom: 1px solid #fafafa;
+}
+
+div.admonition p.admonition-title {
+ font-family: Georgia, serif;
+ font-weight: normal;
+ font-size: 24px;
+ margin: 0 0 10px 0;
+ padding: 0;
+ line-height: 1;
+}
+
+div.admonition p.last {
+ margin-bottom: 0;
+}
+
+div.highlight {
+ background-color: #fff;
+}
+
+dt:target, .highlight {
+ background: #FAF3E8;
+}
+
+div.warning {
+ background-color: #FCC;
+ border: 1px solid #FAA;
+}
+
+div.danger {
+ background-color: #FCC;
+ border: 1px solid #FAA;
+ -moz-box-shadow: 2px 2px 4px #D52C2C;
+ -webkit-box-shadow: 2px 2px 4px #D52C2C;
+ box-shadow: 2px 2px 4px #D52C2C;
+}
+
+div.error {
+ background-color: #FCC;
+ border: 1px solid #FAA;
+ -moz-box-shadow: 2px 2px 4px #D52C2C;
+ -webkit-box-shadow: 2px 2px 4px #D52C2C;
+ box-shadow: 2px 2px 4px #D52C2C;
+}
+
+div.caution {
+ background-color: #FCC;
+ border: 1px solid #FAA;
+}
+
+div.attention {
+ background-color: #FCC;
+ border: 1px solid #FAA;
+}
+
+div.important {
+ background-color: #EEE;
+ border: 1px solid #CCC;
+}
+
+div.note {
+ background-color: #EEE;
+ border: 1px solid #CCC;
+}
+
+div.tip {
+ background-color: #EEE;
+ border: 1px solid #CCC;
+}
+
+div.hint {
+ background-color: #EEE;
+ border: 1px solid #CCC;
+}
+
+div.seealso {
+ background-color: #EEE;
+ border: 1px solid #CCC;
+}
+
+div.topic {
+ background-color: #EEE;
+}
+
+p.admonition-title {
+ display: inline;
+}
+
+p.admonition-title:after {
+ content: ":";
+}
+
+pre, tt, code {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.9em;
+}
+
+.hll {
+ background-color: #FFC;
+ margin: 0 -12px;
+ padding: 0 12px;
+ display: block;
+}
+
+img.screenshot {
+}
+
+tt.descname, tt.descclassname, code.descname, code.descclassname {
+ font-size: 0.95em;
+}
+
+tt.descname, code.descname {
+ padding-right: 0.08em;
+}
+
+img.screenshot {
+ -moz-box-shadow: 2px 2px 4px #EEE;
+ -webkit-box-shadow: 2px 2px 4px #EEE;
+ box-shadow: 2px 2px 4px #EEE;
+}
+
+table.docutils {
+ border: 1px solid #888;
+ -moz-box-shadow: 2px 2px 4px #EEE;
+ -webkit-box-shadow: 2px 2px 4px #EEE;
+ box-shadow: 2px 2px 4px #EEE;
+}
+
+table.docutils td, table.docutils th {
+ border: 1px solid #888;
+ padding: 0.25em 0.7em;
+}
+
+table.field-list, table.footnote {
+ border: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+
+table.footnote {
+ margin: 15px 0;
+ width: 100%;
+ border: 1px solid #EEE;
+ background: #FDFDFD;
+ font-size: 0.9em;
+}
+
+table.footnote + table.footnote {
+ margin-top: -15px;
+ border-top: none;
+}
+
+table.field-list th {
+ padding: 0 0.8em 0 0;
+}
+
+table.field-list td {
+ padding: 0;
+}
+
+table.field-list p {
+ margin-bottom: 0.8em;
+}
+
+/* Cloned from
+ * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68
+ */
+.field-name {
+ -moz-hyphens: manual;
+ -ms-hyphens: manual;
+ -webkit-hyphens: manual;
+ hyphens: manual;
+}
+
+table.footnote td.label {
+ width: .1px;
+ padding: 0.3em 0 0.3em 0.5em;
+}
+
+table.footnote td {
+ padding: 0.3em 0.5em;
+}
+
+dl {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding: 0;
+}
+
+dl dd {
+ margin-left: 30px;
+}
+
+blockquote {
+ margin: 0 0 0 30px;
+ padding: 0;
+}
+
+ul, ol {
+ /* Matches the 30px from the narrow-screen "li > ul" selector below */
+ margin: 10px 0 10px 30px;
+ padding: 0;
+}
+
+pre {
+ background: #EEE;
+ padding: 7px 30px;
+ margin: 15px 0px;
+ line-height: 1.3em;
+}
+
+div.viewcode-block:target {
+ background: #ffd;
+}
+
+dl pre, blockquote pre, li pre {
+ margin-left: 0;
+ padding-left: 30px;
+}
+
+tt, code {
+ background-color: #ecf0f3;
+ color: #222;
+ /* padding: 1px 2px; */
+}
+
+tt.xref, code.xref, a tt {
+ background-color: #FBFBFB;
+ border-bottom: 1px solid #fff;
+}
+
+a.reference {
+ text-decoration: none;
+ border-bottom: 1px dotted #004B6B;
+}
+
+/* Don't put an underline on images */
+a.image-reference, a.image-reference:hover {
+ border-bottom: none;
+}
+
+a.reference:hover {
+ border-bottom: 1px solid #6D4100;
+}
+
+a.footnote-reference {
+ text-decoration: none;
+ font-size: 0.7em;
+ vertical-align: top;
+ border-bottom: 1px dotted #004B6B;
+}
+
+a.footnote-reference:hover {
+ border-bottom: 1px solid #6D4100;
+}
+
+a:hover tt, a:hover code {
+ background: #EEE;
+}
+
+
+@media screen and (max-width: 870px) {
+
+ div.sphinxsidebar {
+ display: none;
+ }
+
+ div.document {
+ width: 100%;
+
+ }
+
+ div.documentwrapper {
+ margin-left: 0;
+ margin-top: 0;
+ margin-right: 0;
+ margin-bottom: 0;
+ }
+
+ div.bodywrapper {
+ margin-top: 0;
+ margin-right: 0;
+ margin-bottom: 0;
+ margin-left: 0;
+ }
+
+ ul {
+ margin-left: 0;
+ }
+
+ li > ul {
+ /* Matches the 30px from the "ul, ol" selector above */
+ margin-left: 30px;
+ }
+
+ .document {
+ width: auto;
+ }
+
+ .footer {
+ width: auto;
+ }
+
+ .bodywrapper {
+ margin: 0;
+ }
+
+ .footer {
+ width: auto;
+ }
+
+ .github {
+ display: none;
+ }
+
+
+
+}
+
+
+
+@media screen and (max-width: 875px) {
+
+ body {
+ margin: 0;
+ padding: 20px 30px;
+ }
+
+ div.documentwrapper {
+ float: none;
+ background: #fff;
+ }
+
+ div.sphinxsidebar {
+ display: block;
+ float: none;
+ width: 102.5%;
+ margin: 50px -30px -20px -30px;
+ padding: 10px 20px;
+ background: #333;
+ color: #FFF;
+ }
+
+ div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
+ div.sphinxsidebar h3 a {
+ color: #fff;
+ }
+
+ div.sphinxsidebar a {
+ color: #AAA;
+ }
+
+ div.sphinxsidebar p.logo {
+ display: none;
+ }
+
+ div.document {
+ width: 100%;
+ margin: 0;
+ }
+
+ div.footer {
+ display: none;
+ }
+
+ div.bodywrapper {
+ margin: 0;
+ }
+
+ div.body {
+ min-height: 0;
+ padding: 0;
+ }
+
+ .rtd_doc_footer {
+ display: none;
+ }
+
+ .document {
+ width: auto;
+ }
+
+ .footer {
+ width: auto;
+ }
+
+ .footer {
+ width: auto;
+ }
+
+ .github {
+ display: none;
+ }
+}
+
+
+/* misc. */
+
+.revsys-inline {
+ display: none!important;
+}
+
+/* Make nested-list/multi-paragraph items look better in Releases changelog
+ * pages. Without this, docutils' magical list fuckery causes inconsistent
+ * formatting between different release sub-lists.
+ */
+div#changelog > div.section > ul > li > p:only-child {
+ margin-bottom: 0;
+}
+
+/* Hide fugly table cell borders in ..bibliography:: directive output */
+table.docutils.citation, table.docutils.citation td, table.docutils.citation th {
+ border: none;
+ /* Below needed in some edge cases; if not applied, bottom shadows appear */
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+
+
+/* relbar */
+
+.related {
+ line-height: 30px;
+ width: 100%;
+ font-size: 0.9rem;
+}
+
+.related.top {
+ border-bottom: 1px solid #EEE;
+ margin-bottom: 20px;
+}
+
+.related.bottom {
+ border-top: 1px solid #EEE;
+}
+
+.related ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.related li {
+ display: inline;
+}
+
+nav#rellinks {
+ float: right;
+}
+
+nav#rellinks li+li:before {
+ content: "|";
+}
+
+nav#breadcrumbs li+li:before {
+ content: "\00BB";
+}
+
+/* Hide certain items when printing */
+@media print {
+ div.related {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css
new file mode 100644
index 00000000..7577acb1
--- /dev/null
+++ b/docs/build/html/_static/basic.css
@@ -0,0 +1,903 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+div.section::after {
+ display: block;
+ content: '';
+ clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+ word-wrap: break-word;
+ overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+ overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+ float: left;
+ width: 80%;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ float: left;
+ width: 20%;
+ border-left: none;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li p.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+ min-width: 360px;
+ max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto;
+}
+
+a.headerlink {
+ visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-default {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+ clear: right;
+ overflow-x: auto;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+ clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+ margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+ display: block;
+ content: '';
+ clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.align-default {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+ margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+ margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+ margin: 0.5em;
+ padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+ padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.field-name {
+ -moz-hyphens: manual;
+ -ms-hyphens: manual;
+ -webkit-hyphens: manual;
+ hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+ margin: 1em 0;
+}
+
+table.hlist td {
+ vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.sig-name {
+ font-size: 1.1em;
+}
+
+code.descname {
+ font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.sig-param.n {
+ font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+ font-family: unset;
+}
+
+.sig.c .k, .sig.c .kt,
+.sig.cpp .k, .sig.cpp .kt {
+ color: #0033B3;
+}
+
+.sig.c .m,
+.sig.cpp .m {
+ color: #1750EB;
+}
+
+.sig.c .s, .sig.c .sc,
+.sig.cpp .s, .sig.cpp .sc {
+ color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+ margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+ margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+ margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+ margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+ margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+ float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+ padding-right: 0.5em;
+}
+aside.footnote > p {
+ margin-left: 2em;
+}
+div.citation > p {
+ margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+ margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+ content: "";
+ clear: both;
+}
+
+dl.field-list {
+ display: grid;
+ grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+ font-weight: bold;
+ word-break: break-word;
+ padding-left: 0.5em;
+ padding-right: 5px;
+}
+
+dl.field-list > dd {
+ padding-left: 0.5em;
+ margin-top: 0em;
+ margin-left: 0em;
+ margin-bottom: 0em;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd > :first-child {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+ margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+ background-color: #fbe54e;
+}
+
+rect.highlighted {
+ fill: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+.classifier:before {
+ font-style: normal;
+ margin: 0 0.5em;
+ content: ":";
+ display: inline-block;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+ clear: both;
+}
+
+span.pre {
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ -webkit-hyphens: none;
+ hyphens: none;
+ white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+ margin: 1em 0;
+}
+
+td.linenos pre {
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ display: block;
+}
+
+table.highlighttable tbody {
+ display: block;
+}
+
+table.highlighttable tr {
+ display: flex;
+}
+
+table.highlighttable td {
+ margin: 0;
+ padding: 0;
+}
+
+table.highlighttable td.linenos {
+ padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+ flex: 1;
+ overflow: hidden;
+}
+
+.highlight .hll {
+ display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+ margin: 0;
+}
+
+div.code-block-caption + div {
+ margin-top: 0;
+}
+
+div.code-block-caption {
+ margin-top: 1em;
+ padding: 2px 5px;
+ font-size: small;
+}
+
+div.code-block-caption code {
+ background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp { /* gp: Generic.Prompt */
+ user-select: none;
+ -webkit-user-select: text; /* Safari fallback only */
+ -webkit-user-select: none; /* Chrome/Safari */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ margin: 1em 0;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+span.eqno a.headerlink {
+ position: absolute;
+ z-index: 1;
+}
+
+div.math:hover a.headerlink {
+ visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/docs/build/html/_static/custom.css b/docs/build/html/_static/custom.css
new file mode 100644
index 00000000..2a924f1d
--- /dev/null
+++ b/docs/build/html/_static/custom.css
@@ -0,0 +1 @@
+/* This file intentionally left blank. */
diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js
new file mode 100644
index 00000000..d06a71d7
--- /dev/null
+++ b/docs/build/html/_static/doctools.js
@@ -0,0 +1,156 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+ "TEXTAREA",
+ "INPUT",
+ "SELECT",
+ "BUTTON",
+]);
+
+const _ready = (callback) => {
+ if (document.readyState !== "loading") {
+ callback();
+ } else {
+ document.addEventListener("DOMContentLoaded", callback);
+ }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+ init: () => {
+ Documentation.initDomainIndexTable();
+ Documentation.initOnKeyListeners();
+ },
+
+ /**
+ * i18n support
+ */
+ TRANSLATIONS: {},
+ PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+ LOCALE: "unknown",
+
+ // gettext and ngettext don't access this so that the functions
+ // can safely bound to a different name (_ = Documentation.gettext)
+ gettext: (string) => {
+ const translated = Documentation.TRANSLATIONS[string];
+ switch (typeof translated) {
+ case "undefined":
+ return string; // no translation
+ case "string":
+ return translated; // translation exists
+ default:
+ return translated[0]; // (singular, plural) translation tuple exists
+ }
+ },
+
+ ngettext: (singular, plural, n) => {
+ const translated = Documentation.TRANSLATIONS[singular];
+ if (typeof translated !== "undefined")
+ return translated[Documentation.PLURAL_EXPR(n)];
+ return n === 1 ? singular : plural;
+ },
+
+ addTranslations: (catalog) => {
+ Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+ Documentation.PLURAL_EXPR = new Function(
+ "n",
+ `return (${catalog.plural_expr})`
+ );
+ Documentation.LOCALE = catalog.locale;
+ },
+
+ /**
+ * helper function to focus on search bar
+ */
+ focusSearchBar: () => {
+ document.querySelectorAll("input[name=q]")[0]?.focus();
+ },
+
+ /**
+ * Initialise the domain index toggle buttons
+ */
+ initDomainIndexTable: () => {
+ const toggler = (el) => {
+ const idNumber = el.id.substr(7);
+ const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+ if (el.src.substr(-9) === "minus.png") {
+ el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+ toggledRows.forEach((el) => (el.style.display = "none"));
+ } else {
+ el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+ toggledRows.forEach((el) => (el.style.display = ""));
+ }
+ };
+
+ const togglerElements = document.querySelectorAll("img.toggler");
+ togglerElements.forEach((el) =>
+ el.addEventListener("click", (event) => toggler(event.currentTarget))
+ );
+ togglerElements.forEach((el) => (el.style.display = ""));
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+ },
+
+ initOnKeyListeners: () => {
+ // only install a listener if it is really needed
+ if (
+ !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
+ !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+ )
+ return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+ // bail with special keys
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+ if (!event.shiftKey) {
+ switch (event.key) {
+ case "ArrowLeft":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const prevLink = document.querySelector('link[rel="prev"]');
+ if (prevLink && prevLink.href) {
+ window.location.href = prevLink.href;
+ event.preventDefault();
+ }
+ break;
+ case "ArrowRight":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const nextLink = document.querySelector('link[rel="next"]');
+ if (nextLink && nextLink.href) {
+ window.location.href = nextLink.href;
+ event.preventDefault();
+ }
+ break;
+ }
+ }
+
+ // some keyboard layouts may need Shift to get /
+ switch (event.key) {
+ case "/":
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+ Documentation.focusSearchBar();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js
new file mode 100644
index 00000000..2db8a09e
--- /dev/null
+++ b/docs/build/html/_static/documentation_options.js
@@ -0,0 +1,14 @@
+var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
+ VERSION: '1',
+ LANGUAGE: 'en',
+ COLLAPSE_INDEX: false,
+ BUILDER: 'html',
+ FILE_SUFFIX: '.html',
+ LINK_SUFFIX: '.html',
+ HAS_SOURCE: true,
+ SOURCELINK_SUFFIX: '.txt',
+ NAVIGATION_WITH_KEYS: false,
+ SHOW_SEARCH_SUMMARY: true,
+ ENABLE_SEARCH_SHORTCUTS: true,
+};
\ No newline at end of file
diff --git a/docs/build/html/_static/file.png b/docs/build/html/_static/file.png
new file mode 100644
index 00000000..a858a410
Binary files /dev/null and b/docs/build/html/_static/file.png differ
diff --git a/docs/build/html/_static/language_data.js b/docs/build/html/_static/language_data.js
new file mode 100644
index 00000000..250f5665
--- /dev/null
+++ b/docs/build/html/_static/language_data.js
@@ -0,0 +1,199 @@
+/*
+ * language_data.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
+
+
+/* Non-minified version is copied as a separate JS file, is available */
+
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+ var step2list = {
+ ational: 'ate',
+ tional: 'tion',
+ enci: 'ence',
+ anci: 'ance',
+ izer: 'ize',
+ bli: 'ble',
+ alli: 'al',
+ entli: 'ent',
+ eli: 'e',
+ ousli: 'ous',
+ ization: 'ize',
+ ation: 'ate',
+ ator: 'ate',
+ alism: 'al',
+ iveness: 'ive',
+ fulness: 'ful',
+ ousness: 'ous',
+ aliti: 'al',
+ iviti: 'ive',
+ biliti: 'ble',
+ logi: 'log'
+ };
+
+ var step3list = {
+ icate: 'ic',
+ ative: '',
+ alize: 'al',
+ iciti: 'ic',
+ ical: 'ic',
+ ful: '',
+ ness: ''
+ };
+
+ var c = "[^aeiou]"; // consonant
+ var v = "[aeiouy]"; // vowel
+ var C = c + "[^aeiouy]*"; // consonant sequence
+ var V = v + "[aeiou]*"; // vowel sequence
+
+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
+ var s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ this.stemWord = function (w) {
+ var stem;
+ var suffix;
+ var firstch;
+ var origword = w;
+
+ if (w.length < 3)
+ return w;
+
+ var re;
+ var re2;
+ var re3;
+ var re4;
+
+ firstch = w.substr(0,1);
+ if (firstch == "y")
+ w = firstch.toUpperCase() + w.substr(1);
+
+ // Step 1a
+ re = /^(.+?)(ss|i)es$/;
+ re2 = /^(.+?)([^s])s$/;
+
+ if (re.test(w))
+ w = w.replace(re,"$1$2");
+ else if (re2.test(w))
+ w = w.replace(re2,"$1$2");
+
+ // Step 1b
+ re = /^(.+?)eed$/;
+ re2 = /^(.+?)(ed|ing)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = new RegExp(mgr0);
+ if (re.test(fp[1])) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = new RegExp(s_v);
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = /(at|bl|iz)$/;
+ re3 = new RegExp("([^aeiouylsz])\\1$");
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re2.test(w))
+ w = w + "e";
+ else if (re3.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ else if (re4.test(w))
+ w = w + "e";
+ }
+ }
+
+ // Step 1c
+ re = /^(.+?)y$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(s_v);
+ if (re.test(stem))
+ w = stem + "i";
+ }
+
+ // Step 2
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step2list[suffix];
+ }
+
+ // Step 3
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step3list[suffix];
+ }
+
+ // Step 4
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+ re2 = /^(.+?)(s|t)(ion)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ if (re.test(stem))
+ w = stem;
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = new RegExp(mgr1);
+ if (re2.test(stem))
+ w = stem;
+ }
+
+ // Step 5
+ re = /^(.+?)e$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ re2 = new RegExp(meq1);
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+ w = stem;
+ }
+ re = /ll$/;
+ re2 = new RegExp(mgr1);
+ if (re.test(w) && re2.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+ if (firstch == "y")
+ w = firstch.toLowerCase() + w.substr(1);
+ return w;
+ }
+}
+
diff --git a/docs/build/html/_static/minus.png b/docs/build/html/_static/minus.png
new file mode 100644
index 00000000..d96755fd
Binary files /dev/null and b/docs/build/html/_static/minus.png differ
diff --git a/docs/build/html/_static/plus.png b/docs/build/html/_static/plus.png
new file mode 100644
index 00000000..7107cec9
Binary files /dev/null and b/docs/build/html/_static/plus.png differ
diff --git a/docs/build/html/_static/pygments.css b/docs/build/html/_static/pygments.css
new file mode 100644
index 00000000..9abe04ba
--- /dev/null
+++ b/docs/build/html/_static/pygments.css
@@ -0,0 +1,83 @@
+pre { line-height: 125%; }
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #f8f8f8; }
+.highlight .c { color: #8f5902; font-style: italic } /* Comment */
+.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
+.highlight .g { color: #000000 } /* Generic */
+.highlight .k { color: #004461; font-weight: bold } /* Keyword */
+.highlight .l { color: #000000 } /* Literal */
+.highlight .n { color: #000000 } /* Name */
+.highlight .o { color: #582800 } /* Operator */
+.highlight .x { color: #000000 } /* Other */
+.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
+.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #8f5902 } /* Comment.Preproc */
+.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #a40000 } /* Generic.Deleted */
+.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #ef2929 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gp { color: #745334 } /* Generic.Prompt */
+.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
+.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */
+.highlight .ld { color: #000000 } /* Literal.Date */
+.highlight .m { color: #990000 } /* Literal.Number */
+.highlight .s { color: #4e9a06 } /* Literal.String */
+.highlight .na { color: #c4a000 } /* Name.Attribute */
+.highlight .nb { color: #004461 } /* Name.Builtin */
+.highlight .nc { color: #000000 } /* Name.Class */
+.highlight .no { color: #000000 } /* Name.Constant */
+.highlight .nd { color: #888888 } /* Name.Decorator */
+.highlight .ni { color: #ce5c00 } /* Name.Entity */
+.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #000000 } /* Name.Function */
+.highlight .nl { color: #f57900 } /* Name.Label */
+.highlight .nn { color: #000000 } /* Name.Namespace */
+.highlight .nx { color: #000000 } /* Name.Other */
+.highlight .py { color: #000000 } /* Name.Property */
+.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #000000 } /* Name.Variable */
+.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */
+.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */
+.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */
+.highlight .mb { color: #990000 } /* Literal.Number.Bin */
+.highlight .mf { color: #990000 } /* Literal.Number.Float */
+.highlight .mh { color: #990000 } /* Literal.Number.Hex */
+.highlight .mi { color: #990000 } /* Literal.Number.Integer */
+.highlight .mo { color: #990000 } /* Literal.Number.Oct */
+.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */
+.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
+.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
+.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */
+.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
+.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
+.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
+.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
+.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
+.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
+.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
+.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
+.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #000000 } /* Name.Function.Magic */
+.highlight .vc { color: #000000 } /* Name.Variable.Class */
+.highlight .vg { color: #000000 } /* Name.Variable.Global */
+.highlight .vi { color: #000000 } /* Name.Variable.Instance */
+.highlight .vm { color: #000000 } /* Name.Variable.Magic */
+.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/docs/build/html/_static/searchtools.js b/docs/build/html/_static/searchtools.js
new file mode 100644
index 00000000..97d56a74
--- /dev/null
+++ b/docs/build/html/_static/searchtools.js
@@ -0,0 +1,566 @@
+/*
+ * searchtools.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for the full-text search.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+/**
+ * Simple result scoring code.
+ */
+if (typeof Scorer === "undefined") {
+ var Scorer = {
+ // Implement the following function to further tweak the score for each result
+ // The function takes a result array [docname, title, anchor, descr, score, filename]
+ // and returns the new score.
+ /*
+ score: result => {
+ const [docname, title, anchor, descr, score, filename] = result
+ return score
+ },
+ */
+
+ // query matches the full name of an object
+ objNameMatch: 11,
+ // or matches in the last dotted part of the object name
+ objPartialMatch: 6,
+ // Additive scores depending on the priority of the object
+ objPrio: {
+ 0: 15, // used to be importantResults
+ 1: 5, // used to be objectResults
+ 2: -5, // used to be unimportantResults
+ },
+ // Used when the priority is not in the mapping.
+ objPrioDefault: 0,
+
+ // query found in title
+ title: 15,
+ partialTitle: 7,
+ // query found in terms
+ term: 5,
+ partialTerm: 2,
+ };
+}
+
+const _removeChildren = (element) => {
+ while (element && element.lastChild) element.removeChild(element.lastChild);
+};
+
+/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ */
+const _escapeRegExp = (string) =>
+ string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+
+const _displayItem = (item, searchTerms) => {
+ const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
+ const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT;
+ const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
+ const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
+ const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
+
+ const [docName, title, anchor, descr, score, _filename] = item;
+
+ let listItem = document.createElement("li");
+ let requestUrl;
+ let linkUrl;
+ if (docBuilder === "dirhtml") {
+ // dirhtml builder
+ let dirname = docName + "/";
+ if (dirname.match(/\/index\/$/))
+ dirname = dirname.substring(0, dirname.length - 6);
+ else if (dirname === "index/") dirname = "";
+ requestUrl = docUrlRoot + dirname;
+ linkUrl = requestUrl;
+ } else {
+ // normal html builders
+ requestUrl = docUrlRoot + docName + docFileSuffix;
+ linkUrl = docName + docLinkSuffix;
+ }
+ let linkEl = listItem.appendChild(document.createElement("a"));
+ linkEl.href = linkUrl + anchor;
+ linkEl.dataset.score = score;
+ linkEl.innerHTML = title;
+ if (descr)
+ listItem.appendChild(document.createElement("span")).innerHTML =
+ " (" + descr + ")";
+ else if (showSearchSummary)
+ fetch(requestUrl)
+ .then((responseData) => responseData.text())
+ .then((data) => {
+ if (data)
+ listItem.appendChild(
+ Search.makeSearchSummary(data, searchTerms)
+ );
+ });
+ Search.output.appendChild(listItem);
+};
+const _finishSearch = (resultCount) => {
+ Search.stopPulse();
+ Search.title.innerText = _("Search Results");
+ if (!resultCount)
+ Search.status.innerText = Documentation.gettext(
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
+ );
+ else
+ Search.status.innerText = _(
+ `Search finished, found ${resultCount} page(s) matching the search query.`
+ );
+};
+const _displayNextItem = (
+ results,
+ resultCount,
+ searchTerms
+) => {
+ // results left, load the summary and display it
+ // this is intended to be dynamic (don't sub resultsCount)
+ if (results.length) {
+ _displayItem(results.pop(), searchTerms);
+ setTimeout(
+ () => _displayNextItem(results, resultCount, searchTerms),
+ 5
+ );
+ }
+ // search finished, update title and status message
+ else _finishSearch(resultCount);
+};
+
+/**
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
+ * custom function per language.
+ *
+ * The regular expression works by splitting the string on consecutive characters
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
+ */
+if (typeof splitQuery === "undefined") {
+ var splitQuery = (query) => query
+ .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
+ .filter(term => term) // remove remaining empty strings
+}
+
+/**
+ * Search Module
+ */
+const Search = {
+ _index: null,
+ _queued_query: null,
+ _pulse_status: -1,
+
+ htmlToText: (htmlString) => {
+ const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
+ htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
+ const docContent = htmlElement.querySelector('[role="main"]');
+ if (docContent !== undefined) return docContent.textContent;
+ console.warn(
+ "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
+ );
+ return "";
+ },
+
+ init: () => {
+ const query = new URLSearchParams(window.location.search).get("q");
+ document
+ .querySelectorAll('input[name="q"]')
+ .forEach((el) => (el.value = query));
+ if (query) Search.performSearch(query);
+ },
+
+ loadIndex: (url) =>
+ (document.body.appendChild(document.createElement("script")).src = url),
+
+ setIndex: (index) => {
+ Search._index = index;
+ if (Search._queued_query !== null) {
+ const query = Search._queued_query;
+ Search._queued_query = null;
+ Search.query(query);
+ }
+ },
+
+ hasIndex: () => Search._index !== null,
+
+ deferQuery: (query) => (Search._queued_query = query),
+
+ stopPulse: () => (Search._pulse_status = -1),
+
+ startPulse: () => {
+ if (Search._pulse_status >= 0) return;
+
+ const pulse = () => {
+ Search._pulse_status = (Search._pulse_status + 1) % 4;
+ Search.dots.innerText = ".".repeat(Search._pulse_status);
+ if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
+ };
+ pulse();
+ },
+
+ /**
+ * perform a search for something (or wait until index is loaded)
+ */
+ performSearch: (query) => {
+ // create the required interface elements
+ const searchText = document.createElement("h2");
+ searchText.textContent = _("Searching");
+ const searchSummary = document.createElement("p");
+ searchSummary.classList.add("search-summary");
+ searchSummary.innerText = "";
+ const searchList = document.createElement("ul");
+ searchList.classList.add("search");
+
+ const out = document.getElementById("search-results");
+ Search.title = out.appendChild(searchText);
+ Search.dots = Search.title.appendChild(document.createElement("span"));
+ Search.status = out.appendChild(searchSummary);
+ Search.output = out.appendChild(searchList);
+
+ const searchProgress = document.getElementById("search-progress");
+ // Some themes don't use the search progress node
+ if (searchProgress) {
+ searchProgress.innerText = _("Preparing search...");
+ }
+ Search.startPulse();
+
+ // index already loaded, the browser was quick!
+ if (Search.hasIndex()) Search.query(query);
+ else Search.deferQuery(query);
+ },
+
+ /**
+ * execute search (requires search index to be loaded)
+ */
+ query: (query) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+ const allTitles = Search._index.alltitles;
+ const indexEntries = Search._index.indexentries;
+
+ // stem the search terms and add them to the correct list
+ const stemmer = new Stemmer();
+ const searchTerms = new Set();
+ const excludedTerms = new Set();
+ const highlightTerms = new Set();
+ const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
+ splitQuery(query.trim()).forEach((queryTerm) => {
+ const queryTermLower = queryTerm.toLowerCase();
+
+ // maybe skip this "word"
+ // stopwords array is from language_data.js
+ if (
+ stopwords.indexOf(queryTermLower) !== -1 ||
+ queryTerm.match(/^\d+$/)
+ )
+ return;
+
+ // stem the word
+ let word = stemmer.stemWord(queryTermLower);
+ // select the correct list
+ if (word[0] === "-") excludedTerms.add(word.substr(1));
+ else {
+ searchTerms.add(word);
+ highlightTerms.add(queryTermLower);
+ }
+ });
+
+ if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
+ localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
+ }
+
+ // console.debug("SEARCH: searching for:");
+ // console.info("required: ", [...searchTerms]);
+ // console.info("excluded: ", [...excludedTerms]);
+
+ // array of [docname, title, anchor, descr, score, filename]
+ let results = [];
+ _removeChildren(document.getElementById("search-progress"));
+
+ const queryLower = query.toLowerCase();
+ for (const [title, foundTitles] of Object.entries(allTitles)) {
+ if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
+ for (const [file, id] of foundTitles) {
+ let score = Math.round(100 * queryLower.length / title.length)
+ results.push([
+ docNames[file],
+ titles[file] !== title ? `${titles[file]} > ${title}` : title,
+ id !== null ? "#" + id : "",
+ null,
+ score,
+ filenames[file],
+ ]);
+ }
+ }
+ }
+
+ // search for explicit entries in index directives
+ for (const [entry, foundEntries] of Object.entries(indexEntries)) {
+ if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
+ for (const [file, id] of foundEntries) {
+ let score = Math.round(100 * queryLower.length / entry.length)
+ results.push([
+ docNames[file],
+ titles[file],
+ id ? "#" + id : "",
+ null,
+ score,
+ filenames[file],
+ ]);
+ }
+ }
+ }
+
+ // lookup as object
+ objectTerms.forEach((term) =>
+ results.push(...Search.performObjectSearch(term, objectTerms))
+ );
+
+ // lookup as search terms in fulltext
+ results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+
+ // let the scorer override scores with a custom scoring function
+ if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
+
+ // now sort the results by score (in opposite order of appearance, since the
+ // display function below uses pop() to retrieve items) and then
+ // alphabetically
+ results.sort((a, b) => {
+ const leftScore = a[4];
+ const rightScore = b[4];
+ if (leftScore === rightScore) {
+ // same score: sort alphabetically
+ const leftTitle = a[1].toLowerCase();
+ const rightTitle = b[1].toLowerCase();
+ if (leftTitle === rightTitle) return 0;
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+ }
+ return leftScore > rightScore ? 1 : -1;
+ });
+
+ // remove duplicate search results
+ // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
+ let seen = new Set();
+ results = results.reverse().reduce((acc, result) => {
+ let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
+ if (!seen.has(resultStr)) {
+ acc.push(result);
+ seen.add(resultStr);
+ }
+ return acc;
+ }, []);
+
+ results = results.reverse();
+
+ // for debugging
+ //Search.lastresults = results.slice(); // a copy
+ // console.info("search results:", Search.lastresults);
+
+ // print the results
+ _displayNextItem(results, results.length, searchTerms);
+ },
+
+ /**
+ * search for object names
+ */
+ performObjectSearch: (object, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const objects = Search._index.objects;
+ const objNames = Search._index.objnames;
+ const titles = Search._index.titles;
+
+ const results = [];
+
+ const objectSearchCallback = (prefix, match) => {
+ const name = match[4]
+ const fullname = (prefix ? prefix + "." : "") + name;
+ const fullnameLower = fullname.toLowerCase();
+ if (fullnameLower.indexOf(object) < 0) return;
+
+ let score = 0;
+ const parts = fullnameLower.split(".");
+
+ // check for different match types: exact matches of full name or
+ // "last name" (i.e. last dotted part)
+ if (fullnameLower === object || parts.slice(-1)[0] === object)
+ score += Scorer.objNameMatch;
+ else if (parts.slice(-1)[0].indexOf(object) > -1)
+ score += Scorer.objPartialMatch; // matches in last name
+
+ const objName = objNames[match[1]][2];
+ const title = titles[match[0]];
+
+ // If more than one term searched for, we require other words to be
+ // found in the name/title/description
+ const otherTerms = new Set(objectTerms);
+ otherTerms.delete(object);
+ if (otherTerms.size > 0) {
+ const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
+ if (
+ [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
+ )
+ return;
+ }
+
+ let anchor = match[3];
+ if (anchor === "") anchor = fullname;
+ else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
+
+ const descr = objName + _(", in ") + title;
+
+ // add custom score for some objects according to scorer
+ if (Scorer.objPrio.hasOwnProperty(match[2]))
+ score += Scorer.objPrio[match[2]];
+ else score += Scorer.objPrioDefault;
+
+ results.push([
+ docNames[match[0]],
+ fullname,
+ "#" + anchor,
+ descr,
+ score,
+ filenames[match[0]],
+ ]);
+ };
+ Object.keys(objects).forEach((prefix) =>
+ objects[prefix].forEach((array) =>
+ objectSearchCallback(prefix, array)
+ )
+ );
+ return results;
+ },
+
+ /**
+ * search for full-text terms in the index
+ */
+ performTermsSearch: (searchTerms, excludedTerms) => {
+ // prepare search
+ const terms = Search._index.terms;
+ const titleTerms = Search._index.titleterms;
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+
+ const scoreMap = new Map();
+ const fileMap = new Map();
+
+ // perform the search on the required terms
+ searchTerms.forEach((word) => {
+ const files = [];
+ const arr = [
+ { files: terms[word], score: Scorer.term },
+ { files: titleTerms[word], score: Scorer.title },
+ ];
+ // add support for partial matches
+ if (word.length > 2) {
+ const escapedWord = _escapeRegExp(word);
+ Object.keys(terms).forEach((term) => {
+ if (term.match(escapedWord) && !terms[word])
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
+ });
+ Object.keys(titleTerms).forEach((term) => {
+ if (term.match(escapedWord) && !titleTerms[word])
+ arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
+ });
+ }
+
+ // no match but word was a required one
+ if (arr.every((record) => record.files === undefined)) return;
+
+ // found search word in contents
+ arr.forEach((record) => {
+ if (record.files === undefined) return;
+
+ let recordFiles = record.files;
+ if (recordFiles.length === undefined) recordFiles = [recordFiles];
+ files.push(...recordFiles);
+
+ // set score for the word in each file
+ recordFiles.forEach((file) => {
+ if (!scoreMap.has(file)) scoreMap.set(file, {});
+ scoreMap.get(file)[word] = record.score;
+ });
+ });
+
+ // create the mapping
+ files.forEach((file) => {
+ if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
+ fileMap.get(file).push(word);
+ else fileMap.set(file, [word]);
+ });
+ });
+
+ // now check if the files don't contain excluded terms
+ const results = [];
+ for (const [file, wordList] of fileMap) {
+ // check if all requirements are matched
+
+ // as search terms with length < 3 are discarded
+ const filteredTermCount = [...searchTerms].filter(
+ (term) => term.length > 2
+ ).length;
+ if (
+ wordList.length !== searchTerms.size &&
+ wordList.length !== filteredTermCount
+ )
+ continue;
+
+ // ensure that none of the excluded terms is in the search result
+ if (
+ [...excludedTerms].some(
+ (term) =>
+ terms[term] === file ||
+ titleTerms[term] === file ||
+ (terms[term] || []).includes(file) ||
+ (titleTerms[term] || []).includes(file)
+ )
+ )
+ break;
+
+ // select one (max) score for the file.
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
+ // add result to the result list
+ results.push([
+ docNames[file],
+ titles[file],
+ "",
+ null,
+ score,
+ filenames[file],
+ ]);
+ }
+ return results;
+ },
+
+ /**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words.
+ */
+ makeSearchSummary: (htmlText, keywords) => {
+ const text = Search.htmlToText(htmlText);
+ if (text === "") return null;
+
+ const textLower = text.toLowerCase();
+ const actualStartPosition = [...keywords]
+ .map((k) => textLower.indexOf(k.toLowerCase()))
+ .filter((i) => i > -1)
+ .slice(-1)[0];
+ const startWithContext = Math.max(actualStartPosition - 120, 0);
+
+ const top = startWithContext === 0 ? "" : "...";
+ const tail = startWithContext + 240 < text.length ? "..." : "";
+
+ let summary = document.createElement("p");
+ summary.classList.add("context");
+ summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
+
+ return summary;
+ },
+};
+
+_ready(Search.init);
diff --git a/docs/build/html/_static/sphinx_highlight.js b/docs/build/html/_static/sphinx_highlight.js
new file mode 100644
index 00000000..aae669d7
--- /dev/null
+++ b/docs/build/html/_static/sphinx_highlight.js
@@ -0,0 +1,144 @@
+/* Highlighting utilities for Sphinx HTML documentation. */
+"use strict";
+
+const SPHINX_HIGHLIGHT_ENABLED = true
+
+/**
+ * highlight a given string on a node by wrapping it in
+ * span elements with the given class name.
+ */
+const _highlight = (node, addItems, text, className) => {
+ if (node.nodeType === Node.TEXT_NODE) {
+ const val = node.nodeValue;
+ const parent = node.parentNode;
+ const pos = val.toLowerCase().indexOf(text);
+ if (
+ pos >= 0 &&
+ !parent.classList.contains(className) &&
+ !parent.classList.contains("nohighlight")
+ ) {
+ let span;
+
+ const closestNode = parent.closest("body, svg, foreignObject");
+ const isInSVG = closestNode && closestNode.matches("svg");
+ if (isInSVG) {
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+ } else {
+ span = document.createElement("span");
+ span.classList.add(className);
+ }
+
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ parent.insertBefore(
+ span,
+ parent.insertBefore(
+ document.createTextNode(val.substr(pos + text.length)),
+ node.nextSibling
+ )
+ );
+ node.nodeValue = val.substr(0, pos);
+
+ if (isInSVG) {
+ const rect = document.createElementNS(
+ "http://www.w3.org/2000/svg",
+ "rect"
+ );
+ const bbox = parent.getBBox();
+ rect.x.baseVal.value = bbox.x;
+ rect.y.baseVal.value = bbox.y;
+ rect.width.baseVal.value = bbox.width;
+ rect.height.baseVal.value = bbox.height;
+ rect.setAttribute("class", className);
+ addItems.push({ parent: parent, target: rect });
+ }
+ }
+ } else if (node.matches && !node.matches("button, select, textarea")) {
+ node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
+ }
+};
+const _highlightText = (thisNode, text, className) => {
+ let addItems = [];
+ _highlight(thisNode, addItems, text, className);
+ addItems.forEach((obj) =>
+ obj.parent.insertAdjacentElement("beforebegin", obj.target)
+ );
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const SphinxHighlight = {
+
+ /**
+ * highlight the search words provided in localstorage in the text
+ */
+ highlightSearchWords: () => {
+ if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
+
+ // get and clear terms from localstorage
+ const url = new URL(window.location);
+ const highlight =
+ localStorage.getItem("sphinx_highlight_terms")
+ || url.searchParams.get("highlight")
+ || "";
+ localStorage.removeItem("sphinx_highlight_terms")
+ url.searchParams.delete("highlight");
+ window.history.replaceState({}, "", url);
+
+ // get individual terms from highlight string
+ const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
+ if (terms.length === 0) return; // nothing to do
+
+ // There should never be more than one element matching "div.body"
+ const divBody = document.querySelectorAll("div.body");
+ const body = divBody.length ? divBody[0] : document.querySelector("body");
+ window.setTimeout(() => {
+ terms.forEach((term) => _highlightText(body, term, "highlighted"));
+ }, 10);
+
+ const searchBox = document.getElementById("searchbox");
+ if (searchBox === null) return;
+ searchBox.appendChild(
+ document
+ .createRange()
+ .createContextualFragment(
+ '
' +
+ '' +
+ _("Hide Search Matches") +
+ "
"
+ )
+ );
+ },
+
+ /**
+ * helper function to hide the search marks again
+ */
+ hideSearchWords: () => {
+ document
+ .querySelectorAll("#searchbox .highlight-link")
+ .forEach((el) => el.remove());
+ document
+ .querySelectorAll("span.highlighted")
+ .forEach((el) => el.classList.remove("highlighted"));
+ localStorage.removeItem("sphinx_highlight_terms")
+ },
+
+ initEscapeListener: () => {
+ // only install a listener if it is really needed
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+ // bail with special keys
+ if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
+ if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
+ SphinxHighlight.hideSearchWords();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+_ready(SphinxHighlight.highlightSearchWords);
+_ready(SphinxHighlight.initEscapeListener);
diff --git a/docs/build/html/bark.html b/docs/build/html/bark.html
new file mode 100644
index 00000000..0e7f3c69
--- /dev/null
+++ b/docs/build/html/bark.html
@@ -0,0 +1,483 @@
+
+
+
+
+
+
+
+ bark package — Bark 1 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+bark package
+
+
+bark.api module
+
+
+bark.api. generate_audio ( text : str , history_prompt : str | None = None , text_temp : float = 0.7 , waveform_temp : float = 0.7 , silent : bool = False , output_full : bool = False )
+Generate audio array from input text.
+
+Parameters:
+
+text – text to be turned into audio
+history_prompt – history choice for audio cloning
+text_temp – generation temperature (1.0 more diverse, 0.0 more conservative)
+waveform_temp – generation temperature (1.0 more diverse, 0.0 more conservative)
+silent – disable progress bar
+output_full – return full generation to be used as a history prompt
+
+
+Returns:
+numpy audio array at sample frequency 24khz
+
+
+
+
+
+
+bark.api. save_as_prompt ( filepath , full_generation )
+
+
+
+
+bark.api. semantic_to_waveform ( semantic_tokens : ndarray , history_prompt : str | None = None , temp : float = 0.7 , silent : bool = False , output_full : bool = False )
+Generate audio array from semantic input.
+
+Parameters:
+
+semantic_tokens – semantic token output from text_to_semantic
+history_prompt – history choice for audio cloning
+temp – generation temperature (1.0 more diverse, 0.0 more conservative)
+silent – disable progress bar
+output_full – return full generation to be used as a history prompt
+
+
+Returns:
+numpy audio array at sample frequency 24khz
+
+
+
+
+
+
+bark.api. text_to_semantic ( text : str , history_prompt : str | None = None , temp : float = 0.7 , silent : bool = False )
+Generate semantic array from text.
+
+Parameters:
+
+text – text to be turned into audio
+history_prompt – history choice for audio cloning
+temp – generation temperature (1.0 more diverse, 0.0 more conservative)
+silent – disable progress bar
+
+
+Returns:
+numpy semantic array to be fed into semantic_to_waveform
+
+
+
+
+
+
+bark.generation module
+
+
+class bark.generation. InferenceContext ( benchmark = False )
+Bases: object
+
+
+
+
+bark.generation. autocast ( )
+
+
+
+
+bark.generation. clean_models ( model_key = None )
+
+
+
+
+bark.generation. codec_decode ( fine_tokens )
+Turn quantized audio codes into audio array using encodec.
+
+
+
+
+bark.generation. generate_coarse ( x_semantic , history_prompt = None , temp = 0.7 , top_k = None , top_p = None , silent = False , max_coarse_history = 630 , sliding_window_len = 60 , use_kv_caching = False )
+Generate coarse audio codes from semantic tokens.
+
+
+
+
+bark.generation. generate_fine ( x_coarse_gen , history_prompt = None , temp = 0.5 , silent = True )
+Generate full audio codes from coarse audio codes.
+
+
+
+
+bark.generation. generate_text_semantic ( text , history_prompt = None , temp = 0.7 , top_k = None , top_p = None , silent = False , min_eos_p = 0.2 , max_gen_duration_s = None , allow_early_stop = True , use_kv_caching = False )
+Generate semantic tokens from text.
+
+
+
+
+bark.generation. load_codec_model ( use_gpu = True , force_reload = False )
+
+
+
+
+bark.generation. load_model ( use_gpu = True , use_small = False , force_reload = False , model_type = 'text' , path = None )
+
+
+
+
+bark.generation. preload_models ( text_use_gpu = True , text_use_small = False , coarse_use_gpu = True , coarse_use_small = False , fine_use_gpu = True , fine_use_small = False , codec_use_gpu = True , force_reload = False , path = None )
+Load all the necessary models for the pipeline.
+
+
+
+
+bark.model module
+Much of this code is adapted from Andrej Karpathy’s NanoGPT
+(https://github.com/karpathy/nanoGPT )
+
+
+class bark.model. Block ( config , layer_idx )
+Bases: Module
+
+
+forward ( x , past_kv = None , use_cache = False )
+Defines the computation performed at every call.
+Should be overridden by all subclasses.
+
+
Note
+
Although the recipe for forward pass needs to be defined within
+this function, one should call the Module
instance afterwards
+instead of this since the former takes care of running the
+registered hooks while the latter silently ignores them.
+
+
+
+
+
+
+
+class bark.model. CausalSelfAttention ( config )
+Bases: Module
+
+
+forward ( x , past_kv = None , use_cache = False )
+Defines the computation performed at every call.
+Should be overridden by all subclasses.
+
+
Note
+
Although the recipe for forward pass needs to be defined within
+this function, one should call the Module
instance afterwards
+instead of this since the former takes care of running the
+registered hooks while the latter silently ignores them.
+
+
+
+
+
+
+
+class bark.model. GPT ( config )
+Bases: Module
+
+
+forward ( idx , merge_context = False , past_kv = None , position_ids = None , use_cache = False , labels = None )
+Defines the computation performed at every call.
+Should be overridden by all subclasses.
+
+
Note
+
Although the recipe for forward pass needs to be defined within
+this function, one should call the Module
instance afterwards
+instead of this since the former takes care of running the
+registered hooks while the latter silently ignores them.
+
+
+
+
+
+get_num_params ( non_embedding = True )
+Return the number of parameters in the model.
+For non-embedding count (default), the position embeddings get subtracted.
+The token embeddings would too, except due to the parameter sharing these
+params are actually used as weights in the final layer, so we include them.
+
+
+
+
+
+
+class bark.model. GPTConfig ( block_size : int = 1024 , input_vocab_size : int = 10048 , output_vocab_size : int = 10048 , n_layer : int = 12 , n_head : int = 12 , n_embd : int = 768 , dropout : float = 0.0 , bias : bool = True )
+Bases: object
+
+
+bias : bool = True
+
+
+
+
+block_size : int = 1024
+
+
+
+
+dropout : float = 0.0
+
+
+
+
+input_vocab_size : int = 10048
+
+
+
+
+n_embd : int = 768
+
+
+
+
+n_head : int = 12
+
+
+
+
+n_layer : int = 12
+
+
+
+
+output_vocab_size : int = 10048
+
+
+
+
+
+
+class bark.model. LayerNorm ( ndim , bias )
+Bases: Module
+LayerNorm but with an optional bias. PyTorch doesn’t support simply bias=False
+
+
+forward ( input )
+Defines the computation performed at every call.
+Should be overridden by all subclasses.
+
+
Note
+
Although the recipe for forward pass needs to be defined within
+this function, one should call the Module
instance afterwards
+instead of this since the former takes care of running the
+registered hooks while the latter silently ignores them.
+
+
+
+
+
+
+
+class bark.model. MLP ( config )
+Bases: Module
+
+
+forward ( x )
+Defines the computation performed at every call.
+Should be overridden by all subclasses.
+
+
Note
+
Although the recipe for forward pass needs to be defined within
+this function, one should call the Module
instance afterwards
+instead of this since the former takes care of running the
+registered hooks while the latter silently ignores them.
+
+
+
+
+
+
+
+bark.model_fine module
+Much of this code is adapted from Andrej Karpathy’s NanoGPT
+(https://github.com/karpathy/nanoGPT )
+
+
+class bark.model_fine. FineBlock ( config )
+Bases: Module
+
+
+forward ( x )
+Defines the computation performed at every call.
+Should be overridden by all subclasses.
+
+
Note
+
Although the recipe for forward pass needs to be defined within
+this function, one should call the Module
instance afterwards
+instead of this since the former takes care of running the
+registered hooks while the latter silently ignores them.
+
+
+
+
+
+
+
+class bark.model_fine. FineGPT ( config )
+Bases: GPT
+
+
+forward ( pred_idx , idx )
+Defines the computation performed at every call.
+Should be overridden by all subclasses.
+
+
Note
+
Although the recipe for forward pass needs to be defined within
+this function, one should call the Module
instance afterwards
+instead of this since the former takes care of running the
+registered hooks while the latter silently ignores them.
+
+
+
+
+
+get_num_params ( non_embedding = True )
+Return the number of parameters in the model.
+For non-embedding count (default), the position embeddings get subtracted.
+The token embeddings would too, except due to the parameter sharing these
+params are actually used as weights in the final layer, so we include them.
+
+
+
+
+
+
+class bark.model_fine. FineGPTConfig ( block_size : int = 1024 , input_vocab_size : int = 10048 , output_vocab_size : int = 10048 , n_layer : int = 12 , n_head : int = 12 , n_embd : int = 768 , dropout : float = 0.0 , bias : bool = True , n_codes_total : int = 8 , n_codes_given : int = 1 )
+Bases: GPTConfig
+
+
+n_codes_given : int = 1
+
+
+
+
+n_codes_total : int = 8
+
+
+
+
+
+
+class bark.model_fine. NonCausalSelfAttention ( config )
+Bases: Module
+
+
+forward ( x )
+Defines the computation performed at every call.
+Should be overridden by all subclasses.
+
+
Note
+
Although the recipe for forward pass needs to be defined within
+this function, one should call the Module
instance afterwards
+instead of this since the former takes care of running the
+registered hooks while the latter silently ignores them.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html
new file mode 100644
index 00000000..da7002d7
--- /dev/null
+++ b/docs/build/html/genindex.html
@@ -0,0 +1,352 @@
+
+
+
+
+
+
+ Index — Bark 1 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index
+
+
+
A
+ |
B
+ |
C
+ |
D
+ |
F
+ |
G
+ |
I
+ |
L
+ |
M
+ |
N
+ |
O
+ |
P
+ |
S
+ |
T
+
+
+
A
+
+
+
B
+
+
+
+ bark
+
+
+
+ bark.api
+
+
+
+ bark.generation
+
+
+
+
+
+
+
C
+
+
+
D
+
+
+
F
+
+
+
G
+
+
+
I
+
+
+
L
+
+
+
M
+
+
+
N
+
+
+
O
+
+
+
P
+
+
+
S
+
+
+
T
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/build/html/index.html b/docs/build/html/index.html
new file mode 100644
index 00000000..c9a2bc34
--- /dev/null
+++ b/docs/build/html/index.html
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+ Welcome to Bark’s documentation! — Bark 1 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Welcome to Bark’s documentation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/build/html/modules.html b/docs/build/html/modules.html
new file mode 100644
index 00000000..32d7c1ee
--- /dev/null
+++ b/docs/build/html/modules.html
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+ bark — Bark 1 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv
new file mode 100644
index 00000000..f3e1eef5
--- /dev/null
+++ b/docs/build/html/objects.inv
@@ -0,0 +1,6 @@
+# Sphinx inventory version 2
+# Project: Bark
+# Version:
+# The remainder of this file is compressed using zlib.
+xڝKn0>vkfh @Ĉل)R GNU$~ȅaQ\|Oran[tֽsQqP?S\ t*=\AZlz#IYS|{9v`dumINuTk6AF5 5x?eUBOV9+F0?;<\Zp>m$C5sJYj5udBN .!e|oic[++㍘3dy>$Lߊ>ݨubvY)@T&bCW0lO2]Obm57۪7y=7)sO <ygi$yO7_?d.|p!!`|ɋڡI=yB/d[|bI
+O]meErk\ӪL!UCŏ%'x.iQOҶX-Y?ାwÂtŨ/Q9ޠhB,Fګ=Nn.k_
{",
\ No newline at end of file
diff --git a/docs/build/html/py-modindex.html b/docs/build/html/py-modindex.html
new file mode 100644
index 00000000..1d5f95c7
--- /dev/null
+++ b/docs/build/html/py-modindex.html
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+ Python Module Index — Bark 1 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Python Module Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/build/html/search.html b/docs/build/html/search.html
new file mode 100644
index 00000000..e0617ee2
--- /dev/null
+++ b/docs/build/html/search.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+ Search — Bark 1 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Search
+
+
+
+
+ Please activate JavaScript to enable the search
+ functionality.
+
+
+
+
+
+
+ Searching for multiple words only shows matches that contain
+ all words.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js
new file mode 100644
index 00000000..7c286f86
--- /dev/null
+++ b/docs/build/html/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"docnames": ["bark", "index", "modules"], "filenames": ["bark.rst", "index.rst", "modules.rst"], "titles": ["bark package", "Welcome to Bark\u2019s documentation!", "bark"], "terms": {"generate_audio": [0, 2], "text": 0, "str": 0, "history_prompt": 0, "none": 0, "text_temp": 0, "float": 0, "0": 0, "7": 0, "waveform_temp": 0, "silent": 0, "bool": 0, "fals": 0, "output_ful": 0, "audio": 0, "arrai": 0, "from": 0, "input": 0, "paramet": 0, "turn": 0, "histori": 0, "choic": 0, "clone": 0, "temperatur": 0, "1": 0, "more": 0, "divers": 0, "conserv": 0, "disabl": 0, "progress": 0, "bar": 0, "return": 0, "full": 0, "us": 0, "prompt": 0, "numpi": 0, "sampl": 0, "frequenc": 0, "24khz": 0, "save_as_prompt": [0, 2], "filepath": 0, "full_gener": 0, "semantic_to_waveform": [0, 2], "semantic_token": 0, "ndarrai": 0, "temp": 0, "semant": 0, "token": 0, "output": 0, "text_to_semant": [0, 2], "fed": 0, "class": 0, "inferencecontext": [0, 2], "benchmark": 0, "base": 0, "object": 0, "autocast": [0, 2], "clean_model": [0, 2], "model_kei": 0, "codec_decod": [0, 2], "fine_token": 0, "quantiz": 0, "code": 0, "encodec": 0, "generate_coars": [0, 2], "x_semant": 0, "top_k": 0, "top_p": 0, "max_coarse_histori": 0, "630": 0, "sliding_window_len": 0, "60": 0, "use_kv_cach": 0, "coars": 0, "generate_fin": [0, 2], "x_coarse_gen": 0, "5": 0, "true": 0, "generate_text_semant": [0, 2], "min_eos_p": 0, "2": 0, "max_gen_duration_": 0, "allow_early_stop": 0, "load_codec_model": [0, 2], "use_gpu": 0, "force_reload": 0, "load_model": [0, 2], "use_smal": 0, "model_typ": 0, "path": 0, "preload_model": [0, 2], "text_use_gpu": 0, "text_use_smal": 0, "coarse_use_gpu": 0, "coarse_use_smal": 0, "fine_use_gpu": 0, "fine_use_smal": 0, "codec_use_gpu": 0, "load": 0, "all": 0, "necessari": 0, "pipelin": 0, "much": 0, "thi": 0, "i": 0, "adapt": 0, "andrej": 0, "karpathi": 0, "": 0, "nanogpt": 0, "http": 0, "github": 0, "com": 0, "block": [0, 2], "config": 0, "layer_idx": 0, "forward": [0, 2], "x": 0, "past_kv": 0, "use_cach": 0, "defin": 0, "comput": 0, "perform": 0, "everi": 0, "call": 0, "should": 0, "overridden": 0, "subclass": 0, "although": 0, "recip": 0, "pass": 0, "need": 0, "within": 0, "function": 0, "one": 0, "instanc": 0, "afterward": 0, "instead": 0, "sinc": 0, "former": 0, "take": 0, "care": 0, "run": 0, "regist": 0, "hook": 0, "while": 0, "latter": 0, "ignor": 0, "them": 0, "causalselfattent": [0, 2], "gpt": [0, 2], "idx": 0, "merge_context": 0, "position_id": 0, "label": 0, "get_num_param": [0, 2], "non_embed": 0, "number": 0, "For": 0, "non": 0, "embed": 0, "count": 0, "default": 0, "posit": 0, "get": 0, "subtract": 0, "The": 0, "would": 0, "too": 0, "except": 0, "due": 0, "share": 0, "param": 0, "ar": 0, "actual": 0, "weight": 0, "final": 0, "layer": 0, "so": 0, "we": 0, "includ": 0, "gptconfig": [0, 2], "block_siz": [0, 2], "int": 0, "1024": 0, "input_vocab_s": [0, 2], "10048": 0, "output_vocab_s": [0, 2], "n_layer": [0, 2], "12": 0, "n_head": [0, 2], "n_embd": [0, 2], "768": 0, "dropout": [0, 2], "bia": [0, 2], "layernorm": [0, 2], "ndim": 0, "an": 0, "option": 0, "pytorch": 0, "doesn": 0, "t": 0, "support": 0, "simpli": 0, "mlp": [0, 2], "fineblock": [0, 2], "finegpt": [0, 2], "pred_idx": 0, "finegptconfig": [0, 2], "n_codes_tot": [0, 2], "8": 0, "n_codes_given": [0, 2], "noncausalselfattent": [0, 2], "index": 1, "modul": [1, 2], "search": 1, "page": 1, "packag": 2, "submodul": 2, "api": 2, "gener": 2, "model": 2, "model_fin": 2, "content": 2}, "objects": {"": [[0, 0, 0, "-", "bark"]], "bark": [[0, 0, 0, "-", "api"], [0, 0, 0, "-", "generation"], [0, 0, 0, "-", "model"], [0, 0, 0, "-", "model_fine"]], "bark.api": [[0, 1, 1, "", "generate_audio"], [0, 1, 1, "", "save_as_prompt"], [0, 1, 1, "", "semantic_to_waveform"], [0, 1, 1, "", "text_to_semantic"]], "bark.generation": [[0, 2, 1, "", "InferenceContext"], [0, 1, 1, "", "autocast"], [0, 1, 1, "", "clean_models"], [0, 1, 1, "", "codec_decode"], [0, 1, 1, "", "generate_coarse"], [0, 1, 1, "", "generate_fine"], [0, 1, 1, "", "generate_text_semantic"], [0, 1, 1, "", "load_codec_model"], [0, 1, 1, "", "load_model"], [0, 1, 1, "", "preload_models"]], "bark.model": [[0, 2, 1, "", "Block"], [0, 2, 1, "", "CausalSelfAttention"], [0, 2, 1, "", "GPT"], [0, 2, 1, "", "GPTConfig"], [0, 2, 1, "", "LayerNorm"], [0, 2, 1, "", "MLP"]], "bark.model.Block": [[0, 3, 1, "", "forward"]], "bark.model.CausalSelfAttention": [[0, 3, 1, "", "forward"]], "bark.model.GPT": [[0, 3, 1, "", "forward"], [0, 3, 1, "", "get_num_params"]], "bark.model.GPTConfig": [[0, 4, 1, "", "bias"], [0, 4, 1, "", "block_size"], [0, 4, 1, "", "dropout"], [0, 4, 1, "", "input_vocab_size"], [0, 4, 1, "", "n_embd"], [0, 4, 1, "", "n_head"], [0, 4, 1, "", "n_layer"], [0, 4, 1, "", "output_vocab_size"]], "bark.model.LayerNorm": [[0, 3, 1, "", "forward"]], "bark.model.MLP": [[0, 3, 1, "", "forward"]], "bark.model_fine": [[0, 2, 1, "", "FineBlock"], [0, 2, 1, "", "FineGPT"], [0, 2, 1, "", "FineGPTConfig"], [0, 2, 1, "", "NonCausalSelfAttention"]], "bark.model_fine.FineBlock": [[0, 3, 1, "", "forward"]], "bark.model_fine.FineGPT": [[0, 3, 1, "", "forward"], [0, 3, 1, "", "get_num_params"]], "bark.model_fine.FineGPTConfig": [[0, 4, 1, "", "n_codes_given"], [0, 4, 1, "", "n_codes_total"]], "bark.model_fine.NonCausalSelfAttention": [[0, 3, 1, "", "forward"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"bark": [0, 1, 2], "packag": 0, "submodul": 0, "api": 0, "modul": 0, "gener": 0, "model": 0, "model_fin": 0, "content": 0, "welcom": 1, "": 1, "document": 1, "indic": 1, "tabl": 1}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"bark package": [[0, "bark-package"]], "Submodules": [[0, "submodules"]], "bark.api module": [[0, "module-bark.api"]], "bark.generation module": [[0, "module-bark.generation"]], "bark.model module": [[0, "module-bark.model"]], "bark.model_fine module": [[0, "module-bark.model_fine"]], "Module contents": [[0, "module-bark"]], "Welcome to Bark\u2019s documentation!": [[1, "welcome-to-bark-s-documentation"]], "Indices and tables": [[1, "indices-and-tables"]], "bark": [[2, "bark"]]}, "indexentries": {"block (class in bark.model)": [[0, "bark.model.Block"]], "causalselfattention (class in bark.model)": [[0, "bark.model.CausalSelfAttention"]], "fineblock (class in bark.model_fine)": [[0, "bark.model_fine.FineBlock"]], "finegpt (class in bark.model_fine)": [[0, "bark.model_fine.FineGPT"]], "finegptconfig (class in bark.model_fine)": [[0, "bark.model_fine.FineGPTConfig"]], "gpt (class in bark.model)": [[0, "bark.model.GPT"]], "gptconfig (class in bark.model)": [[0, "bark.model.GPTConfig"]], "inferencecontext (class in bark.generation)": [[0, "bark.generation.InferenceContext"]], "layernorm (class in bark.model)": [[0, "bark.model.LayerNorm"]], "mlp (class in bark.model)": [[0, "bark.model.MLP"]], "noncausalselfattention (class in bark.model_fine)": [[0, "bark.model_fine.NonCausalSelfAttention"]], "autocast() (in module bark.generation)": [[0, "bark.generation.autocast"]], "bark": [[0, "module-bark"]], "bark.api": [[0, "module-bark.api"]], "bark.generation": [[0, "module-bark.generation"]], "bark.model": [[0, "module-bark.model"]], "bark.model_fine": [[0, "module-bark.model_fine"]], "bias (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.bias"]], "block_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.block_size"]], "clean_models() (in module bark.generation)": [[0, "bark.generation.clean_models"]], "codec_decode() (in module bark.generation)": [[0, "bark.generation.codec_decode"]], "dropout (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.dropout"]], "forward() (bark.model.block method)": [[0, "bark.model.Block.forward"]], "forward() (bark.model.causalselfattention method)": [[0, "bark.model.CausalSelfAttention.forward"]], "forward() (bark.model.gpt method)": [[0, "bark.model.GPT.forward"]], "forward() (bark.model.layernorm method)": [[0, "bark.model.LayerNorm.forward"]], "forward() (bark.model.mlp method)": [[0, "bark.model.MLP.forward"]], "forward() (bark.model_fine.fineblock method)": [[0, "bark.model_fine.FineBlock.forward"]], "forward() (bark.model_fine.finegpt method)": [[0, "bark.model_fine.FineGPT.forward"]], "forward() (bark.model_fine.noncausalselfattention method)": [[0, "bark.model_fine.NonCausalSelfAttention.forward"]], "generate_audio() (in module bark.api)": [[0, "bark.api.generate_audio"]], "generate_coarse() (in module bark.generation)": [[0, "bark.generation.generate_coarse"]], "generate_fine() (in module bark.generation)": [[0, "bark.generation.generate_fine"]], "generate_text_semantic() (in module bark.generation)": [[0, "bark.generation.generate_text_semantic"]], "get_num_params() (bark.model.gpt method)": [[0, "bark.model.GPT.get_num_params"]], "get_num_params() (bark.model_fine.finegpt method)": [[0, "bark.model_fine.FineGPT.get_num_params"]], "input_vocab_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.input_vocab_size"]], "load_codec_model() (in module bark.generation)": [[0, "bark.generation.load_codec_model"]], "load_model() (in module bark.generation)": [[0, "bark.generation.load_model"]], "module": [[0, "module-bark"], [0, "module-bark.api"], [0, "module-bark.generation"], [0, "module-bark.model"], [0, "module-bark.model_fine"]], "n_codes_given (bark.model_fine.finegptconfig attribute)": [[0, "bark.model_fine.FineGPTConfig.n_codes_given"]], "n_codes_total (bark.model_fine.finegptconfig attribute)": [[0, "bark.model_fine.FineGPTConfig.n_codes_total"]], "n_embd (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_embd"]], "n_head (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_head"]], "n_layer (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_layer"]], "output_vocab_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.output_vocab_size"]], "preload_models() (in module bark.generation)": [[0, "bark.generation.preload_models"]], "save_as_prompt() (in module bark.api)": [[0, "bark.api.save_as_prompt"]], "semantic_to_waveform() (in module bark.api)": [[0, "bark.api.semantic_to_waveform"]], "text_to_semantic() (in module bark.api)": [[0, "bark.api.text_to_semantic"]]}})
\ No newline at end of file
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 00000000..dc14b5f0
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,34 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup -----------------------------------------------------
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('../bark'))
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = 'Bark'
+copyright = '2023, Luis'
+author = 'Luis'
+release = '1'
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon']
+
+templates_path = ['_templates']
+exclude_patterns = []
+
+
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = 'alabaster'
+html_static_path = ['_static']
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 00000000..26c953bf
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,20 @@
+.. Bark documentation master file, created by
+ sphinx-quickstart on Tue Jun 27 10:35:37 2023.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to Bark's documentation!
+================================
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents:
+
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 00000000..8f56bebd
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/modules.rst b/docs/modules.rst
new file mode 100644
index 00000000..77bc686f
--- /dev/null
+++ b/docs/modules.rst
@@ -0,0 +1,7 @@
+bark
+====
+
+.. toctree::
+ :maxdepth: 4
+
+ bark
diff --git a/pyproject.toml b/pyproject.toml
index 07cfd444..73bac952 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -24,6 +24,7 @@ dependencies = [
"torch",
"tqdm",
"transformers",
+ "sphinx",
]
[project.urls]
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 00000000..ddff1e6e
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,6 @@
+[isort]
+include_trailing_comma=True
+lines_between_sections=0
+lines_between_types=0
+line_length=100
+multi_line_output=3
\ No newline at end of file
diff --git a/suno_bark.egg-info/PKG-INFO b/suno_bark.egg-info/PKG-INFO
new file mode 100644
index 00000000..aed8351a
--- /dev/null
+++ b/suno_bark.egg-info/PKG-INFO
@@ -0,0 +1,174 @@
+Metadata-Version: 2.1
+Name: suno-bark
+Version: 0.0.1a0
+Summary: Bark text to audio model
+Author-email: Suno Inc
+Project-URL: source, https://github.com/suno-ai/bark
+Requires-Python: >=3.8
+Description-Content-Type: text/markdown
+Provides-Extra: dev
+License-File: LICENSE.md
+
+# 🐶 BARK AI: but with the ability to use voice cloning on custom audio samples
+
+If you want to clone a voice just follow the `clone_voice.ipynb` notebook. If you want to generate audio from text, follow the `generate.ipynb` notebook.
+
+To create a voice clone sample, you need an audio sample of around 5-6 seconds
+
+You will get the best results by making generations with your cloned voice until you find one that is really close to the source. Then use that as the new history prompt (comes from the model so should theoretically be more consistent)
+
+- [BARK text to speech @ SERP AI](https://serp.ai/tools/bark-text-to-speech-ai-voice-clone-app/)
+
+# Shoutouts
+- Huge shoutout to [gitmylo](https://github.com/gitmylo/bark-voice-cloning-HuBERT-quantizer/) for the solution to the semantic token generation for better voice clones and finetunes
+
+-------------------------------------------------------------------
+# Original README.md
+## 🤖 Usage
+
+```python
+from bark import SAMPLE_RATE, generate_audio, preload_models
+from IPython.display import Audio
+
+# download and load all models
+preload_models()
+
+# generate audio from text
+text_prompt = """
+ Hello, my name is Serpy. And, uh — and I like pizza. [laughs]
+ But I also have other interests such as playing tic tac toe.
+"""
+audio_array = generate_audio(text_prompt)
+
+# play text in notebook
+Audio(audio_array, rate=SAMPLE_RATE)
+```
+
+[pizza.webm](https://user-images.githubusercontent.com/5068315/230490503-417e688d-5115-4eee-9550-b46a2b465ee3.webm)
+
+
+To save `audio_array` as a WAV file:
+
+```python
+from scipy.io.wavfile import write as write_wav
+
+write_wav("/path/to/audio.wav", SAMPLE_RATE, audio_array)
+```
+
+### 🌎 Foreign Language
+
+Bark supports various languages out-of-the-box and automatically determines language from input text. When prompted with code-switched text, Bark will attempt to employ the native accent for the respective languages. English quality is best for the time being, and we expect other languages to further improve with scaling.
+
+```python
+text_prompt = """
+ Buenos días Miguel. Tu colega piensa que tu alemán es extremadamente malo.
+ But I suppose your english isn't terrible.
+"""
+audio_array = generate_audio(text_prompt)
+```
+
+[miguel.webm](https://user-images.githubusercontent.com/5068315/230684752-10baadfe-1e7c-46a2-8323-43282aef2c8c.webm)
+
+### 🎶 Music
+
+Bark can generate all types of audio, and, in principle, doesn't see a difference between speech and music. Sometimes Bark chooses to generate text as music, but you can help it out by adding music notes around your lyrics.
+
+```python
+text_prompt = """
+ ♪ In the jungle, the mighty jungle, the lion barks tonight ♪
+"""
+audio_array = generate_audio(text_prompt)
+```
+
+[lion.webm](https://user-images.githubusercontent.com/5068315/230684766-97f5ea23-ad99-473c-924b-66b6fab24289.webm)
+
+### 🎤 Voice Presets and Voice/Audio Cloning
+
+Bark has the capability to fully clone voices - including tone, pitch, emotion and prosody. The model also attempts to preserve music, ambient noise, etc. from input audio. However, to mitigate misuse of this technology, we limit the audio history prompts to a limited set of Suno-provided, fully synthetic options to choose from for each language. Specify following the pattern: `{lang_code}_speaker_{0-9}`.
+
+```python
+text_prompt = """
+ I have a silky smooth voice, and today I will tell you about
+ the exercise regimen of the common sloth.
+"""
+audio_array = generate_audio(text_prompt, history_prompt="en_speaker_1")
+```
+
+
+[sloth.webm](https://user-images.githubusercontent.com/5068315/230684883-a344c619-a560-4ff5-8b99-b4463a34487b.webm)
+
+*Note: since Bark recognizes languages automatically from input text, it is possible to use for example a german history prompt with english text. This usually leads to english audio with a german accent.*
+
+### 👥 Speaker Prompts
+
+You can provide certain speaker prompts such as NARRATOR, MAN, WOMAN, etc. Please note that these are not always respected, especially if a conflicting audio history prompt is given.
+
+```python
+text_prompt = """
+ WOMAN: I would like an oatmilk latte please.
+ MAN: Wow, that's expensive!
+"""
+audio_array = generate_audio(text_prompt)
+```
+
+[latte.webm](https://user-images.githubusercontent.com/5068315/230684864-12d101a1-a726-471d-9d56-d18b108efcb8.webm)
+
+
+## 💻 Installation
+
+```
+pip install git+https://github.com/suno-ai/bark.git
+```
+
+or
+
+```
+git clone https://github.com/suno-ai/bark
+cd bark && pip install .
+```
+
+## 🛠️ Hardware and Inference Speed
+
+Bark has been tested and works on both CPU and GPU (`pytorch 2.0+`, CUDA 11.7 and CUDA 12.0).
+Running Bark requires running >100M parameter transformer models.
+On modern GPUs and PyTorch nightly, Bark can generate audio in roughly realtime. On older GPUs, default colab, or CPU, inference time might be 10-100x slower.
+
+## ⚙️ Details
+
+Similar to [Vall-E](https://arxiv.org/abs/2301.02111) and some other amazing work in the field, Bark uses GPT-style
+models to generate audio from scratch. Different from Vall-E, the initial text prompt is embedded into high-level semantic tokens without the use of phonemes. It can therefore generalize to arbitrary instructions beyond speech that occur in the training data, such as music lyrics, sound effects or other non-speech sounds. A subsequent second model is used to convert the generated semantic tokens into audio codec tokens to generate the full waveform. To enable the community to use Bark via public code we used the fantastic
+[EnCodec codec](https://github.com/facebookresearch/encodec) from Facebook to act as an audio representation.
+
+Below is a list of some known non-speech sounds
+
+- `[laughter]`
+- `[laughs]`
+- `[sighs]`
+- `[music]`
+- `[gasps]`
+- `[clears throat]`
+- `—` or `...` for hesitations
+- `♪` for song lyrics
+- capitalization for emphasis of a word
+- `MAN/WOMAN:` for bias towards speaker
+
+**Supported Languages**
+
+| Language | Status |
+| --- | --- |
+| English (en) | ✅ |
+| German (de) | ✅ |
+| Spanish (es) | ✅ |
+| French (fr) | ✅ |
+| Hindi (hi) | ✅ |
+| Italian (it) | ✅ |
+| Japanese (ja) | ✅ |
+| Korean (ko) | ✅ |
+| Polish (pl) | ✅ |
+| Portuguese (pt) | ✅ |
+| Russian (ru) | ✅ |
+| Turkish (tr) | ✅ |
+| Chinese, simplified (zh) | ✅ |
+| Arabic | Coming soon! |
+| Bengali | Coming soon! |
+| Telugu | Coming soon! |
diff --git a/suno_bark.egg-info/SOURCES.txt b/suno_bark.egg-info/SOURCES.txt
new file mode 100644
index 00000000..fc06b883
--- /dev/null
+++ b/suno_bark.egg-info/SOURCES.txt
@@ -0,0 +1,155 @@
+LICENSE.md
+README.md
+pyproject.toml
+setup.py
+bark/__init__.py
+bark/api.py
+bark/generation.py
+bark/model.py
+bark/model_fine.py
+bark/assets/prompts/announcer.npz
+bark/assets/prompts/de_speaker_0.npz
+bark/assets/prompts/de_speaker_1.npz
+bark/assets/prompts/de_speaker_2.npz
+bark/assets/prompts/de_speaker_3.npz
+bark/assets/prompts/de_speaker_4.npz
+bark/assets/prompts/de_speaker_5.npz
+bark/assets/prompts/de_speaker_6.npz
+bark/assets/prompts/de_speaker_7.npz
+bark/assets/prompts/de_speaker_8.npz
+bark/assets/prompts/de_speaker_9.npz
+bark/assets/prompts/en_speaker_0.npz
+bark/assets/prompts/en_speaker_1.npz
+bark/assets/prompts/en_speaker_2.npz
+bark/assets/prompts/en_speaker_3.npz
+bark/assets/prompts/en_speaker_4.npz
+bark/assets/prompts/en_speaker_5.npz
+bark/assets/prompts/en_speaker_6.npz
+bark/assets/prompts/en_speaker_7.npz
+bark/assets/prompts/en_speaker_8.npz
+bark/assets/prompts/en_speaker_9.npz
+bark/assets/prompts/es_speaker_0.npz
+bark/assets/prompts/es_speaker_1.npz
+bark/assets/prompts/es_speaker_2.npz
+bark/assets/prompts/es_speaker_3.npz
+bark/assets/prompts/es_speaker_4.npz
+bark/assets/prompts/es_speaker_5.npz
+bark/assets/prompts/es_speaker_6.npz
+bark/assets/prompts/es_speaker_7.npz
+bark/assets/prompts/es_speaker_8.npz
+bark/assets/prompts/es_speaker_9.npz
+bark/assets/prompts/fr_speaker_0.npz
+bark/assets/prompts/fr_speaker_1.npz
+bark/assets/prompts/fr_speaker_2.npz
+bark/assets/prompts/fr_speaker_3.npz
+bark/assets/prompts/fr_speaker_4.npz
+bark/assets/prompts/fr_speaker_5.npz
+bark/assets/prompts/fr_speaker_6.npz
+bark/assets/prompts/fr_speaker_7.npz
+bark/assets/prompts/fr_speaker_8.npz
+bark/assets/prompts/fr_speaker_9.npz
+bark/assets/prompts/hi_speaker_0.npz
+bark/assets/prompts/hi_speaker_1.npz
+bark/assets/prompts/hi_speaker_2.npz
+bark/assets/prompts/hi_speaker_3.npz
+bark/assets/prompts/hi_speaker_4.npz
+bark/assets/prompts/hi_speaker_5.npz
+bark/assets/prompts/hi_speaker_6.npz
+bark/assets/prompts/hi_speaker_7.npz
+bark/assets/prompts/hi_speaker_8.npz
+bark/assets/prompts/hi_speaker_9.npz
+bark/assets/prompts/it_speaker_0.npz
+bark/assets/prompts/it_speaker_1.npz
+bark/assets/prompts/it_speaker_2.npz
+bark/assets/prompts/it_speaker_3.npz
+bark/assets/prompts/it_speaker_4.npz
+bark/assets/prompts/it_speaker_5.npz
+bark/assets/prompts/it_speaker_6.npz
+bark/assets/prompts/it_speaker_7.npz
+bark/assets/prompts/it_speaker_8.npz
+bark/assets/prompts/it_speaker_9.npz
+bark/assets/prompts/ja_speaker_0.npz
+bark/assets/prompts/ja_speaker_1.npz
+bark/assets/prompts/ja_speaker_2.npz
+bark/assets/prompts/ja_speaker_3.npz
+bark/assets/prompts/ja_speaker_4.npz
+bark/assets/prompts/ja_speaker_5.npz
+bark/assets/prompts/ja_speaker_6.npz
+bark/assets/prompts/ja_speaker_7.npz
+bark/assets/prompts/ja_speaker_8.npz
+bark/assets/prompts/ja_speaker_9.npz
+bark/assets/prompts/ko_speaker_0.npz
+bark/assets/prompts/ko_speaker_1.npz
+bark/assets/prompts/ko_speaker_2.npz
+bark/assets/prompts/ko_speaker_3.npz
+bark/assets/prompts/ko_speaker_4.npz
+bark/assets/prompts/ko_speaker_5.npz
+bark/assets/prompts/ko_speaker_6.npz
+bark/assets/prompts/ko_speaker_7.npz
+bark/assets/prompts/ko_speaker_8.npz
+bark/assets/prompts/ko_speaker_9.npz
+bark/assets/prompts/pl_speaker_0.npz
+bark/assets/prompts/pl_speaker_1.npz
+bark/assets/prompts/pl_speaker_2.npz
+bark/assets/prompts/pl_speaker_3.npz
+bark/assets/prompts/pl_speaker_4.npz
+bark/assets/prompts/pl_speaker_5.npz
+bark/assets/prompts/pl_speaker_6.npz
+bark/assets/prompts/pl_speaker_7.npz
+bark/assets/prompts/pl_speaker_8.npz
+bark/assets/prompts/pl_speaker_9.npz
+bark/assets/prompts/pt_speaker_0.npz
+bark/assets/prompts/pt_speaker_1.npz
+bark/assets/prompts/pt_speaker_2.npz
+bark/assets/prompts/pt_speaker_3.npz
+bark/assets/prompts/pt_speaker_4.npz
+bark/assets/prompts/pt_speaker_5.npz
+bark/assets/prompts/pt_speaker_6.npz
+bark/assets/prompts/pt_speaker_7.npz
+bark/assets/prompts/pt_speaker_8.npz
+bark/assets/prompts/pt_speaker_9.npz
+bark/assets/prompts/ru_speaker_0.npz
+bark/assets/prompts/ru_speaker_1.npz
+bark/assets/prompts/ru_speaker_2.npz
+bark/assets/prompts/ru_speaker_3.npz
+bark/assets/prompts/ru_speaker_4.npz
+bark/assets/prompts/ru_speaker_5.npz
+bark/assets/prompts/ru_speaker_6.npz
+bark/assets/prompts/ru_speaker_7.npz
+bark/assets/prompts/ru_speaker_8.npz
+bark/assets/prompts/ru_speaker_9.npz
+bark/assets/prompts/speaker_0.npz
+bark/assets/prompts/speaker_1.npz
+bark/assets/prompts/speaker_2.npz
+bark/assets/prompts/speaker_3.npz
+bark/assets/prompts/speaker_4.npz
+bark/assets/prompts/speaker_5.npz
+bark/assets/prompts/speaker_6.npz
+bark/assets/prompts/speaker_7.npz
+bark/assets/prompts/speaker_8.npz
+bark/assets/prompts/speaker_9.npz
+bark/assets/prompts/tr_speaker_0.npz
+bark/assets/prompts/tr_speaker_1.npz
+bark/assets/prompts/tr_speaker_2.npz
+bark/assets/prompts/tr_speaker_3.npz
+bark/assets/prompts/tr_speaker_4.npz
+bark/assets/prompts/tr_speaker_5.npz
+bark/assets/prompts/tr_speaker_6.npz
+bark/assets/prompts/tr_speaker_7.npz
+bark/assets/prompts/tr_speaker_8.npz
+bark/assets/prompts/tr_speaker_9.npz
+bark/assets/prompts/zh_speaker_0.npz
+bark/assets/prompts/zh_speaker_1.npz
+bark/assets/prompts/zh_speaker_2.npz
+bark/assets/prompts/zh_speaker_3.npz
+bark/assets/prompts/zh_speaker_4.npz
+bark/assets/prompts/zh_speaker_5.npz
+bark/assets/prompts/zh_speaker_6.npz
+bark/assets/prompts/zh_speaker_7.npz
+bark/assets/prompts/zh_speaker_8.npz
+bark/assets/prompts/zh_speaker_9.npz
+suno_bark.egg-info/PKG-INFO
+suno_bark.egg-info/SOURCES.txt
+suno_bark.egg-info/dependency_links.txt
+suno_bark.egg-info/requires.txt
+suno_bark.egg-info/top_level.txt
\ No newline at end of file
diff --git a/suno_bark.egg-info/dependency_links.txt b/suno_bark.egg-info/dependency_links.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/suno_bark.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/suno_bark.egg-info/requires.txt b/suno_bark.egg-info/requires.txt
new file mode 100644
index 00000000..c952cb33
--- /dev/null
+++ b/suno_bark.egg-info/requires.txt
@@ -0,0 +1,27 @@
+boto3
+encodec
+funcy
+numpy
+scipy
+tokenizers
+torch
+tqdm
+transformers
+sphinx
+
+[dev]
+bandit
+black
+codecov
+flake8
+huggingface-hub
+hypothesis<7,>=6.14
+isort<6,>=5.0.0
+jupyter
+mypy
+nbconvert
+nbformat
+pydocstyle
+pylint
+pytest
+pytest-cov
diff --git a/suno_bark.egg-info/top_level.txt b/suno_bark.egg-info/top_level.txt
new file mode 100644
index 00000000..16da1460
--- /dev/null
+++ b/suno_bark.egg-info/top_level.txt
@@ -0,0 +1 @@
+bark