Я пытаюсь использовать преобразование текста в речь Microsoft Speech API в моем java-проекте для Android. Это не работает. Можно ли использовать этот API в Java?
Преобразование речи в текст работает, я нашел быстрый старт и без проблем использовал его.
Однако примера java для преобразования текста в речь нет, только в С#, С++ (Windows) и С++ (Линукс).
Я пытался адаптировать код в java, но он не работает, и я понятия не имею, почему.
public void onTextToSpeechButtonClicked(View v) {
TextView txt = (TextView) this.findViewById(R.id.texttospeech); // 'texttospeech' is the ID of my text view
try {
// THIS LINE ISN'T WORKING
com.microsoft.cognitiveservices.speech.internal.SpeechConfig config = com.microsoft.cognitiveservices.speech.internal.SpeechConfig.FromSubscription(speechSubscriptionKey, serviceRegion);
config.SetSpeechRecognitionLanguage("fr-FR");
assert(config != null);
// Creates a speech synthesizer using the default speaker as audio output
SpeechSynthesizer synthesizer = SpeechSynthesizer.FromConfig(config);
assert(synthesizer != null);
SpeechSynthesizer synthesizer1 = SpeechSynthesizer.FromConfig(config);
SpeechSynthesisResult result = synthesizer.SpeakTextAsync(txt.toString()).Get();
// Checks result
if (result.getReason().equals(ResultReason.SynthesizingAudioCompleted)){
txt.setText("The text has been said.");
}
else if (result.getReason().equals(ResultReason.Canceled)){
SpeechSynthesisCancellationDetails cancellation = SpeechSynthesisCancellationDetails.FromResult(result);
txt.setText("CANCELED: Reason = "+cancellation.getReason());
if (cancellation.getReason().equals(CancellationReason.Error)){
txt.append("ErrorCode = "+cancellation.getErrorCode()+" / ErrorDetails = "+cancellation.getErrorDetails()+" / Did you update the subscription info ?");
}
}
synthesizer.delete();
} catch (Exception ex) {
Log.e("SpeechSDKDemo", "unexpected " + ex.getMessage());
assert(false);
}
}
Что у меня есть в журнале, так это:
E/ples.quickstar: No implementation found for void com.microsoft.cognitiveservices.speech.internal.carbon_javaJNI.swig_module_init() (tried Java_com_microsoft_cognitiveservices_speech_internal_carbon_1javaJNI_swig_1module_1init and Java_com_microsoft_cognitiveservices_speech_internal_carbon_1javaJNI_swig_1module_1init__)
D/AndroidRuntime: Shutting down VM
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.microsoft.cognitiveservices.speech.samples.quickstart, PID: 4106
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
at android.view.View.performClick(View.java:6597)
at...
Кто-нибудь может мне помочь?




Я искал, совместим ли Microsoft Speech API с Java, и ответ - нет. Это также кажется немного очевидным, потому что Microsoft = C++/C#, который не имеет ничего общего с Java. Кроме того, в своем посте вы упомянули быстрый старт. При этом используется пакет SDK для распознавания речи Cognitive Services, а не Microsoft SAPI.
Однако существуют собственные библиотеки Java, поддерживающие преобразование текста в речь. Вот сообщение, относящийся к механизмам преобразования текста в речь. Вот еще Информация об этом. Также доступны библиотеки для Android:
Я бы предложил альтернативу. Почему бы не попробовать вместо этого использовать Windows tts, отправив текст в команду powershell, которую можно выполнить из java-кода:
String[] command = {"powershell.exe", "Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak('" + message +"');"};
try {
ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();
System.out.format("Process exit code: %d", process.waitFor());
ProcessInputOutput.readStdnOutput(process);
}
catch (Exception e){
e.printStackTrace();
}
Вы гуглили свой вопрос, прежде чем публиковать его здесь? Потому что я нашел много информации, связанной с Microsoft Speech API и Java. Ответ — нет, реализовать Microsoft SAPI на Java невозможно. Я разовью свой ответ.