v0.1: Robovoice — PTT re-voicing app
WinForms tray app that captures text (from file or direct input) and synthesizes speech via libpiper (Piper TTS), outputting to any audio device (VB-CABLE for virtual mic routing). Features: - Global PTT hotkey (configurable F1-F12) via WH_KEYBOARD_LL - Text file sequential reader (line-by-line on each PTT cycle) - Direct text input with Speak button - Voice manager: browse 147-voice Piper catalogue, download, remove - libpiper P/Invoke wrapper with UTF-8 marshaling, streaming chunks - BufferedWaveProvider streaming playback with trailing silence flush - Sentence terminator auto-append (fixes espeak-ng final-word drop) - Tray icon with minimize-to-tray Architecture: - Robovoice.Core: ITtsEngine, ISttSource interfaces, voice catalogue - Robovoice.Tts.LibPiper: P/Invoke wrapper for libpiper.dll - Robovoice.Stt.File: text file STT source (testing without mic server) - Robovoice.Stt.Udp: UDP client stub (for future Linux mic server) - Robovoice.App: WinForms UI, orchestrator, PTT hotkey, audio output
This commit is contained in:
Generated
+193
@@ -0,0 +1,193 @@
|
||||
namespace Robovoice.App;
|
||||
|
||||
partial class MainForm
|
||||
{
|
||||
private System.ComponentModel.IContainer? components = null;
|
||||
|
||||
private Label lblPttKey = null!;
|
||||
private ComboBox cmbPttKey = null!;
|
||||
private Label lblVoice = null!;
|
||||
private ComboBox cmbVoice = null!;
|
||||
private Button btnTestVoice = null!;
|
||||
private Button btnManageVoices = null!;
|
||||
private Label lblOutput = null!;
|
||||
private ComboBox cmbOutput = null!;
|
||||
private Label lblFile = null!;
|
||||
private Button btnBrowseFile = null!;
|
||||
private Label lblFileName = null!;
|
||||
private Label lblLineStatus = null!;
|
||||
private RichTextBox txtLog = null!;
|
||||
private CheckBox chkMinimizeToTray = null!;
|
||||
private Button btnClearLog = null!;
|
||||
private Label lblTextInput = null!;
|
||||
private TextBox txtTextInput = null!;
|
||||
private Button btnSpeakInput = null!;
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && components != null)
|
||||
components.Dispose();
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
|
||||
lblPttKey = new Label();
|
||||
cmbPttKey = new ComboBox();
|
||||
lblVoice = new Label();
|
||||
cmbVoice = new ComboBox();
|
||||
btnTestVoice = new Button();
|
||||
btnManageVoices = new Button();
|
||||
lblOutput = new Label();
|
||||
cmbOutput = new ComboBox();
|
||||
lblFile = new Label();
|
||||
btnBrowseFile = new Button();
|
||||
lblFileName = new Label();
|
||||
lblLineStatus = new Label();
|
||||
txtLog = new RichTextBox();
|
||||
chkMinimizeToTray = new CheckBox();
|
||||
btnClearLog = new Button();
|
||||
lblTextInput = new Label();
|
||||
txtTextInput = new TextBox();
|
||||
btnSpeakInput = new Button();
|
||||
|
||||
SuspendLayout();
|
||||
|
||||
// lblPttKey
|
||||
lblPttKey.Text = "PTT Key:";
|
||||
lblPttKey.Location = new Point(12, 15);
|
||||
lblPttKey.Size = new Size(60, 23);
|
||||
lblPttKey.TextAlign = ContentAlignment.MiddleLeft;
|
||||
|
||||
// cmbPttKey
|
||||
cmbPttKey.Location = new Point(75, 12);
|
||||
cmbPttKey.Size = new Size(80, 23);
|
||||
cmbPttKey.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
|
||||
// lblVoice
|
||||
lblVoice.Text = "Voice:";
|
||||
lblVoice.Location = new Point(170, 15);
|
||||
lblVoice.Size = new Size(45, 23);
|
||||
lblVoice.TextAlign = ContentAlignment.MiddleLeft;
|
||||
|
||||
// cmbVoice
|
||||
cmbVoice.Location = new Point(218, 12);
|
||||
cmbVoice.Size = new Size(200, 23);
|
||||
cmbVoice.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
|
||||
// btnTestVoice
|
||||
btnTestVoice.Text = "Test";
|
||||
btnTestVoice.Location = new Point(423, 11);
|
||||
btnTestVoice.Size = new Size(45, 25);
|
||||
btnTestVoice.UseVisualStyleBackColor = true;
|
||||
|
||||
// btnManageVoices
|
||||
btnManageVoices.Text = "Add/Remove...";
|
||||
btnManageVoices.Location = new Point(474, 11);
|
||||
btnManageVoices.Size = new Size(95, 25);
|
||||
btnManageVoices.UseVisualStyleBackColor = true;
|
||||
|
||||
// lblOutput
|
||||
lblOutput.Text = "Output:";
|
||||
lblOutput.Location = new Point(580, 15);
|
||||
lblOutput.Size = new Size(50, 23);
|
||||
lblOutput.TextAlign = ContentAlignment.MiddleLeft;
|
||||
|
||||
// cmbOutput
|
||||
cmbOutput.Location = new Point(633, 12);
|
||||
cmbOutput.Size = new Size(180, 23);
|
||||
cmbOutput.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
|
||||
// lblFile
|
||||
lblFile.Text = "Text File:";
|
||||
lblFile.Location = new Point(12, 48);
|
||||
lblFile.Size = new Size(60, 23);
|
||||
lblFile.TextAlign = ContentAlignment.MiddleLeft;
|
||||
|
||||
// btnBrowseFile
|
||||
btnBrowseFile.Text = "Browse...";
|
||||
btnBrowseFile.Location = new Point(75, 45);
|
||||
btnBrowseFile.Size = new Size(75, 25);
|
||||
btnBrowseFile.UseVisualStyleBackColor = true;
|
||||
|
||||
// lblFileName
|
||||
lblFileName.Text = "(none)";
|
||||
lblFileName.Location = new Point(155, 48);
|
||||
lblFileName.Size = new Size(490, 23);
|
||||
lblFileName.TextAlign = ContentAlignment.MiddleLeft;
|
||||
lblFileName.ForeColor = Color.Gray;
|
||||
|
||||
// lblLineStatus
|
||||
lblLineStatus.Text = "";
|
||||
lblLineStatus.Location = new Point(650, 48);
|
||||
lblLineStatus.Size = new Size(160, 23);
|
||||
lblLineStatus.TextAlign = ContentAlignment.MiddleRight;
|
||||
lblLineStatus.ForeColor = Color.DarkBlue;
|
||||
|
||||
// txtLog
|
||||
txtLog.Location = new Point(12, 112);
|
||||
txtLog.Size = new Size(800, 310);
|
||||
|
||||
// lblTextInput
|
||||
lblTextInput.Text = "Text:";
|
||||
lblTextInput.Location = new Point(12, 84);
|
||||
lblTextInput.Size = new Size(35, 23);
|
||||
lblTextInput.TextAlign = ContentAlignment.MiddleLeft;
|
||||
|
||||
// txtTextInput
|
||||
txtTextInput.Location = new Point(50, 81);
|
||||
txtTextInput.Size = new Size(680, 23);
|
||||
|
||||
// btnSpeakInput
|
||||
btnSpeakInput.Text = "Speak";
|
||||
btnSpeakInput.Location = new Point(737, 80);
|
||||
btnSpeakInput.Size = new Size(75, 25);
|
||||
btnSpeakInput.UseVisualStyleBackColor = true;
|
||||
txtLog.ReadOnly = true;
|
||||
txtLog.Font = new Font("Consolas", 9F);
|
||||
txtLog.BackColor = Color.FromArgb(30, 30, 30);
|
||||
txtLog.ForeColor = Color.FromArgb(220, 220, 220);
|
||||
|
||||
// chkMinimizeToTray
|
||||
chkMinimizeToTray.Text = "Minimize to tray on close";
|
||||
chkMinimizeToTray.Location = new Point(12, 440);
|
||||
chkMinimizeToTray.Size = new Size(180, 24);
|
||||
chkMinimizeToTray.UseVisualStyleBackColor = true;
|
||||
|
||||
// btnClearLog
|
||||
btnClearLog.Text = "Clear Log";
|
||||
btnClearLog.Location = new Point(737, 438);
|
||||
btnClearLog.Size = new Size(75, 25);
|
||||
btnClearLog.UseVisualStyleBackColor = true;
|
||||
|
||||
// MainForm
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(824, 472);
|
||||
Controls.Add(lblPttKey);
|
||||
Controls.Add(cmbPttKey);
|
||||
Controls.Add(lblVoice);
|
||||
Controls.Add(cmbVoice);
|
||||
Controls.Add(btnTestVoice);
|
||||
Controls.Add(btnManageVoices);
|
||||
Controls.Add(lblOutput);
|
||||
Controls.Add(cmbOutput);
|
||||
Controls.Add(lblFile);
|
||||
Controls.Add(btnBrowseFile);
|
||||
Controls.Add(lblFileName);
|
||||
Controls.Add(lblLineStatus);
|
||||
Controls.Add(lblTextInput);
|
||||
Controls.Add(txtTextInput);
|
||||
Controls.Add(btnSpeakInput);
|
||||
Controls.Add(txtLog);
|
||||
Controls.Add(chkMinimizeToTray);
|
||||
Controls.Add(btnClearLog);
|
||||
MinimumSize = new Size(840, 510);
|
||||
Text = "Robovoice";
|
||||
FormBorderStyle = FormBorderStyle.FixedSingle;
|
||||
MaximizeBox = false;
|
||||
ResumeLayout(false);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user