LLM+Kokoro does not work

This website:
https://docs.arduino.cc/tutorials/ventuno-q/local-ai-assistant/

said to load an LLM + Kokoro zip file into AppLab:

https://github.com/mcmchris/keyword-asr-local-llm-kokoro-tts/releases/download/v1.0.2/Keyword-ASR-Local-LLM-Kokoro-TTS.zip

When I tried to import it, I got an error, invalid file. Could not
see the complete error message. 'zip --test' said it was a valid
zip file.

Any suggestions?

Hi @daveknee. Here is the complete error message:

failed to process the archive: file keyword-asr-local-llm-kokoro-tts/bricks/kokoro_tts/container/models/kokoro-v1.0.fp16.onnx too large

The problem is that the App import feature imposes a file size limit on the App contents. If any individual file in the App archive exceeds 100 MB, the import fails:

The "Keyword-ASR-Local-LLM-Kokoro-TTS" App you are trying to import contains a 169 MB file. This is the cause of the failure.

I submitted a request to the Arduino developers to increase or remove this file size limit:

I also notified the team responsible for the tutorial that it is currently non-functional.


Until such time as support might be added for importing Apps that contain large files, the workaround will be to manually install the App on the filesystem of the VENTUNO Q's Linux machine. I'll provide instructions you can follow to do that.

A general overview of what needs to be done:

  1. Transfer the App archive file to the filesystem on the VENTUNO Q.
  2. Extract the archive.
  3. Move the App folder (keyword-asr-local-llm-kokoro-tts) to the Apps folder (/home/arduino/ArduinoApps).

If you are using the VENTUNO Q in SBC mode, then you can use the web browser to download the file from the link in the tutorial, then use the Ubuntu "Files" file manager to extract the downloaded file and move the App folder.

In case you are using the board in PC hosted mode, or just prefer the command line, I'll provide instructions for installing the App from the shell terminal:

  1. Open a shell terminal on the VENTUNO Q's Linux machine.
    • If you are using the board in "PC hosted mode": Start Arduino App Lab, connect it to the UNO Q board, then click the >_ ("Connect to the board's shell") icon near the bottom left hand corner of the Arduino App Lab window.
    • If you are using the board in "single-board computer (SBC) mode": Open the terminal by selecting Applications > Terminal Emulator from the desktop.
  2. A terminal window will open. Type the following command in the window:
    wget --directory-prefix=/tmp https://github.com/mcmchris/keyword-asr-local-llm-kokoro-tts/releases/download/v1.0.2/Keyword-ASR-Local-LLM-Kokoro-TTS.zip
    
  3. Press the Enter key.
    A file download process will now begin.
  4. Wait for the download to finish successfully, as indicated by a message in the terminal window:
    2026-09-21 22:27:40 (691 KB/s) - ‘/tmp/Keyword-ASR-Local-LLM-Kokoro-TTS.zip’ saved [184760919/184760919]
    
  5. Type the following command in the terminal window:
    unzip -d ~/ArduinoApps /tmp/Keyword-ASR-Local-LLM-Kokoro-TTS.zip
    
  6. Press the Enter key.
    An archive extraction process will start.

You should now see the "Keyword-ASR-Local-LLM-Kokoro-TTS" App listed in Arduino App Lab's "Apps" view, and should be able to use the App as expected.


Please let us know if you have any questions or problems when installing and using the App.

Wow. Great that you are on top of this. Manual install, basically unzipping the package and moving it went smoothly. Running the app needed 2 other models which the AppLab conveniently downloaded. One, an ASR, was from the Qualcomm AI hub, plus there was another Brick needed. Then it automatically downloaded a bunch of Python modules. Then
it complained that my microphone wasn't plugged in. Fixed that and after a wait the blueish
colored bubble said the app was running. Unfortunately, the bubble quickly turned orange and said there was a problem. I don't know where to look to get more details. Are there logs that cover this kind of bug?

Thanks.

That is progress at least! Select the "Python" tab in the panel at the bottom of the Arduino App Lab window:

I suspect you encountered a problem with the App being able to access the microphone:

Traceback (most recent call last):
File "/app/python/main.py", line 42, in <module>
mic_asr = Microphone()
File "/usr/local/lib/python3.13/site-packages/arduino/app_peripherals/microphone/microphone.py", line 192, in __new__
device = _claim_first_available_microphone()
File "/usr/local/lib/python3.13/site-packages/arduino/app_peripherals/microphone/utils.py", line 43, in _claim_first_available_microphone
raise MicrophoneOpenError("No available microphones found: either none is plugged or all are already in use")
arduino.app_peripherals.microphone.errors.MicrophoneOpenError: No available microphones found: either none is plugged or all are already in use
exited with code 1

Got the app to run by specifying a particular mic (Microphone.USB_MIC_1,...) in lines 42 & 43 of main.py. So more progress. Have not gotten the app to indicate that it recognized the wake up word, so more work to do. LED array stays dark.

Wanted also to mention, tho it might be better as a separate thread, that in SBC mode the AppLab reports an error and freezes on launch. This is either on startup or clicking the icon at the center bottom of the main desktop. Launched by 'sudo app-lab' seems to work fine.

Really appreciate your help this far. Thx

That is definitely progress! Thanks for sharing your findings.

Do you see a "Show Error" button in the Arduino App Lab window when that happens?:

If so, please click that button and then provide the text of the error message that is shown here.

The error message on the AppLab said something about not being able to access some unspecified database. Launching from a terminal showed more detail. Turns out /home/arduino.local/ and ...local/share were user/group root/root. Don't know how that happened.
Fixed that with chown. Now it seems OK

Excellent troubleshooting work! I suspected this was the problem you were experiencing, as I also encountered this error:

Unable to open database file on disk

I also used chown to correct the ownership of the folders.

I have reported this to the relevant people at Arduino so that they can make a fix to avoid other users encountering this problem.

Next challenge: I could not get the app to recognize the default wake up word so I changed to the hey_arduino wake up word used in a much simpler example. That it did recognize. Unfortunately it immediately crashed when it transitioned to the listening part of the app saying, I think, that the mic was in use by another process. (I neglected to update the print statement, so the python console still claims that it is waiting for "Ventuno."). I posted some
python logs on dropbox:

Dropbox

Not sure how to look further into this problem. Any ideas?

Also, in the not-ready-for-prime-time department: When the app starts, the orange bubble saying that it failed pops up. After a brief wait, the green bubble saying it IS running appears. And it does run. Also the python console is slow to fill up with the print statements, I think.

All in all it was a pretty ambitious choice of app for me to start with, ASR to LLM to TTS. The little SoM is clearly pretty busy. It does seem to launch quicker as the default app. Not sure if the python console is available right after boot without launching from the AppLab.

Ciao.

You can view the logs from an App's Python script without using Arduino App Lab by using a command line tool named Arduino App CLI. This tool is preinstalled on the VENTUNO Q. The command is arduino-app-cli app logs <App ID>, where <App ID> is the ID of the Arduino App you want to view the Python logs for.

You can determine the App ID by running this command from the shell terminal on the VENTUNO Q's Linux machine (accessed either directly in SBC mode, or via ADB or SSH from your PC):

arduino-app-cli app list

That will output a list of all the Arduino Apps present on the VENTUNO Q. For example:

arduino@uno-q-4-gb:~$ arduino-app-cli app list
ID                                                                                             NAME                                                     ICON STATUS        EXAMPLE 
user:foo                                                                                       foo                                                           stopped       false   
user:keyword-asr-local-llm-kokoro-tts                                                          Keyword-ASR-Local-LLM-Kokoro-TTS                              running       false   
examples:inspirational/color-your-leds                                                         Color your LEDs                                          🎨   uninitialized true    
examples:inspirational/edge-ai-assistant                                                       Edge AI Assistant                                        💬   uninitialized true    

[...]

Here we can see that the ID of the "Keyword-ASR-Local-LLM-Kokoro-TTS" App is user:keyword-asr-local-llm-kokoro-tts. So we can obtain the logs from that App's Python script with this command:

arduino-app-cli app logs user:keyword-asr-local-llm-kokoro-tts

FWIW: There are 2 Microphone instantioations in main.py. They were both passed a parameter shared=False. I changed both to shared=True, and, amazingly, the thing now speaks in response to my speech.

I'm glad you were able to get it working!

I reported the problem with the two Microphone instantiations to the team at Arduino responsible for the tutorial. Hopefully they will be able to adjust the App code so that it will work out of the box for others who try to use it.

Can you help me understand where do you define that "shared=True" that solved the issue?. I am the author of the App and the tutorial and I couldn't replicate the issue of the microphones collisioning.

in main.py ,just after a small block of code setting up Kokoro TTS, I see line 41 mic_spotter = Microphone(Microphone.USB_MIC_1, .... shared=...)
42 mic_ars = Microphone(Microphone.USB_MIC_1, ... shared=...)

I may have altered the mic I am using. I forget now. But that's where I changed shared=False to shared=True.

Pretty amazing app. Thanks

You rock! Thanks, I already validated and tested your solution. Publishing the fix soon. Thanks!