say - 用于语音和视频通话的命令行工具
Say is a terminal‑first voice and video call utility that builds an embedded Yggdrasil node via ygg and speaks directly to other peers over the Ygg overlay network. Audio is captured with malgo (miniaudio), encoded as G.722, and optionally sent via UDP for lower latency. Video frames are sourced through gocam, compressed then rendered in the current terminal session using Unicode glyphs.
The project is intended as a lightweight experiment: share your Yggdrasil
address, run say on both ends, and you have voice/video without deploying an
external Yggdrasil daemon or web stack.
config.json that holds the Yggdrasil
settings.Go to Releases download adn start it
curl -fsSL https://raw.githubusercontent.com/svanichkin/say/main/scripts/install-release.sh | bash
OR
wget -qO- https://raw.githubusercontent.com/svanichkin/say/main/scripts/install-release.sh | bash
The script detects your platform, downloads the latest release artifact from
GitHub, and installs say into a sensible default directory:
$HOME/.local/bin for non‑root users, /usr/local/bin otherwise.%USERPROFILE%\AppData\Local\Programs\say.Override the target via INSTALL_DIR=/custom/path ./scripts/install-release.sh.
Supply a specific tag with VERSION=v0.4.0 ./scripts/install-release.sh, or
point to a fork using REPO=myuser/say ./scripts/install-release.sh. Ensure
curl, tar, and (for Windows archives) unzip are available, and add the
chosen install directory to your PATH if needed.
Very simple for linux/macos
CGO_ENABLED=1 go install github.com/svanichkin/say@latest
Then use
~/go/bin/say
Windows with CMD
set CGO_ENABLED=1
go install github.com/svanichkin/say@latest
Windows with Powershell
$env:CGO_ENABLED = "1"
go install github.com/svanichkin/say@latest
Then use
C:\Users\USERNAME\go\bin\say.exe
The package is also available on the AUR, if you use an AUR helper, you can install it for example with:
yay -S say
git clone https://github.com/svanichkin/say.git
cd say
make
You can also run the tool without building a binary linux/macos:
env CGO_ENABLED=1
go run .
Windows with CMD
set CGO_ENABLED=1
go run .
Windows with Powershell
$env:CGO_ENABLED = "1"
go run .
Say stores its configuration under your OS config directory: on Linux this is
typically $XDG_CONFIG_HOME/say/config.json (or ~/.config/say/config.json if
XDG_CONFIG_HOME is unset), while on macOS it resolves to
~/Library/Application Support/say/config.json. You can point to a different
path with -config /path/to/config.json.
The configuration file is a regular Yggdrasil node config plus an optional
contacts_dir key understood by Say:
{
"peers": [
"tls://example.yggnode.net:443",
"quic://203.0.113.10:8443"
],
"contacts_dir": "/Users/me/Contacts"
}
Pass the same config file to Say – the embedded node uses it to bootstrap. When
contacts_dir is supplied (or overridden via -contacts), Say recursively
scans that directory. Each friend is represented as a folder that contains a
say subdirectory with text files holding IPv6 addresses:
~/Contacts/
Alice G/
say
Bob D/
say/
phone
console
say directory holds a single file, its address is added as Alice G.Bob D/phone or Bob D/console, where the suffix comes from the filename.When selecting a friend inside the CLI, use those exact labels ("Bob D/phone").
If you start say with -contacts /path/to/contacts, that path is persisted
into the active config so future runs can omit the flag.
The utility automatically updates the list of peers each time it starts.
Run Say on one machine in listen mode:
./say
The program prints your Yggdrasil address. Share it with a friend and have them dial you:
./say "200:abcd:1234:..."
Optionally pass the port as a separate argument, in any order:
./say "[200:abcd:1234:...]:7777"
./say 7777 "200:abcd:1234:..."
./say "200:abcd:1234:..." 7777
To bypass Yggdrasil and use ordinary TCP/UDP over a regular IP address, select the plain transport explicitly:
./say -transport plain -port 7000
./say -transport plain -port 7001 "127.0.0.1:7000"
Select alternative configs explicitly via -config work (which maps to
$XDG_CONFIG_HOME/say/work.json). Positional arguments are interpreted as
either a dial target ("200:abcd:...") or a friend name from contacts
("Alice G", "Bob D/phone"). To run the server with another profile, always
pass -config; bare tokens are no longer treated as profile names.
Audio and video are always enabled when hardware is present; no extra flags are required. Relevant CLI switches:
-log, Say writes logs only to stderr. With -log, it also writes a log file next to the running executable using the config name, for example -config client -> client.log. The resolved path is printed on startup. Use -log debug for the most detailed file logging.-port – listening TCP/UDP port (defaults to 7777).-transport – network backend: ygg (default, embedded Yggdrasil) or plain (ordinary TCP/UDP over regular IP).-fps – cap video capture/rendering to N FPS (5–30, defaults to 25).-config – config profile or path; -config work maps to $XDG_CONFIG_HOME/say/work.json.-log – write .log next to the running executable. -log debug also enables verbose debug logging.-contacts – override the contacts directory defined in the config.-v – verbose logging.-version – print version and exit.-donate – print donation information and exit.-support – print support link and exit.-red, -orange, -yellow, -green, -teal, -blue, -purple, -pink, -gray, -bw – apply a tinted (or neutral) monochrome filter to the local/remote viewports (purely visual, codec stream stays untouched). Use at most one flag; if several are present the last one wins.When media is disabled on both ends, Say falls back to a simple line‑based text bridge over the established TCP session.
./say../say "alice-ygg-addr".Ctrl+C to terminate; the app restores the terminal state.This project is distributed under the terms of the MIT License.
Monero 41uoDd1PNKm7j4LaBHHZ77ZPbEwEJzaRHhjEqFtKLZeWjd4sNfs3mtpbw1mcQrnNLBKWSJgui9ELEUz217Ui6kF13SmF4t5
暂无开放 Issues,或尚未同步最近议题。