收到一个产品提的需求,在讯飞语音上需要有语音播报人声切换的功能,当时没多想,感觉不就是设置一个参数的问题么,就这么一句不就搞定了???
先试讯飞语音提供的免费的男声或声的切换:
mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
把上面的xiaoyan改成xiaofeng不就可以了么,结果。。。完全不行啊,仔细看文档,
![](https://img.haomeiwen.com/i8496923/08feb004e799d1b4.png)
好像是要加载发音人的本地资源文件,那就加载呗,代码如下
private StringgetResourcePath() {
StringBuffer tempBuffer =new StringBuffer();
tempBuffer.append(ResourceUtil.generateResourcePath(mContextWeakReference.get(), ResourceUtil.RESOURCE_TYPE.assets, "tts/common.jet"));
tempBuffer.append(";");
tempBuffer.append(ResourceUtil.generateResourcePath(mContextWeakReference.get(), ResourceUtil.RESOURCE_TYPE.assets, "tts/xiaofeng.jet"));
tempBuffer.append(";");
tempBuffer.append(ResourceUtil.generateResourcePath(mContextWeakReference.get(), ResourceUtil.RESOURCE_TYPE.assets, "tts/xiaoyan.jet"));
return tempBuffer.toString();
}
写完这些,一跑项目,这。。。。咋什么声音都没有了。。。。想打人。。。
为什么同时引入三个资源,会导致这种问题呢?本想深究下去,后来一想,算了,不折腾了,既然同时引入三个有问题,那我照着官方给的demo,一次引入两个总行了吧,大不了代码写的坑了点,每次设置,都设置一次资源文件。
然后改代码,改成
private StringgetTtsResource(String voiceName) {
StringBuffer tempBuffer =new StringBuffer();
tempBuffer.append(ResourceUtil.generateResourcePath(mContextWeakReference.get(), ResourceUtil.RESOURCE_TYPE.assets, "tts/common.jet"));
tempBuffer.append(";");
tempBuffer.append(ResourceUtil.generateResourcePath(mContextWeakReference.get(), ResourceUtil.RESOURCE_TYPE.assets, "tts/" + voiceName +".jet"));
return tempBuffer.toString();
}
//设置播报人声
public void setPeople(String person) {
// 设置发音人资源路径
mSpeechSynthesizer.setParameter(ResourceUtil.TTS_RES_PATH, getTtsResource(person));
// 发音人
mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, person);
}
这么一写,额,还真能切换播报人声,就这样吧,功能实现了就好。。。只能这样安慰自己了
网友评论