-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVoiceLexiconManager.cs
More file actions
105 lines (91 loc) · 3.28 KB
/
VoiceLexiconManager.cs
File metadata and controls
105 lines (91 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace TimeTask
{
public sealed class VoiceLexiconManager
{
private readonly SpeechModelManager _modelManager;
private readonly string _userLexiconPath;
public VoiceLexiconManager(SpeechModelManager modelManager = null)
{
_modelManager = modelManager ?? new SpeechModelManager();
string appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string dir = Path.Combine(appData, "TimeTask");
Directory.CreateDirectory(dir);
_userLexiconPath = Path.Combine(dir, "voice_lexicon.txt");
}
public void RecordConfirmedPhrase(string phrase)
{
if (string.IsNullOrWhiteSpace(phrase))
return;
string cleaned = phrase.Trim();
if (cleaned.Length < 2)
return;
var existing = LoadUserLexicon();
if (!existing.Contains(cleaned, StringComparer.OrdinalIgnoreCase))
{
existing.Add(cleaned);
SaveUserLexicon(existing);
}
MergeIntoPhrasesFile(existing);
}
public List<string> LoadUserLexicon()
{
try
{
if (!File.Exists(_userLexiconPath))
return new List<string>();
return File.ReadAllLines(_userLexiconPath)
.Select(l => l?.Trim())
.Where(l => !string.IsNullOrWhiteSpace(l))
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
}
catch
{
return new List<string>();
}
}
private void SaveUserLexicon(List<string> phrases)
{
try
{
var lines = phrases
.Where(p => !string.IsNullOrWhiteSpace(p))
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
File.WriteAllLines(_userLexiconPath, lines);
}
catch { }
}
private void MergeIntoPhrasesFile(List<string> userPhrases)
{
try
{
string hintsPath = _modelManager.GetHintsFilePath();
Directory.CreateDirectory(Path.GetDirectoryName(hintsPath));
var existing = new List<string>();
if (File.Exists(hintsPath))
{
existing = File.ReadAllLines(hintsPath)
.Select(l => l?.Trim())
.Where(l => !string.IsNullOrWhiteSpace(l))
.ToList();
}
var merged = existing
.Concat(userPhrases)
.Distinct(StringComparer.OrdinalIgnoreCase)
.Take(500)
.ToList();
File.WriteAllLines(hintsPath, merged);
VoiceRuntimeLog.Info($"Voice lexicon merged into phrases.txt, count={merged.Count}");
}
catch (Exception ex)
{
VoiceRuntimeLog.Error("Failed to merge voice lexicon into phrases.txt.", ex);
}
}
}
}