Giter Site home page Giter Site logo

openvoiceos / ovos-personal-backend Goto Github PK

View Code? Open in Web Editor NEW
78.0 17.0 26.0 39.32 MB

personal backend - self-hosted backend to manage multiple OVOS devices

License: Apache License 2.0

Python 99.31% Dockerfile 0.44% Shell 0.25%
openvoiceos ovos mycroft backend flask python self-hosted hacktoberfest

ovos-personal-backend's Introduction

OVOS Personal Backend

Personal backend for OpenVoiceOS, written in flask

This allows you to manage multiple devices from a single location

⚠️ there are no user accounts ⚠️

Documentation can be found at https://openvoiceos.github.io/community-docs/personal_backend

NOTES:

  • this backend moved to SQL databases on release 0.2.0, json databases from older version are not compatible
  • at the time of writing, backend manager does not yet work with this backend version
  • backend-client now includes a CRUD api to interact with databases OpenVoiceOS/ovos-backend-client#30

Install

from pip

pip install ovos-local-backend

Companion projects

You can use this backend as a STT server proxy via ovos-stt-plugin-server, eg https://your_backend.org/stt

Configuration

configure backend by editing/creating ~/.config/ovos_backend/ovos_backend.conf

{
  "lang": "en-us",
  "date_format": "DMY",
  "system_unit": "metric",
  "time_format": "full",
  "location": {
    "city": {"...": "..."},
    "coordinate": {"...": "..."},
    "timezone": {"...": "..."}
  },

  "stt_servers": ["https://stt.openvoiceos.org/stt"],

  "server": {
    "admin_key": "leave empty to DISABLE admin api",
    "port": 6712,
    "database": "sqlite:////home/user/.local/share/ovos_backend.db",
    "skip_auth": false,
    "geolocate": true,
    "override_location": false,
    "version": "v1"
  },

  "listener": {
     "record_utterances": false,
     "record_wakewords": false
  },

  "microservices": {
    "wolfram_key": "$KEY",
    "owm_key": "$KEY",
    "email": {
       "recipient": "",
       "smtp": {
            "username": "",
            "password": "",
            "host": "smtp.mailprovider.com",
            "port": 465
       }
    }
  }

}

database can be sqlite or mysql eg. mysql+mysqldb://scott:[email protected]/test?ssl_ca=/path/to/ca.pem&ssl_cert=/path/to/client-cert.pem&ssl_key=/path/to/client-key.pem

Docker

There is also a docker container you can use

docker run -p 8086:6712 -d --restart always --name local_backend ghcr.io/openvoiceos/local-backend:dev

ovos-personal-backend's People

Contributors

builderjer avatar dependabot[bot] avatar el-tocino avatar emphasize avatar forslund avatar hckr avatar jarbasal avatar matthewscholefield avatar neonjarbas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ovos-personal-backend's Issues

Running docker image doesn't work

I want to use this to run a classic mycroft install off of.

Running:
docker run -p 6712:6712 -p 8086:6712 --name local_backend ghcr.io/openvoiceos/local-backend:dev
Shows:

2024-03-01 22:50:13.272 - OVOS - ovos_config.utils:init_module_config:36 - INFO - Configuring ovos_local_backend config
2024-03-01 22:50:13.280 - OVOS - ovos_config.utils:init_module_config:61 - INFO - Updating configuration at: /root/.config/OpenVoiceOS/ovos.conf
sqlite:////root/.local/share/ovos_backend.db
Traceback (most recent call last):
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 145, in __init__
self._dbapi_connection = engine.raw_connection()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 3293, in raw_connection
return self.pool.connect()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 452, in connect
return _ConnectionFairy._checkout(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 1268, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 716, in checkout
rec = pool._do_get()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/impl.py", line 168, in _do_get
with util.safe_reraise():
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/util/langhelpers.py", line 147, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/impl.py", line 166, in _do_get
return self._create_connection()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 393, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 678, in __init__
self.__connect()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 902, in __connect
with util.safe_reraise():
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/util/langhelpers.py", line 147, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 898, in __connect
self.dbapi_connection = connection = pool._invoke_creator(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/create.py", line 637, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/default.py", line 616, in connect
return self.loaded_dbapi.connect(*cargs, **cparams)
sqlite3.OperationalError: unable to open database file

The above exception was the direct cause of the following exception:                                                                                                                                                                  [7/56]

Traceback (most recent call last):
File "/usr/local/bin/ovos-local-backend", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/__main__.py", line 14, in main
start_backend(args.flask_port, args.flask_host)
File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/__init__.py", line 56, in start_backend
app = create_app()
File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/__init__.py", line 24, in create_app
app, db = connect_db(app)
File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/database.py", line 35, in connect_db
db.create_all()
File "/usr/local/lib/python3.10/dist-packages/flask_sqlalchemy/extension.py", line 884, in create_all
self._call_for_binds(bind_key, "create_all")
File "/usr/local/lib/python3.10/dist-packages/flask_sqlalchemy/extension.py", line 865, in _call_for_binds
getattr(metadata, op_name)(bind=engine)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/sql/schema.py", line 5796, in create_all
bind._run_ddl_visitor(
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 3243, in _run_ddl_visitor
with self.begin() as conn:
File "/usr/lib/python3.10/contextlib.py", line 135, in __enter__
return next(self.gen)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 3233, in begin
with self.connect() as conn:
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 3269, in connect
return self._connection_cls(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 147, in __init__
Connection._handle_dbapi_exception_noconnection(
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 2431, in _handle_dbapi_exception_noconnection
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 145, in __init__
self._dbapi_connection = engine.raw_connection()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 3293, in raw_connection
return self.pool.connect()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 452, in connect
return _ConnectionFairy._checkout(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 1268, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 716, in checkout
rec = pool._do_get()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/impl.py", line 168, in _do_get
with util.safe_reraise():
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/util/langhelpers.py", line 147, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/impl.py", line 166, in _do_get
return self._create_connection()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 393, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 678, in __init__
self.__connect()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 902, in __connect
with util.safe_reraise():
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/util/langhelpers.py", line 147, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 898, in __connect
self.dbapi_connection = connection = pool._invoke_creator(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/create.py", line 637, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/default.py", line 616, in connect
return self.loaded_dbapi.connect(*cargs, **cparams)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
(Background on this error at: https://sqlalche.me/e/20/e3q8)

owm api errors

I'm seeing this in my personal backend logs:

[2023-06-01 04:31:05,875] ERROR in app: Exception on /v1/owm/onecall [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib/python3.10/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.10/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.10/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 5 (char 4)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 2528, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1825, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1823, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1799, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/decorators.py", line 99, in decorated_function
    resp = make_response(f(*args, **kwargs))
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/decorators.py", line 54, in decorated
    return f(*args, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/decorators.py", line 72, in decorated
    return f(*args, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/external_apis.py", line 135, in owm_onecall
    data = apis.owm_onecall(lat, lon, units, lang)
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/utils/__init__.py", line 210, in owm_onecall
    return self._owm.get_weather_onecall(params)
  File "/usr/local/lib/python3.10/dist-packages/ovos_utils/ovos_service_api.py", line 89, in get_weather_onecall
    r = requests.post(url, data=reqdata, headers=self.headers)
  File "/usr/local/lib/python3.10/dist-packages/ovos_utils/ovos_service_api.py", line 52, in headers
    self.api.get_session_challenge()
  File "/usr/local/lib/python3.10/dist-packages/ovos_utils/ovos_service_api.py", line 31, in get_session_challenge
    session_challenge_response = session_challenge_request.json()
  File "/usr/local/lib/python3.10/dist-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 5 (char 4)

Geolocation bug

GeocoderProviders.AUTO

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 2190, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1486, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1484, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1469, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/decorators.py", line 83, in decorated_function
    resp = flask.make_response(f(*args, **kwargs))
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/decorators.py", line 56, in decorated
    return f(*args, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/external_apis.py", line 49, in geolocation
    return apis.geolocate(address)
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/utils/__init__.py", line 116, in geolocate
    "country": data["country"],
KeyError: 'country'
10.89.0.3 - - [17/May/2023 20:27:16] "GET /v1/geolocation?location=paris HTTP/1.1" 500 -

this nested location dict is haunting us 😛

ModuleNotFoundError: No module named 'selene_api'

Because of the selena_api rename, this plugin needs updating

mycroft@OpenVoiceOS-e3830c:~/.local/state/mycroft $ cat /var/log/mycroft/local-backend.error.log
Traceback (most recent call last):
  File "/usr/bin/ovos-local-backend", line 33, in <module>
    sys.exit(load_entry_point('ovos-local-backend==0.1.5a4', 'console_scripts', 'ovos-local-backend')())
  File "/usr/lib/python3.10/site-packages/ovos_local_backend/__main__.py", line 14, in main
    start_backend(args.flask_port, args.flask_host)
  File "/usr/lib/python3.10/site-packages/ovos_local_backend/backend/__init__.py", line 51, in start_backend
    app = create_app()
  File "/usr/lib/python3.10/site-packages/ovos_local_backend/backend/__init__.py", line 23, in create_app
    from ovos_local_backend.utils import nice_json
  File "/usr/lib/python3.10/site-packages/ovos_local_backend/utils/__init__.py", line 22, in <module>
    from ovos_local_backend.utils.geolocate import get_timezone, Geocoder
  File "/usr/lib/python3.10/site-packages/ovos_local_backend/utils/geolocate.py", line 9, in <module>
    from selene_api.api import GeolocationApi

identity2.json location?

Per the documentation this file should exist on the mycroft device, but I can't find it on my Mark1.

Installation fails at setup.py timezonefinder

Hello guys,

I'm having an issue installing via pip and couldn't figure out how to solve it. So I hope you guys can help me out here. :-)
Some related info: I already installed mycroft & deepspeech on this Raspberry Pi 4B on Buster 5.10.14-v7l+
My timezone is CET, as that might be related to the issue maybe.
I don't really know what additional info you need, so please hit me up if more is needed.

RPi_ovos-local-backend.log

Also since I'm not really accustomed to git-procedures I don't know if I submit this correctly or if I should have tried to find help elsewhere. Let me know to improve my git-knowledge ;-)

BR happycamper

PS: My goal is to run mycroft "homeless" without need of remote connections.

Nothing to see at backend

Hi,
I've installed OVOS-local-backend as described in the README.md and make a new mycroft.conf for using local backend. OVOS-local-backend runs at a Ubuntu Desktop in a virtual Python environment. Picroft is logged in at the backend. There are a lot of lines showing the IP of Picroft. But when I call the address and port by a browser I get this:
grafik

I expected to see something similar to home.mycroft.ai.Am I missunderstandig the local backend project?

wakeword not getting set from backend

I set the default wakeword value in my backend database to something new, but it didn't change anything on my OVOS device.

  "default_ww": "marvin",

I also tried dragging in my hotword configuration, but that didn't pass through either:

  "hotwords": {
    "marvin": {
      "active": true,
      "listen": true,
      "module": "ovos-ww-plugin-precise",
      "model": "https://github.com/OpenVoiceOS/precise-lite-models/blob/master/wakewords/en/marvin.tflite"
    }
  },

`ovos-backend-client` requirement missing

fresh build from dev

Traceback (most recent call last):
  File "/usr/local/bin/ovos-local-backend", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/__main__.py", line 13, in main
    start_backend(args.flask_port, args.flask_host)
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/__init__.py", line 57, in start_backend
    app = create_app()
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/backend/__init__.py", line 26, in create_app
    from ovos_local_backend.utils import nice_json
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/utils/__init__.py", line 22, in <module>
    from ovos_local_backend.utils.geolocate import get_timezone, Geocoder
  File "/usr/local/lib/python3.10/dist-packages/ovos_local_backend/utils/geolocate.py", line 9, in <module>
    from ovos_backend_client.api import GeolocationApi
ModuleNotFoundError: No module named 'ovos_backend_client'

Run without STT or Wake Word Detection?

I have Mycroft (Picroft) configured to use Mozilla DeepSpeech (for STT) and Mozilla TTS (each running as a separate service on another network-connected computer). I'm using Precise (locally on the Pi) to perform wake word detection.

Is there a way to disable STT and wake word detection on the local backend? I don't need either of those, as I'm using DeepSpeech and TTS.

Additionally, I'm getting the following error when I try to run the backend. I'm assuming I need to pip install speech_recognition, but I'd rather find a way to disable STT on the local backend if I intend to provide my own STT server.

$ ovos-local-backend      Traceback (most recent call last):
  File "/home/sgmustadio/Projects/ovos-local-backend/ovos-venv/bin/ovos-local-backend", line 8, in <module>
    sys.exit(main())
  File "/home/sgmustadio/Projects/ovos-local-backend/ovos-venv/lib/python3.6/site-packages/ovos_local_backend/__main__.py", line 14, in main
    start_backend(args.flask_port, args.flask_host)
  File "/home/sgmustadio/Projects/ovos-local-backend/ovos-venv/lib/python3.6/site-packages/ovos_local_backend/backend/__init__.py", line 51, in start_backend
    app = create_app()
  File "/home/sgmustadio/Projects/ovos-local-backend/ovos-venv/lib/python3.6/site-packages/ovos_local_backend/backend/__init__.py", line 27, in create_app
    from ovos_local_backend.backend.stt import get_stt_routes
  File "/home/sgmustadio/Projects/ovos-local-backend/ovos-venv/lib/python3.6/site-packages/ovos_local_backend/backend/stt.py", line 25, in <module>
    from speech_recognition import Recognizer, AudioFile
ModuleNotFoundError: No module named 'speech_recognition'

ovos_config

when running on same device as mycroft-core we could use ovos_config package to pick default values from mycroft.conf, this would ensure things like lang and system_unit always match unless explicitly set in the backend config

is this pointless or helpful?

selene proxy

local backend could itself pair and communicate with selene, this would provide access to all the services without pairing

Advantages:

  • Only pair once, manage all your devices as one
  • Spoof personal info in selene (location, email...)
    • Local backend knows real info
  • Hide number of devices you own from selene
  • Can implement opt-in behavior and share data with mycroft

For this to be useful the selene ui changes should be handled by local backend, effectively we would be using mycroft home to manage our local backend instance like if it was a mycroft device

https://github.com/OpenVoiceOS/selene_api

[OAUTH] crud endpoints `token_id`

This is a bit confusing:

token_id is historically a combination of the strings below

f"{device-uuid}|{oauth_client_id}:{oauth_app_id}"

to identify an oauth app in the database

the backend client expects token_id (# and below) preformatted.
Don't require the caller to preformat and therefor poll the device uuid

support ovos backend services

for weather and wolfram alpha support should be added for ovos api - https://github.com/OpenVoiceOS/ovos_api_service

example weather integration

import requests
from ovos_utils import ovos_service_api


class OvosWeather:
    def __init__(self):
        self.api = ovos_service_api.OVOSApiService()
        self.api.register_device()

    def get_weather_onecall(self, query):
        self.api.get_session_challenge()
        headers = {'session_challenge': self.api.get_session_token(),  'backend': 'OWM'}
        reqdata = {"lat": query.get("lat"), 
                   "lon": query.get("lon"), 
                   "units": query.get("units"),
                   "lang": query.get("lang")}
        url = 'https://api.openvoiceos.com/weather/onecall_weather_report/' + self.api.get_uuid()
        r = requests.post(url, data=reqdata, headers=headers)
        return r.json()

this should also be made the default to ensure functionality is always available, users will still be able and encouraged to use their own keys

Personal-backend manager

Is the personal-backend-mannager included in the docker image ?
If so which port does it use ?
If not - would it be an idea to include it ?

Right now I am just testing to add a personal-backend on a homeassistant as an add-on - and instead of making a new docker i started with the alreddy made docker :)

missing dependency

Fresh venv on Arch linux

pip install git+https://github.com/OpenVoiceOS/ovos-personal-backend

And then try and run.

ovos-local-backend 
2023-10-02 17:38:51.371 - OVOS - ovos_config.utils:init_module_config:36 - INFO - Configuring ovos_local_backend config
2023-10-02 17:38:51.374 - OVOS - ovos_config.utils:init_module_config:61 - INFO - Updating configuration at: /home/jbrodie/.config/OpenVoiceOS/ovos.conf
sqlite:////home/jbrodie/.local/share/ovos_backend.db
Traceback (most recent call last):
  File "/home/jbrodie/software/REMOTE/bkendvenv/bin/ovos-local-backend", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/jbrodie/software/REMOTE/bkendvenv/lib/python3.11/site-packages/ovos_local_backend/__main__.py", line 14, in main
    start_backend(args.flask_port, args.flask_host)
  File "/home/jbrodie/software/REMOTE/bkendvenv/lib/python3.11/site-packages/ovos_local_backend/backend/__init__.py", line 56, in start_backend
    app = create_app()
          ^^^^^^^^^^^^
  File "/home/jbrodie/software/REMOTE/bkendvenv/lib/python3.11/site-packages/ovos_local_backend/backend/__init__.py", line 30, in create_app
    from ovos_local_backend.backend.stt import get_stt_routes
  File "/home/jbrodie/software/REMOTE/bkendvenv/lib/python3.11/site-packages/ovos_local_backend/backend/stt.py", line 19, in <module>
    from speech_recognition import Recognizer, AudioFile, AudioData
ModuleNotFoundError: No module named 'speech_recognition'

I will PR in a bit. Putting it here so I don't forget

stt configuration inconsistently shared

My backend STT configuration is:

{
  "stt": {
    "module": "ovos-stt-plugin-server",
    "ovos-stt-plugin-server": {
      "url": "http://192.168.86.58:9090/stt"
    },
    "fallback_module": "ovos-stt-plugin-selene",
    "ovos-stt-plugin-selene": {
      "url": "https://api.mycroft.ai",
      "version": "v1",
      "identity_file": "/root/.local/share/ovos_backend/identity2.json"
    }
  }
}

However, what got passed to my OVOS device was:

  "stt": {
    "module": "ovos-stt-plugin-selene",
    "ovos-stt-plugin-server": {
      "url": "http://192.168.86.58:9090/stt"
    }
  },

Cannot get local backend to work without Internet connection

First, the default config in the README gives me an error:

Traceback (most recent call last):
  File "/home/pi/mycroft-core/.venv/bin/ovos-local-backend", line 8, in <module>
    sys.exit(main())
  File "/home/pi/mycroft-core/.venv/lib/python3.7/site-packages/ovos_local_backend/__main__.py", line 14, in main
    start_backend(args.flask_port, args.flask_host)
  File "/home/pi/mycroft-core/.venv/lib/python3.7/site-packages/ovos_local_backend/backend/__init__.py", line 51, in start_backend
    app = create_app()
  File "/home/pi/mycroft-core/.venv/lib/python3.7/site-packages/ovos_local_backend/backend/__init__.py", line 27, in create_app
    from ovos_local_backend.backend.stt import get_stt_routes
  File "/home/pi/mycroft-core/.venv/lib/python3.7/site-packages/ovos_local_backend/backend/stt.py", line 28, in <module>
    engine = OVOSSTTFactory.create(CONFIGURATION["stt"])
  File "/home/pi/mycroft-core/.venv/lib/python3.7/site-packages/ovos_plugin_manager/stt.py", line 75, in create
    plugin_config = config[plugin]
KeyError: 'google'

When I update the key/value to "stt": {"module": "google", "google": {}},, that seems to work. The server boots up on my Pi.

Here is my /tmp/mycroft.json config file (should be the same as in the README):

{
    "server": {
        "url": "http://0.0.0.0:6712",
        "version": "v1",
        "update": true,
        "metrics": true
      },
    "tts": {
      "module":"mimic2",
          "mimic2": {
              "url": "http://0.0.0.0:6712/synthesize/mimic2/kusal/en?text="
      }
   },
   "listener": {
        "wake_word_upload": {
            "url": "http://0.0.0.0:6712/precise/upload"
        }
    }
}

When I load Mycroft, I can see the connection to the local backend:

(.venv) pi@picroft:~/mycroft-core/.venv/bin $ ovos-local-backend
 * Serving Flask app 'ovos_local_backend.backend' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:6712 (Press CTRL+C to quit)
127.0.0.1 - - [12/Apr/2022 21:55:40] "GET /v1/device/c49f6588-90eb-4acc-a55d-135e3541e06f HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2022 21:55:40] "GET /v1/device/c49f6588-90eb-4acc-a55d-135e3541e06f/setting HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2022 21:55:40] "GET /v1/device/c49f6588-90eb-4acc-a55d-135e3541e06f/location HTTP/1.1" 200 -

However, Mycroft cannot find Precise for wake word detection, so it defaults to PocketSphinx:

2022-04-12 21:58:18.096 | INFO     | 15916 | mycroft.client.speech.hotword_factory:load_module:500 | Loading "hey mycroft" wake word via pocketsphinx
2022-04-12 21:58:18.127 | ERROR    | 15916 | mycroft.client.speech.hotword_factory:update_precise:270 | Precise could not be downloaded(ConnectionError(MaxRetryError("HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /MycroftAI/precise-data/raw/dist/armv7l/latest (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x733ec290>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))")))
2022-04-12 21:58:18.284 | INFO     | 15916 | mycroft.client.speech.listener:create_wakeup_recognizer:365 | creating stand up word engine
2022-04-12 21:58:18.287 | INFO     | 15916 | mycroft.client.speech.hotword_factory:load_module:500 | Loading "wake up" wake word via pocketsphinx
2022-04-12 21:58:18.404 | INFO     | 15916 | __main__:on_ready:179 | Speech client is ready.

It also fails to find mimic2 for TTS:

2022-04-12 21:58:07.077 | INFO     | 15888 | mycroft.audio.audioservice:get_services:63 | Loading services from /home/pi/mycroft-core/mycroft/audio/services/
2022-04-12 21:58:07.082 | INFO     | 15888 | mycroft.audio.audioservice:load_internal_services:135 | Loading chromecast
2022-04-12 21:58:15.294 | INFO     | 15888 | mycroft.audio.audioservice:load_internal_services:135 | Loading mopidy
2022-04-12 21:58:15.304 | INFO     | 15888 | mycroft.audio.audioservice:load_internal_services:135 | Loading mplayer
2022-04-12 21:58:15.388 | ERROR    | 15888 | audioservice_mplayer:<module>:20 | install py_mplayer with pip install git+https://github.com/JarbasAl/py_mplayer
2022-04-12 21:58:15.390 | ERROR    | 15888 | mycroft.audio.audioservice:load_internal_services:144 | Failed to import module mplayer
ModuleNotFoundError("No module named 'py_mplayer'")
2022-04-12 21:58:15.393 | INFO     | 15888 | mycroft.audio.audioservice:load_internal_services:135 | Loading simple
2022-04-12 21:58:15.407 | INFO     | 15888 | mycroft.audio.audioservice:load_internal_services:135 | Loading vlc
2022-04-12 21:58:15.526 | ERROR    | 15888 | mycroft.audio.audioservice:setup_service:112 | Failed to load service. NameError("no function 'libvlc_new'")
2022-04-12 21:58:15.575 | INFO     | 15888 | mycroft.audio.audioservice:load_services:235 | Finding default backend...
2022-04-12 21:58:15.577 | INFO     | 15888 | mycroft.audio.audioservice:load_services:239 | Found local
2022-04-12 21:58:15.683 | INFO     | 15888 | __main__:on_ready:33 | Audio service is ready.
2022-04-12 21:58:44.872 | INFO     | 15888 | mycroft.audio.speech:mute_and_speak:127 | Speak: This unit is not connected to the Internet. Either plug in a network cable or setup your wifi connection.
2022-04-12 21:58:49.900 | ERROR    | 15888 | mycroft.audio.speech:mute_and_speak:131 | Mimic 2 server request timed out. Falling back to mimic
2022-04-12 21:58:49.913 | WARNING  | 15888 | mycroft.tts.tts:clear_cache:428 | This method is deprecated, use TextToSpeechCache.clear

Finally, Mycroft just spins looking for DNS server:

 21:56:36.484 | ERROR    | 15024 | mycroft.util.network_utils:_connected_dns:78 | Unable to connect to secondary DNS server.
 21:56:46.503 | ERROR    | 15024 | mycroft.util.network_utils:_connected_ncsi:46 | Unable to verify connection via NCSI endpoint.
 21:56:50.512 | ERROR    | 15024 | mycroft.util.network_utils:_connected_dns:69 | Unable to connect to primary DNS server, trying secondary...
 21:56:53.519 | ERROR    | 15024 | mycroft.util.network_utils:_connected_dns:78 | Unable to connect to secondary DNS server.

I cannot issue any commands--it won't recognize the wake word. Any idea on how to get this working with a Pi completely disconnected from the Internet?

Backend will not start

i run the command python start_backend.py
2018-12-15 13:00:01,229 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2018-12-15 13:00:01,229 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,230 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2018-12-15 13:00:01,230 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,231 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_stt")
2018-12-15 13:00:01,232 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,267 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("hotwords")
2018-12-15 13:00:01,268 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,268 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("ip_users")
2018-12-15 13:00:01,268 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,268 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("hotword_devices")
2018-12-15 13:00:01,268 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,269 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("locations")
2018-12-15 13:00:01,269 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,269 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("ips")
2018-12-15 13:00:01,269 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,270 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("location_users")
2018-12-15 13:00:01,270 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,270 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("stt_engines")
2018-12-15 13:00:01,270 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,271 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("sounds")
2018-12-15 13:00:01,271 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,271 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("skill_configs")
2018-12-15 13:00:01,271 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,272 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("ip_devices")
2018-12-15 13:00:01,272 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,274 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("admins")
2018-12-15 13:00:01,274 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,275 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_tts")
2018-12-15 13:00:01,275 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,276 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("tts_engines")
2018-12-15 13:00:01,276 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,277 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_users")
2018-12-15 13:00:01,277 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,278 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("location_devices")
2018-12-15 13:00:01,278 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,279 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2018-12-15 13:00:01,279 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,280 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("metrics")
2018-12-15 13:00:01,280 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,280 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_devices")
2018-12-15 13:00:01,280 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,281 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("location_configs")
2018-12-15 13:00:01,281 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,281 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("skill_devices")
2018-12-15 13:00:01,281 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,282 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("configs")
2018-12-15 13:00:01,282 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,282 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("user_devices")
2018-12-15 13:00:01,282 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,283 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("skills")
2018-12-15 13:00:01,283 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,284 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("metrics_devices")
2018-12-15 13:00:01,284 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,284 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("hotword_users")
2018-12-15 13:00:01,284 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,285 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("devices")
2018-12-15 13:00:01,285 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,285 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("metrics_users")
2018-12-15 13:00:01,286 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,286 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("hotword_configs")
2018-12-15 13:00:01,286 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,286 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_sounds")
2018-12-15 13:00:01,287 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,287 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("unpaired")
2018-12-15 13:00:01,287 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,291 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2018-12-15 13:00:01,291 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,292 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2018-12-15 13:00:01,292 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,293 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_stt")
2018-12-15 13:00:01,293 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,294 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("hotwords")
2018-12-15 13:00:01,295 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,295 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("ip_users")
2018-12-15 13:00:01,295 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,295 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("hotword_devices")
2018-12-15 13:00:01,296 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,296 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("locations")
2018-12-15 13:00:01,296 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,296 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("ips")
2018-12-15 13:00:01,296 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,297 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("location_users")
2018-12-15 13:00:01,297 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,297 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("stt_engines")
2018-12-15 13:00:01,297 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,298 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("sounds")
2018-12-15 13:00:01,298 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,298 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("skill_configs")
2018-12-15 13:00:01,298 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,299 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("ip_devices")
2018-12-15 13:00:01,299 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,299 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("admins")
2018-12-15 13:00:01,299 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,300 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_tts")
2018-12-15 13:00:01,300 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,300 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("tts_engines")
2018-12-15 13:00:01,300 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,301 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_users")
2018-12-15 13:00:01,301 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,301 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("location_devices")
2018-12-15 13:00:01,301 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,302 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2018-12-15 13:00:01,302 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,302 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("metrics")
2018-12-15 13:00:01,302 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,303 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_devices")
2018-12-15 13:00:01,303 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,303 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("location_configs")
2018-12-15 13:00:01,303 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,304 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("skill_devices")
2018-12-15 13:00:01,304 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,304 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("configs")
2018-12-15 13:00:01,304 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,305 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("user_devices")
2018-12-15 13:00:01,305 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,306 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("skills")
2018-12-15 13:00:01,306 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,306 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("metrics_devices")
2018-12-15 13:00:01,306 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,307 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("hotword_users")
2018-12-15 13:00:01,307 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,307 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("devices")
2018-12-15 13:00:01,308 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,308 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("metrics_users")
2018-12-15 13:00:01,308 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,309 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("hotword_configs")
2018-12-15 13:00:01,309 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,309 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("config_sounds")
2018-12-15 13:00:01,309 INFO sqlalchemy.engine.base.Engine ()
2018-12-15 13:00:01,310 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("unpaired")
2018-12-15 13:00:01,310 INFO sqlalchemy.engine.base.Engine ()
Illegal instruction (core dumped)
and then get all this

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.