我开发了一个语音识别函数,可以检测阿拉伯语并返回一个字符串,我将它赋值给一个名为的变量,语音识别文本。
在代码中,我还有一个文本字段,我将输入存储在另一个名为textFieldText的字符串变量中。
我想要能够检查是否在speechRecogText包含想要的textFieldText,这通常适用于英语,但对于阿拉伯语它不工作。
然而,当我尝试相反的方式speechRecogText.contains(textFieldText)它的工作。下列代码
// the two variables
var speechRecogText: String = ""
var textFieldText: String = ""
语音识别功能和Textfield…输入输入后,调用函数compareTexts()
func compareTexts() {
// Checking the textField text
if speechRecogText.contains(textFieldText) {
print("matching texts")
} else {
print("not matching")
}
// Checking the speech recog text
if textFieldText.contains(speechRecogText) {
print("matching texts")
} else {
print("not matching")
}
}
例如,两者都将打印word "قل"阿拉伯语。但是当我调用这个函数时,控制台显示(答案):
Console
//matching texts
//not matching
我希望第二个也工作/匹配和打印匹配的文本。
虽然两个变量包含相似的文本,但结果有点令人困惑。它们是否存储相同的值,或者它们是否显示相同的字符串,但在代码深处它们以某种方式变化?
我真的很感激你的支持:)
下面是完整的代码
这是整个代码。
import SwiftUI
import SwiftSpeech
struct ContentView: View {
@State var speechRecogText = "قل"
@State var textFieldText = "قل"
var body: some View {
VStack {
//MARK: - Text Field
TextField("textfield text", text: $textFieldText)
.padding()
Button(action: {
compareTexts()
} ) {
ZStack {
Color.blue.clipShape(Circle()).frame(width: 70, height: 70)
Text("Check").foregroundColor(.white)
}
}
//MARK: - Speech Recognition
Text("speechRecogText: " + speechRecogText)
SwiftSpeech.RecordButton()
.swiftSpeechRecordOnHold(locale: Locale(identifier: "ar"),
animation: .spring(),
distanceToCancel: 50)
.onRecognizeLatest { result in
self.speechRecogText = result.bestTranscription.formattedString
if result.isFinal {
print("last transcript")
}
} handleError: { error in
print("Failed recognizing the audio. Retry: (error)")
}
}
}
func compareTexts() {
// Checking the textField text
if speechRecogText.contains(textFieldText) {
print("---> speechRecogText contains textFieldText")
} else {
print("---> speechRecogText DOES NOT contains textFieldText")
}
// Checking the speech recog text
if textFieldText.contains(speechRecogText) {
print("---> textFieldText contains speechRecogText")
} else {
print("---> textFieldText DOES NOT contains speechRecogText")
}
}
}
适用于任何语言的通用解决方案
我注意到听写实际上附加了一个nil字符,其unicodeScalar
是65532
或u{fffc}
,到正在处理的字符串,使字符串无法用于搜索。在阿拉伯语中,由于字符串的方向,它可能成为第一个字符。
extension String {
func removeNilCharacters() -> String {
return self.replacingOccurrences(of: "u{fffc}", with: "", options: String.CompareOptions.literal, range: nil)
}
}
将.removeNilCharacters()
应用于文本字段返回的字符串应该可以解决问题,无论是否调用了听写。
好的,这就是我测试比较阿拉伯文本的方法。它显示了预期的结果。
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@State var results1 = "testing1"
@State var results2 = "testing2"
var speechRecogText: String = "قلّ"
var textFieldText: String = "قلّ جسمه من الكبَر"
func compareTexts() {
// Checking the textField text
if speechRecogText.trim().contains(textFieldText.trim()) {
results1 = "speechRecogText contains textFieldText"
print("---> speechRecogText contains textFieldText")
} else {
results1 = "speechRecogText DOES NOT contains textFieldText"
print("---> speechRecogText DOES NOT contains textFieldText")
}
// Checking the speech recog text
if textFieldText.trim().contains(speechRecogText.trim()) {
results2 = "textFieldText contains speechRecogText"
print("---> textFieldText contains speechRecogText")
} else {
results2 = "textFieldText DOES NOT contains speechRecogText"
print("---> textFieldText DOES NOT contains speechRecogText")
}
}
var body: some View {
VStack (spacing: 50) {
Text(results1)
Text(results2)
}
.onAppear {
compareTexts()
}
}
}
extension String {
func trim() -> String {
return self.trimmingCharacters(in: .whitespacesAndNewlines)
}
}
所以在测试代码之后,我发现语音识别文本比硬编码字符串有更多的字符。当我使用。count()作为textField text "قل"它打印了2,但是对于语音识别,它打印了3。
我使用映射方法来查看额外的字符。
speechRecogText.map({ print($0) })
看起来第一个字符是一个空格。所以我使用
speechRecogText.removeFirst()
,然后比较。结果如预期。