Skip to content

Commit

Permalink
Add formatter
Browse files Browse the repository at this point in the history
  • Loading branch information
ButterscotchV committed Jan 28, 2024
1 parent d1db005 commit 3bf5c3b
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 13 deletions.
6 changes: 5 additions & 1 deletion ButterSTT/ButterSTT.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@

<ItemGroup>
<PackageReference Include="AprilAsr" Version="0.0.1.7" />
<PackageReference Include="NAudio" Version="2.1.0" />
<PackageReference Include="CSharpier.MsBuild" Version="0.27.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="NAudio" Version="2.2.1" />
</ItemGroup>

<ItemGroup>
Expand Down
5 changes: 4 additions & 1 deletion ButterSTT/EnglishCapitalization.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ public static string Capitalize(string message)
}

// Capitalizes starts of sentences and standalone "I"s, must be run on a lowercase string
[GeneratedRegex(@"(^|[?!.])\s*?([a-z])|(^|[^a-z])i($|[^a-z])", RegexOptions.Multiline & RegexOptions.NonBacktracking)]
[GeneratedRegex(
@"(^|[?!.])\s*?([a-z])|(^|[^a-z])i($|[^a-z])",
RegexOptions.Multiline & RegexOptions.NonBacktracking
)]
private static partial Regex BasicCapitals();
}
}
6 changes: 5 additions & 1 deletion ButterSTT/OSCHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ public static OscMessage MakeChatboxTyping(bool isTyping)
return new OscMessage("/chatbox/typing", isTyping);
}

public static OscMessage MakeChatboxInput(string message, bool skipKeyboard = true, bool playNotification = false)
public static OscMessage MakeChatboxInput(
string message,
bool skipKeyboard = true,
bool playNotification = false
)
{
return new OscMessage("/chatbox/input", message, skipKeyboard, playNotification);
}
Expand Down
9 changes: 7 additions & 2 deletions ButterSTT/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,13 @@
Directory.CreateDirectory(modelsDir);

// Find the first model available
var modelPath = Directory.GetFiles(modelsDir).FirstOrDefault(name => !string.IsNullOrWhiteSpace(name) && name.EndsWith(".april"), null) ??
throw new FileNotFoundException($"Could not find any available AprilAsr models (*.april) in \"{modelsDir}\".");
var modelPath =
Directory
.GetFiles(modelsDir)
.FirstOrDefault(name => !string.IsNullOrWhiteSpace(name) && name.EndsWith(".april"), null)
?? throw new FileNotFoundException(
$"Could not find any available AprilAsr models (*.april) in \"{modelsDir}\"."
);

using var speechToTextHandler = new SpeechToTextHandler(modelPath);
speechToTextHandler.StartRecording();
Expand Down
35 changes: 27 additions & 8 deletions ButterSTT/SpeechToTextHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ public SpeechToTextHandler(string modelPath, int deviceNumber = 0)
Model = new AprilModel(modelPath);
ModelPath = modelPath;

Console.WriteLine($"Model loaded from \"{modelPath}\":\n > Name: {Model.Name}\n > Description: {Model.Description}\n > Language: {Model.Language}\n > Sample Rate: {Model.SampleRate} Hz");
Console.WriteLine(
$"Model loaded from \"{modelPath}\":\n > Name: {Model.Name}\n > Description: {Model.Description}\n > Language: {Model.Language}\n > Sample Rate: {Model.SampleRate} Hz"
);

// Initialize session
Session = new AprilSession(Model, OnAprilTokens, async: true);
Expand Down Expand Up @@ -70,7 +72,8 @@ public void StopRecording()
public void SwapMicrophoneDevice(int deviceNumber)
{
// If it's already using this device, ignore it and continue
if (AudioIn.DeviceNumber == deviceNumber) return;
if (AudioIn.DeviceNumber == deviceNumber)
return;

var wasRecording = MicrophoneRecording;

Expand All @@ -95,7 +98,8 @@ public void SwapMicrophoneDevice(int deviceNumber)

private void OnMicData(object? sender, WaveInEventArgs args)
{
if (args.BytesRecorded <= 0) return;
if (args.BytesRecorded <= 0)
return;

// Convert the bytes to shorts
var shorts = new short[args.BytesRecorded / 2];
Expand All @@ -108,7 +112,8 @@ private void OnMicStop(object? sender, StoppedEventArgs args)
Session.Flush();
MicrophoneRecording = false;

if (RestartRecordingNextStop) StartRecording();
if (RestartRecordingNextStop)
StartRecording();
}

private void OnAprilTokens(AprilResultKind result, AprilToken[] tokens)
Expand All @@ -134,26 +139,40 @@ private void OnAprilTokens(AprilResultKind result, AprilToken[] tokens)
aprilOutput.Append(token.Token);
}

var aprilOutputString = tokens.Length > 0 ? EnglishCapitalization.Capitalize(aprilOutput.ToString().Trim()) : "";
var aprilOutputString =
tokens.Length > 0
? EnglishCapitalization.Capitalize(aprilOutput.ToString().Trim())
: "";

try
{
if (tokens.Length > 0 && !string.IsNullOrWhiteSpace(aprilOutputString))
{
// Only print if at the end of a word or sentence, we don't want to print incomplete words
var lastToken = tokens.Last();
if ((lastToken.WordBoundary || lastToken.SentenceEnd) && (DateTime.Now - lastMessage).TotalSeconds > 1.3d)
if (
(lastToken.WordBoundary || lastToken.SentenceEnd)
&& (DateTime.Now - lastMessage).TotalSeconds > 1.3d
)
{
lastMessage = DateTime.Now;
if (result != AprilResultKind.FinalRecognition)
{
// Still typing the message... Show as typing!
oscHandler.OSCSender.Send(new OscBundle(0, OSCHandler.MakeChatboxInput(aprilOutputString), OSCHandler.MakeChatboxTyping(true)));
oscHandler.OSCSender.Send(
new OscBundle(
0,
OSCHandler.MakeChatboxInput(aprilOutputString),
OSCHandler.MakeChatboxTyping(true)
)
);
}
else
{
// Just send the message, no more typing
oscHandler.OSCSender.Send(OSCHandler.MakeChatboxInput(aprilOutputString));
oscHandler.OSCSender.Send(
OSCHandler.MakeChatboxInput(aprilOutputString)
);
}
}
}
Expand Down

0 comments on commit 3bf5c3b

Please sign in to comment.