uni-app中如何调用android的文字转语音

发布于 1周前 作者 sinazl 来自 Uni-App

uni-app中如何调用android的文字转语音

我试了一下,没写出来。有大神出来纠正么?

var context = plus.android.importClass("android.content.Context");
var text2speach = plus.android.importClass("android.speech.tts.TextToSpeech");
var listener = plus.android.implements("android.speech.tts.TextToSpeech.OnInitListener",{
"onInit":function(status){
alert(status);
if(status==text2speach.SUCCESS)
alert("succ");
}
});
var main = plus.android.runtimeMainActivity();
var tts = new text2speach(main.this,listener);
tts.speak("中文TTS", text2speach.QUEUE_FLUSH, null);

经过检查,tts 是空值


46 回复

由于Android系统tts不支持中文,使用科大讯飞文字转语音功能,使用如此功能时,需要保证manifest.json中permissions节点含有speech节点(如"Speech": {“description”: “管理语音识别插件” })。

var main = plus.android.runtimeMainActivity();
var SynthesizerPlayer = plus.android.importClass(‘com.iflytek.speech.SynthesizerPlayer’);
var play = SynthesizerPlayer.createSynthesizerPlayer(main,‘appid=5177d8fe’);
play.playText(‘水果’,null,null); iOS平台参考[http://ask.dcloud.net.cn/question/4175)(http://ask.dcloud.net.cn/question/4175)


var Sc=plus.android.importClass(‘com.iflytek.speech.SpeechConstant’); 得到结果为空,无法设置语音语调语速,而且这个发音最后一个字非常短促,体验不好! 有什么办法解决上面的问题?

太感谢了,刚开始看评论没有去尝试这个例子,结果找了整整一天还是使用这个例子成功了。

回复 W3Y:你好,请问manifest.json中的节点要怎么配,没太理解,想请你交我下吗,或者有案例吗,我的邮箱:841753635@qq.com,谢谢了

是不是限制一天500次啊?

为什么说的话,听不懂,还是说的太快了

在需要语音合成的地方加入如下Native.Js代码 var main = plus.android.runtimeMainActivity(); var SpeechUtility = plus.android.importClass(‘com.iflytek.cloud.SpeechUtility’); SpeechUtility.createUtility(main,“appid=你的appid”);
var SynthesizerPlayer = plus.android.importClass(‘com.iflytek.cloud.SpeechSynthesizer’); var play = SynthesizerPlayer.createSynthesizer(main, null); play.startSpeaking(‘中国是中国共产党打下来的,我就知道,这段话不会被查水表的’,null);
即可实现。注意 “你的appid” 在讯飞开放平台申请【http://www.xfyun.cn/】

请教,为什么可以直接导入com.iflytek.cloud.SpeechUtility类,是不是原生的Andorid就直接内置了com.iflytek.cloud.SpeechUtility类

这个必须联网才能用吗?

需要联网 是5+runtime 内置了这个类 android原生并没有

是不是限制一天500次啊?

需要引入什么额外的js吗?我引入了mui.js和plus.js,现在一直提示SpeechUtility 未定义

回复 海平线的那边: 同问,请问您解决了吗?

怎么监听播放是否结束?

暂停和停止 是怎么弄?

pauseSpeaking() resumeSpeaking() stopSpeaking()

//安卓
var main = plus.android.runtimeMainActivity();
var SpeechUtility = plus.android.importClass(‘com.iflytek.cloud.SpeechUtility’);
SpeechUtility.createUtility(main,“appid=599c0509”);
var SynthesizerPlayer = plus.android.importClass(‘com.iflytek.cloud.SpeechSynthesizer’);
var play = SynthesizerPlayer.createSynthesizer(main, null);
play.startSpeaking(‘全敏真帅啊!’,null);

第二第三句好像要不要都是一样的。怎么设置语速,音量

可以選擇發音人,語速,音量等 另外也可以暫停或停止甚至銷燬播放對象
var main = plus.android.runtimeMainActivity(); var SpeechUtility = plus.android.importClass(‘com.iflytek.cloud.SpeechUtility’); SpeechUtility.createUtility(main,‘appid=599c0509’); var SynthesizerPlayer = plus.android.importClass(‘com.iflytek.cloud.SpeechSynthesizer’); var play = SynthesizerPlayer.createSynthesizer(main, null);
//合成参数设置,详见《MSC Reference Manual》 SpeechSynthesizer 类 http://mscdoc.xfyun.cn/android/api/ play.setParameter(‘voice_name’,‘xiaoyu’); //发音人 xiaoyan,xiaoyu,vixy,vixq,vixf,vixl,vixx,vils(更多发音人可参见官方手冊) play.setParameter(‘speed’,‘90’); //语速,范围 0~100 play.setParameter(‘volume’,‘100’); //音量,范围 0~100 play.setParameter(‘pitch’,‘50’); //语调,范围 0~100 play.setParameter(‘engine_type’,‘cloud’); //云端模式 //play.setParameter(“tts_audio_path”,’./sdcard/iflytek.pcm’); //如果不需要保存合成音频,注释该行代码(仅支持保存为 pcm 和 wav 格式)
play.startSpeaking(‘许久后,我缓缓抬起头,却见吴大先生不知何时进屋了.嘿真是没感情的家伙!’,null);
window.setTimeout(function(){ console.log(play.isSpeaking()); play.pauseSpeaking(); console.log(play.isSpeaking()); play.stopSpeaking(); console.log(play.isSpeaking()); play.destroy(); play=null; },2000); //2秒之後執行 main=SpeechUtility=SynthesizerPlayer=null;

我的理解是除非使用原生代码实现边下载边播放的功能,否则用html5plus目前是无法支持的。
所以,当前比较好的方案是先下载保存到本地临时文件,然后再进行播放。
这样也可以比较好的同时兼容iOS和android,因为播放问题iOS和android可能不一样

这个问题好像并没有解决呀,作为示例我也没有测试成功

什么环境下没有测试成功,通过HBuilder真机调试使用科大讯飞api是可以通的。

我也没有测试通过,求解决

请问,问题解决了吗?

同学你出现什么问题了,通过HBuilder真机调试使用科大讯飞api是可以通的。

也遇到这个问题了,支持语言转文字,却不支持文字转语言的D厂。
有点让人不省心。

var tts = new text2speach(main.this,listener); 这一句有问题 但还 没想到解决办法 不知道兄弟 你解决了吗

var SpeechUtility = plus.android.importClass(‘com.iflytek.cloud.SpeechUtility’);能直接导入,是不是因为android系统里面内置了科大讯飞的语音?

打包时在manifest里选择语音识别,把科大讯飞打到包里就可以直接用

暂停和停止 监听播放 等都不知道 咋搞啊

科大讯飞,一天只支持播报500次吗?

怎么可以更换播放的发声?

可以使用百度tts请两天刚集成,还不错

我在真机上调试提示var SynthesizerPlayer = plus.android.importClass(‘com.iflytek.speech.SynthesizerPlayer’); 这行错误,好像是没有这个类。但在manifest.json中permissions只有语音输入的,没看见其他的。 请问怎么解决的,谢谢!

遇到同样问题

有兼容问题 安卓9以上就不支持了

请问安卓8以上是咋配置的啊?

com.iflytek.cloud.SpeechUtility 目前我引用这个类的时候也是提示未定义

同问,请问解决了吗

在uni-app中调用Android的文字转语音(Text-To-Speech, TTS)功能,可以通过使用uni-app的插件机制来实现。以下是一个基本的实现步骤和代码示例,演示如何通过调用原生Android TTS API来完成文字转语音的功能。

步骤一:创建Android原生插件

首先,你需要创建一个Android原生插件来处理TTS功能。在你的uni-app项目根目录下,创建一个nativeplugins文件夹,并在其中创建一个新的Android插件项目。

MyTTSModule.java

package com.example.mytts;

import android.speech.tts.TextToSpeech;
import android.util.Log;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;

public class MyTTSModule extends UniModule {

    private TextToSpeech tts;

    @Override
    public void onCreate() {
        super.onCreate();
        tts = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.SUCCESS) {
                    Log.d("TTS", "TTS initialized successfully");
                } else {
                    Log.e("TTS", "TTS initialization failed");
                }
            }
        });
    }

    @UniJSMethod(uiThread = false)
    public void speak(String text, UniJSCallback callback) {
        if (tts != null) {
            int result = tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);
            if (result == TextToSpeech.SUCCESS) {
                callback.invoke("Speaking: " + text);
            } else {
                callback.invoke("Failed to speak: " + text);
            }
        } else {
            callback.invoke("TTS not initialized");
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (tts != null) {
            tts.stop();
            tts.shutdown();
        }
    }
}

步骤二:配置插件

manifest.json文件中配置你的原生插件:

"nativePlugins": [
    {
        "class": "com.example.mytts.MyTTSModule",
        "methods": ["speak"]
    }
]

步骤三:在uni-app中使用插件

在你的uni-app页面中,你可以通过以下方式调用这个插件:

pages/index/index.vue

<template>
    <view>
        <button @click="speakText">Speak Text</button>
    </view>
</template>

<script>
export default {
    methods: {
        speakText() {
            const text = "Hello, this is a text to speech test.";
            uni.requireNativePlugin('MyTTSModule').speak(text, (res) => {
                console.log(res);
            });
        }
    }
}
</script>

这个示例展示了如何在uni-app中调用Android的文字转语音功能。请确保你正确配置了Android开发环境,并正确生成了插件的aar包,然后将其集成到你的uni-app项目中。

回到顶部