听写(语音识别)文本在Swift中不匹配字符串



我开发了一个语音识别函数,可以检测阿拉伯语并返回一个字符串,我将它赋值给一个名为的变量,语音识别文本

在代码中,我还有一个文本字段,我将输入存储在另一个名为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字符,其unicodeScalar65532u{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()

,然后比较。结果如预期。

相关内容

  • 没有找到相关文章

最新更新