This repository contains the grammar definitions for Speechly NLU examples and an AST parser for these rules, written in Go.
The parser can be used as a standalone command-line client or included in other Go projects as a library.
Speechly is a developer tool for building real-time multimodal voice user interfaces. It enables developers and designers to enhance their current touch user interface with voice functionalities for better user experience. Speechly key features:
- Fully streaming API
- Multi modal from the ground up
- Easy to configure for any use case
- Fast to integrate to any touch screen application
- Supports natural corrections such as "Show me red – i mean blue t-shirts"
- Real time visual feedback encourages users to go on with their voice
Get the parser, a file with examples and run it:
nlu-example-parser -input_file_path nlu-examples.md > output.json
More CLI options available, you can tune the performance / memory usage or enable debug output:
Usage of nlu-example-parser:
-input_file_path string
path to input file (required)
-buffer_size_mb uint
size of the input and output buffers for input and output files (default 1)
-parser_buffer_size_lines uint
size of the buffer with parsed lines (default 100)
You can check out some example rules and sample output.
Pre-built binaries are automatically compiled on every release - https://github.com/speechly/nlu-example-parser/releases, you can download them using e.g. curl
:
# amd64 or 386
$ export ARCH="amd64"
# darwin, linux, freebsd
$ export PLATFORM="darwin"
$ export FILENAME="speechly-nluexamplesparser-${PLATFORM}-${ARCH}.tar.gz"
# If you want specific version
$ export VERSION="v0.2.0"
$ curl -LJO https://github.com/speechly/nlu-example-parser/releases/download/${VERSION}/${FILENAME}
# Or if you want just the latest
$ curl -LJO https://github.com/speechly/nlu-example-parser/releases/latest/download/${PARSER}
$ tar -xzf ${FILENAME}
Alternatively, you can build it yourself, make sure you have make
and go
installed. Minimum support Go version is 1.13
.
# Clone the repo
$ git clone git@github.com:speechly/nlu-example-parser.git
$ cd nlu-example-parser
# Compile the parser
$ make build
# Run it
$ ./bin/parser -input_file_path ./examples/test_multi_intent_data.md
Get it using go get
:
$ go get github.com/speechly/nlu-example-parser
The library exposes a couple of different parser API, you can choose which one you want to use.
The simplest version, you can use it the following way:
package main
import (
"fmt"
"github.com/speechly/nlu-example-parser/pkg/parser"
)
const (
testUtterance = "*change change the [kitchen door knobs](object)! *_ and *remove remove the [table](object)"
)
func main() {
// Create a new parser.
p := parser.NewParser()
// Consume the results.
done := make(chan struct{})
go func() {
defer close(done)
for u := range p.Results() {
fmt.Printf("Received utterance %+v\n", u)
}
}()
// Send some utterances.
for i := 0; i < 10; i++ {
p.Parse(testUtterance)
}
p.Close()
<-done
}
You can use the streaming version of a parser in your Go program the following way:
package main
import (
"context"
"fmt"
"github.com/speechly/nlu-example-parser/pkg/parser"
)
const (
bufSize = 10
verbose = false
testUtterance = "*change change the [kitchen door knobs](object)! *_ and *remove remove the [table](object)"
)
func main() {
ctx := context.Background()
// Create a new parser.
p := parser.NewStreamParser(bufSize, verbose)
// Start the parser.
if err := p.Start(ctx); err != nil {
panic(err)
}
go func() {
// Stop the parser after finishing writing to it.
defer p.Stop(ctx)
for i := 0; i < 10; i++ {
if err := p.Write(ctx, testUtterance); err != nil {
panic(err)
}
}
}()
// Consume the results.
for u := range p.Results() {
fmt.Printf("Received utterance %+v\n", u)
}
}
You can use the io.ReadWriteCloser
version of a parser in your Go program the following way:
package main
import (
"fmt"
"io"
"os"
"strings"
"sync"
"github.com/speechly/nlu-example-parser/pkg/parser"
)
const (
bufSize = 10
parserBufSize = 10
testUtterance = "*change change the [kitchen door knobs](object)! *_ and *remove remove the [table](object)\n"
)
func main() {
var wg sync.WaitGroup
r := strings.NewReader(testUtterance)
parser := parser.NewIOParser(bufSize, parserBufSize)
wg.Add(1)
go func() {
defer wg.Done()
defer parser.Close()
if _, err := io.Copy(parser, r); err != nil && err != io.EOF {
fmt.Fprintf(os.Stderr, "parser encountered an error: %s\n", err.Error())
os.Exit(1)
}
}()
wg.Add(1)
go func() {
defer wg.Done()
if _, err := io.Copy(os.Stdout, parser); err != nil && err != io.EOF {
fmt.Fprintf(os.Stderr, "parser encountered an error: %s\n", err.Error())
}
}()
wg.Wait()
os.Exit(0)
}