¿Qué se puede usar en C# para convertir voz en texto? Significa hablar por el micrófono de la computadora y luego la computadora responderá.
reconocimiento de voz Speechlib 2011-07-20 15:06
C# implementa pronunciación china o reconocimiento de voz chino
En .net, hay más problemas con el inglés discurso Buen soporte, pero aún no se ha agregado soporte para voz en chino. Si queremos implementar la pronunciación o el reconocimiento de voz en chino, primero debemos instalar el SDK de la aplicación de voz (SASDK) de Microsoft.
La última versión es. SAPI 5.1 puede reconocer tres idiomas: chino, japonés e inglés. Puedes descargarlo aquí: /speech/download/sdk51/,
Necesitas instalar estos dos archivos Speech SDK 5.1 y 5.1 Language Pack, entre ellos. cuyo paquete de idioma 5.1 le permite elegir instalar los idiomas admitidos.
Después de la instalación, podemos comenzar a desarrollar el programa de voz. Por supuesto, antes de eso, debemos agregar SAPI.dll a la referencia como se muestra en la siguiente figura. A continuación, diseñamos un programa que pueda. leer chino e inglés. Clase de lenguaje mixto:
Implementaremos esta clase usando el modo singleton. El código de la clase es el siguiente, lo explicaremos en detalle:
clase pública. Discurso {
discurso estático privado _Instance = null ;
voz privada SpeechLib.SpVoiceClass =null;
discurso privado()
{
BuildSpeach() ;
}
instancia pública estática de Speach()
{
if (_Instance == null)
_Instance = new Speach() ;
return _Instance ;
}
private void SetChinaVoice() p>
{
voz.Voice = voz.GetVoices(string.Empty,string.Empty).Item(0) ;
}
private void SetEnglishVoice()
{
voz.Voice = voz.GetVoices(string.Empty,string.Empty).Item(1) ;
}
private void SpeakChina(string strSpeak)
{
SetChinaVoice() ;
Speak(strSpeak) ;
}
private void SpeakEnglishi(string strSpeak)
{
SetEnglishVoice() ;
Speak(strSpeak) ; p>
}
public void AnalyseSpeak(string strSpeak)
{
int iCbeg = 0;
int iEbeg = 0;
bool IsChina = true ;
for(int i=0;i { char chr = strSpeak; if (IsChina) { if (chr<=122&&chr>= 65) { int iLen = i - iCbeg; cadena strValue = strSpeak.Substring(iCbeg,iLen); SpeakChina(strValue) ; iEbeg = i ; IsChina = false ; } } else { if (chr>122||chr<65) { int iLen = i - iEbeg ; cadena strValue = strSpeak.Substring(iEbeg,iLen) ; this.SpeakEnglishi(strValue) ; iCbeg = i ; IsChina = true ; } } }//finalizar para if (IsChina) { int iLen = strSpeak.Length - iCbeg ; string strValue = strSpeak.Substring(iCbeg,iLen) ; SpeakChina(strValue) ; p> p> } else { int iLen = strSpeak.Length - iEbeg ; cadena strValue = strSpea k.Substring(iEbeg,iLen) ; SpeakEnglishi(strValue) ; } } private void BuildSpeach() { if (voice == null) voice = new SpVoiceClass() } public int Volumen { get { return voice.Volume; } establecer { voz.SetVolume((ushort)(valor)) ; } } p> public int Rate { get { return voice.Rate; } establecer { voz.SetRate(valor) ; } } p> private void Speak(string strSpeack) { prueba { voice.Speak(strSpeack,SpeechVoiceSpeakFlags .SVSFlagsAsync) ; } catch(Error de excepción) { throw(new Exception("Se produjo un error:" +err.Message)) ; } } public void Stop() { voice.Speak(string.Empty,SpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak); } public void Pause()
p> {
voice.Pause() ;
}
public void Continuar()
{
voice.Resume() ;
}
}//finalizar clase
En privado SpeechLib.SpVoiceClass voice =null;aquí, definimos una clase de usuario pronunciar, y la primera vez que se llama a la clase, se inicializa con el método BuildSpeach.
También definimos dos atributos, Volumen y Velocidad, que pueden establecer el volumen y la velocidad de conversación.
Sabemos que SpVoiceClass tiene un método Speak. Nuestro método de pronunciación principal es pasarle una cadena y es responsable de leer la cadena, como se muestra a continuación.
private void Speak(string strSpeack)
{
prueba
{
voice.Speak(strSpeack ,SpeechVoiceSpeakFlags.SVSFlagsAsync) ;
}
catch(Error de excepción)
{
throw(new Exception("Se produjo un error : "+err.Message)) ;
}
}
Donde SpeechVoiceSpeakFlags.SVSFlagsAsync representa la pronunciación asincrónica.
Continuación del artículo anterior "Aplicación de la tecnología china de reconocimiento de voz en C# (1)"... Sin embargo, este método en sí no sabe en qué idioma está la cadena que usted proporciona, por lo que necesitamos este carácter. en qué idioma se lee la cadena. El atributo Voice de la clase SpVoiceClass se utiliza para configurar el idioma. Podemos obtener la lista de todos los idiomas a través del método GetVoices de SpVoiceClass y luego seleccionar el idioma correspondiente según los parámetros, por ejemplo, configurando el idioma en chino. es el siguiente:
private void SetChinaVoice()
{
voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item( 0);
}
0 significa chino, 1234 ambos significan inglés, pero los acentos son diferentes.
De esta manera, hemos configurado el idioma. Si lo combinamos con el método de pronunciación, podemos diseñar un método que solo pronuncie la pronunciación china.
private void SpeakChina(string strSpeak)
{
SetChinaVoice() ;
Speak(strSpeak) ;
}
El método de enviar solo la pronunciación en inglés también es similar, que se incluye en el programa anterior.
Para un idioma que es una mezcla de chino e inglés, la forma en que dejamos que el programa lea el habla mixta es: programando para separar el chino y el inglés del idioma, y llamando al método SpeakChina para chino e inglés. el método SpeakEnglishi para inglés; en cuanto a cómo juzgar si un carácter es inglés o chino, utilizo el método de juzgar el código ASC. El método de clase específico se implementa a través de AnalyseSpeak.
De esta manera, para un texto mixto en chino e inglés, solo necesitamos pasarlo como parámetro a AnalyseSpeak, que puede completar la pronunciación mixta de chino e inglés.
Por supuesto, para operaciones como pausa temporal, continuación y parada de la pronunciación, arriba también se proporcionan llamadas a métodos simples, que son fáciles de entender.
La siguiente es una breve introducción al método de reconocimiento de voz chino:
Primero pegue el código fuente de la clase del reconocimiento de voz a continuación y luego explique:
clase pública SpRecognition
{
SpRecognition estática privada _Instance = null ;
SpeechLib.ISpeechRecoGrammar isrg privado ;
SpeechLib.SpSharedRecoContextClass privado ssrContex = null;
System.Windows.Forms.Control cDisplay privado ;
SpRecognition() privado
{
ssrContex = nuevo SpSharedRecoContextClass( ) ;
isrg = ssrContex.CreateGrammar(1)
SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle =
nuevo _ISpeechRecoContextEvents_RecognitionEventHandler(ContexRecognition) ;
ssrContex.Recognition += recHandle ;
}
public void BeginRec(Control tbResult)
{
isrg.DictationSetState( SpeechRuleState. SGDSActive) ;
cDisplay = tbResult ;
}
instancia pública estática de SpRecognition()
{
if (_Instance == null)
_Instance = new SpRecognition() ;
return _Instance ;
}
public void CloseRec()
{
isrg.DictationSetState(SpeechRuleState.SGDSInactive) ;
}
private void ContexRecognition(int iIndex,object obj, SpeechLib.Spee
chRecognitionType tipo,SpeechLib.ISpeechRecoResult resultado)
{
cDisplay.Text += resultado.PhraseInfo.GetText(0,-1,true) ;
}
}
Definimos ssrContex e isrg como el contexto y la gramática del reconocimiento de voz. Al configurar el método DictationSetState de isrg, podemos iniciar o finalizar el reconocimiento. es el método BeginRec y CloseRec. cDisplay es el lugar que utilizamos para generar los resultados del reconocimiento. Para poder mostrar los resultados en la mayoría de los controles, utilicé una clase de Control para definirlo. Por supuesto, el evento ISpeechRecoContextEvents_RecognitionEventHandler se activará después de cada reconocimiento de voz. Hemos definido dicho método ContexRecognition para responder al evento y generar el resultado del reconocimiento en este método.
De esta manera, algunos de los problemas más básicos en el procesamiento del habla china tienen una solución simple. Por supuesto, este método todavía tiene muchas imperfecciones. Espero que todos puedan brindar más críticas. *** La misma mejora.