| Commit message (Collapse) | Author | Age |
| ... | |
| |
|
|
|
|
|
|
|
|
|
| |
When the user pauses their speech for an extended period of time, the
transcription engine will sleep for progressively longer intervals,
up to 1.5 seconds between transcriptions. This allows us to reduce
idle resource consumption.
To enable responsive transcription while the user is speaking actively,
we reset the sleep duration to the minimum whenever a change is
detected.
|
| |
|
|
| |
Use this as a submenu
|
| | |
|
| |
|
|
|
|
|
| |
While the board is clearing, you can keep talking, and it will be
rendered when the board finishes clearing.
* bugfix: STT only beeps when it's out
|
| |
|
|
|
|
|
|
|
|
|
| |
Empty cells are excluded from the beeping behavior. Note: I have not
checked in the prefab with the audio source yet.
* libtastt gen_fx now adds 3 toggles to FX layer: toggle board, toggle world
lock, toggle beep sound
* libunity guid_map can now append instead of replacing
* TaSTT_Toggle_{On,Off}.anim now use the prefab path, as do generated
animations
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
| |
* Fix bug where facial animations cause already-written letters to
change (!!!)
* Add libtastt.py to hold abstractions layered over libunity
* Fix
* libunity: Fix bug where integer equality state transition conditions
ignored the threshold
* libunity: Support placing animator states at different positions
|
| |
|
|
|
| |
fixWriteDefaults would assign two documents the same anchor. Unsure
why but this fixes it.
|
| |
|
|
| |
Add LH/RH weighted animations.
|
| |
|
|
|
|
|
| |
A few changes:
* we never infer class ID from object ID
* merged object IDs are allocated in a flat namespace, not in a
per-class namespaces
|
| |
|
|
| |
Enable host armature instead of relying on a TaSTT parameter.
|
| |
|
|
|
| |
Simple hands animator that doesn't rely on write defaults. Use libunity
gen_off_anims utility to generate per-animation reset animations.
|
| |
|
|
|
|
|
|
| |
Add utility to programmatically generate "off" animations. Scans every
animation in the project, checks if it sets anything nonzero, and if so,
generates a copy of it which sets everything to zero.
This is useful for transitioning away from write defaults.
|
| |
|
|
|
|
|
|
| |
Some animators generate negative anchors. Casting to u64 doesn't produce
an anchor with a valid prefix, so idk what it is. Use the class ID from
the little !u! bit instead of deriving it from the anchor.
Some things probably don't work yet.
|
| |
|
|
|
|
| |
Also adjust continuous transcription algorithm to use leftmost minimum
instead of rightmost. This prevents some cases where we generate longer
and longer text.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Algorithm:
* look at last 20 chars of last committed transcription
* scan new transcription using 10-char sliding window
* find spot where distance is minimized
* stitch two messages together
Thus we're able to maintain a continuously growing transcription
without having to feed the AI more than 30 seconds of data at a
time. Seems to work reasonably well in bench tests.
Also fix silence detection. AI exposes a probability that nothing
was said. Hand-pick a probability of 0.1. Sometimes the AI still
goes sicko mode with this setting but going higher occasionally
results in no transcription.
|
| | |
|
| |
|
|
| |
Scratch doc containing commands I've been using a lot
|
| |
|
|
|
| |
Overwrite any animation containing an unknown GUID to the tastt noop
animation. This seems to help the reset layer function properly.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Now we only overwrite gesture parameters if there's no active gesture.
This makes gesturing smoother, since we're not overwriting gesture
params twice on every frame.
Gestures don't reliably reset. I think I need to add the noop animation
across the entire animator. No idea what's really causing it.
Also factor out code for generating transitions that have parameter
conditions. Support exists for boolean and integer equality conditions.
|
| |
|
|
|
|
|
|
|
| |
* Unity needs empty Mappings to be indicated with {} or it will assume
they're a Sequence
* Unity doesn't like it when we reassign the default animation layer's
MonoBehaviour ID, so hack around this by simply reusing the existing
MonoBehaviour's ID
* Use MulticoreUnityParser everywhere
|
| |
|
|
|
|
|
|
| |
Divide YAML stream into `nproc` chunks and parse each sub-stream in a
process. We can't use threads because of the python global interpreter
lock, but processes work pretty well.
Parsing my 1.2M line / 43k document YAML goes from 65 seconds to 13.
|
| |
|
|
|
| |
* Implement basic board toggle using new transition logic
* Metadata can now restore from file
|
| |
|
|
|
|
|
|
|
| |
Messages longer than a board will automatically write over the top.
TODO
* Real cell-based message diffing
* Cumulative transcription
* this would completely mitigate the effects of trim events
|
| |
|
|
|
|
|
| |
Add a third heuristic. If the transcription is relatively long and the
first bit differs from the previous transcription, immediately
overwrite. Because the transcription is long, it's a bit less likely to
be a complete mistranscription.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Slightly improve temporal stability and responsiveness at the cost of
limiting to a 30 second recording.
Before committing to a transcription, wait for two consecutive
transcriptions such that they are identical, or the former is a
prefix of the latter. This helps with temporal stability by eliminating
most one-off wildly inaccurate transcriptions.
Also make osc_ctrl.sendMessageLazy a little lazier, limiting it to 2
consecutive non-empty cells per call. This allows us to recover from
mistranscriptions faster.
|
| |
|
|
|
|
|
|
|
| |
Also:
* Check in toggle on/off animations
* Add toggle parameter
* libunity bug: getUniqueId() was calling allocateId() incorrectly
* Remove osc_ctrl `client` global
* Fix transcribe.py text encoding
|
| |
|
|
| |
Write defaults fix is now complete
|
| |
|
|
|
|
|
|
|
| |
* Generate an animation which zeroes out everything which uses write
defaults
* Disable write defaults on every animation for which we do this
* Add copy() method to Mapping and Sequence
* Because of the `parent` pointer, copy.deepcopy() doesn't really work
on this data structure.
|
| |
|
|
|
|
| |
* Add guid scanning method
* Generate mapping from guid to filename
* Mapping may be saved & restored from disk
|
| |
|
|
|
|
|
| |
Object IDs are allocated optimally now, but it's a bit slower due to
long parse times.
Also fix minor bug in generate_fx.py.
|
| |
|
|
|
|
|
|
| |
Add parser for Unity's malformed YAML. This should make it easier to
manipulate animators.
It probably doesn't quite work yet, and certainly needs some usability
features.
|
| |
|
|
|
|
| |
TODO
* write default detection/correction
* real cmdline interface
|
| |
|
|
|
|
|
|
|
| |
* Add VRLabs' World Constraint as a submodule
* Add animations for world constraint
* Add toggles for board
* Add libunity.py (no content yet)
* Support >30s transcription
* Add board FBX
|
| | |
|
| |
|
|
|
| |
It's a little buggy; it likes to overwrite cells on the board. No idea
why.
|
| | |
|
| |
|
|
| |
Also update README.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Using OpenAI's whisper neural network, we can do local STT. Translation
quality is good, system resource usage is minimal (1 GB VRAM), latency
is much lower than cloud-based translation.
* Add transcribe.py
* Creates 3 threads:
* One saves mic audio to a buffer
* One passes mic audio to the STT
* One sends the transcribed text to the board
* Main thread listens for input. Press enter to start a new message.
* Add osc_ctrl.sendMessageLazy, a simple diff-based message sending utility.
* A little complexity: it only sends 1 empty cell per call, allowing us to
quickly say new things without having to wait for the whole buffer to
clear.
|
| |
|
|
|
|
| |
* Update README with contribution instructions & design details.
* Add text-to-text demo gif
* Document known Unity landmines in generate.sh.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Double board size from 6x16 to 8x22
* Reduce parameter bits used (thanks to extra layer of indexing)
* Rename template.anim to template.anim.txt to prevent Unity from
constantly rewriting it
* osc_ctrl.encodeMessage now pads the message so that all empty space is
overwritten
* Delete osc_ctrl.sendMessageCellContinuous. Now that we use a single 'Enable'
bit, this idea is sidelined.
* We can probably achieve the same effect by making TaSTT.shader a little
more clever. For example, if we pass it the current cell number, it could
render a time-based 'fade-in' effect which simulates smooth streaming.
|
| |
|
|
| |
Even more reliable now.
|
| |
|
|
|
|
|
| |
* Shorten animations to 1 frame
* Eliminate fx internal transition delays
* These were causing the shader parameters to interpolate, causing the
inconsistent / flickering letters I was seeing
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Per the VRC docs, state behaviors may not execute if the total length of
time in the state is < 0.02 seconds. Adding a 2-frame 'Do Nothing'
animation to the top of every layer seems to help with stability.
*shrug*
More cleanup:
* Generate a unique return-home transition for each terminal state
instead of reusing the same one.
* Use globally unique state names in animator.
* All animations are at least 2 frames long.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
... and a bunch of bugfixes:
* Shader is now transparent
* Simplify shader row/column calculation
* Add punctuation to texture
* Fix generate.sh
* Add lorum_ipsum.txt
* Fix how long text is scrolled
* Simplify encoding logic in osc_ctrl.py
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
| |
Add trivial line wrapping algorithm. Words are only added to
a line if they don't put it over the column limit, and only broken if
they alone exceed the column limit.
Extend board size to 16x6, using 145 bits of parameter memory.
Add simple generate.sh script, which generates everything needed to
use the text-to-text board.
|