package com.iflytek.view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JSlider;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.iflytek.cloud.speech.RecognizerListener;
import com.iflytek.cloud.speech.RecognizerResult;
import com.iflytek.cloud.speech.ResourceUtil;
import com.iflytek.cloud.speech.SpeechConstant;
import com.iflytek.cloud.speech.SpeechError;
import com.iflytek.cloud.speech.SpeechEvent;
import com.iflytek.cloud.speech.SpeechRecognizer;
import com.iflytek.util.DebugLog;
import com.iflytek.util.DrawableUtils;
public class IatSpeechView extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private JLabel labelWav;
private JButton jbtnRecognizer;
private JButton jbtnCancel;
private JButton jbtnStop;
private JButton jbtnHome;
private JButton jbtnSet;
JTextArea resultArea;
// 语音听写对象
private SpeechRecognizer mIat;
private JPopupMenu mSettingMenu = new JPopupMenu( "设置" ); //主菜单
private Map<String, String> mParamMap = new HashMap<String, String>();
private String mSavePath = "./iat_test.pcm";
private static final String VAL_TRUE = "1";
private static class DefaultValue{
public static final String ENG_TYPE = SpeechConstant.TYPE_CLOUD;
public static final String SPEECH_TIMEOUT = "60000";
public static final String NET_TIMEOUT = "20000";
public static final String LANGUAGE = "zh_cn";
public static final String ACCENT = "mandarin";
public static final String DOMAIN = "iat";
public static final String VAD_BOS = "5000";
public static final String VAD_EOS = "1800";
public static final String RATE = "16000";
public static final String NBEST = "1";
public static final String WBEST = "1";
public static final String PTT = "1";
public static final String RESULT_TYPE = "json";
public static final String SAVE = "0";
}
private static final String DEF_FONT_NAME = "宋体";
private static final int DEF_FONT_STYLE = Font.BOLD;
private static final int DEF_FONT_SIZE = 30;
private static final int TEXT_COUNT = 100;
/**
* 初始化按钮对象. 设置按钮背景图片、大小、鼠标点击事件 初始化文本框,设置字体类型、大小
*/
public IatSpeechView() {
jbtnRecognizer = addButton("res/button.png", "开始听写", 0, 320, 330, -1,
"res/button");
ImageIcon img = new ImageIcon("res/mic_01.png");
labelWav = new JLabel(img);
labelWav.setBounds(0, 0, img.getIconWidth(),
img.getIconHeight() * 4 / 5);
jbtnRecognizer.add(labelWav, BorderLayout.WEST);
jbtnStop = addButton("res/button.png", "停止", 330, 320, 135, -1,
"res/button");
jbtnCancel = addButton("res/button.png", "取消", 465, 320, 135, -1,
"res/button");
jbtnHome = addButton("res/home.png", "", 20, 20, 1, 1, "res/home");
jbtnSet = addButton( "res/setting.png", "", 534, 20, 1, 1, "res/setting" );
resultArea = new JTextArea("");
resultArea.setBounds(30, 110, 540, 400);
resultArea.setOpaque(false);
resultArea.setEditable(false);
resultArea.setLineWrap(true);
resultArea.setForeground(Color.BLACK);
Font font = new Font(DEF_FONT_NAME, DEF_FONT_STYLE, DEF_FONT_SIZE);
resultArea.setFont(font);
setOpaque(false);
setLayout(null);
add(jbtnRecognizer);
add(jbtnStop);
add(jbtnCancel);
add(resultArea);
add(jbtnHome);
add(jbtnSet);
// 初始化听写对象
mIat=SpeechRecognizer.createRecognizer();
jbtnRecognizer.addActionListener(this);
jbtnHome.addActionListener(this);
jbtnStop.addActionListener(this);
jbtnCancel.addActionListener(this);
jbtnSet.addActionListener( this );
initParamMap();
initMenu();
}
public JButton addButton(String imgName, String btnName, int x, int y,
int imgWidth, int imgHeight, String iconPath) {
JButton btn = null;
ImageIcon img = new ImageIcon(imgName);
btn = DrawableUtils.createImageButton(btnName, img, "center");
int width = imgWidth, height = imgHeight;
if (width == 1)
width = img.getIconWidth();
else if (width == -1)
width = img.getIconHeight() * 4 / 5;
if (height == 1)
height = img.getIconWidth();
else if (height == -1)
height = img.getIconHeight() * 4 / 5;
btn.setBounds(x, y, width, height);
DrawableUtils.setMouseListener(btn, iconPath);
return btn;
}
/***
* 监听器实现. 按钮按下动作实现
*/
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jbtnRecognizer) {
setting();
resultArea.setText( "" );
if (!mIat.isListening())
mIat.startListening(recognizerListener);
else
mIat.stopListening();
} else if (e.getSource() == jbtnStop) {
mIat.stopListening();
iatSpeechInitUI();
} else if (e.getSource() == jbtnCancel) {
mIat.cancel();
iatSpeechInitUI();
} else if (e.getSource() == jbtnHome) {
if (null != mIat ) {
mIat.cancel();
mIat.destroy();
}
JFrame frame = MainView.getFrame();
frame.getContentPane().remove(this);
JPanel panel = ((MainView) frame).getMainJpanel();
frame.getContentPane().add(panel);
frame.getContentPane().validate();
frame.getContentPane().repaint();
}else if( jbtnSet.equals(e.getSource()) ){
DebugLog.Log( "actionPerformed setting" );
mSettingMenu.show( this, this.jbtnSet.getX(), this.jbtnSet.getY()+50 );
}
}
/**
* 听写监听器
*/
private RecognizerListener recognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
DebugLog.Log( "onBeginOfSpeech enter" );
((JLabel) jbtnRecognizer.getComponent(0)).setText("听写中...");
jbtnRecognizer.setEnabled(false);
}
@Override
public void onEndOfSpeech() {
DebugLog.Log( "onEndOfSpeech enter" );
}
/**
* 获取听写结果. 获取RecognizerResult类型的识别结果,并对结果进行累加,显示到Area里
*/
@Override
public void onResult(RecognizerResult results, boolean islast) {
DebugLog.Log( "onResult enter" );
//如果要解析json结果,请考本项目示例的 com.iflytek.util.JsonParser类
// String text = JsonParser.parseIatResult(results.getResultString());
String text = results.getResultString();
resultArea.append(text);
text = resultArea.getText();
if( null!=text ){
int n = text.length() / TEXT_COUNT + 1;
int fontSize = Math.max( 10, DEF_FONT_SIZE - 2*n );
DebugLog.Log( "onResult new font size="+fontSize );
int style = n>1 ? Font.PLAIN : DEF_FONT_SIZE;
Font newFont = new Font( DEF_FONT_NAME, style, fontSize );
resultArea.setFont( newFont );
}
if( islast ){
iatSpeechInitUI();
}
}
@Override
public void onVolumeChanged(int volume) {
DebugLog.Log( "onVolumeChanged enter" );
if (volume == 0)
volume = 1;
else if (volume >= 6)
volume = 6;
labelWav.setIcon(new ImageIcon("res/mic_0" + volume + ".png"));
}
@Override
public void onError(SpeechError error) {
DebugLog.Log( "onError enter" );
if (null != error){
DebugLog.Log("onError Code:" + error.getErrorCode());
resultArea.setText( error.getErrorDescription(true) );
iatSpeechInitUI();
}
}
@Override
pub
java集成讯飞SDK
需积分: 0 73 浏览量
更新于2023-11-06
收藏 3.32MB ZIP 举报
在Java开发中,集成讯飞SDK可以为应用增添强大的语音合成功能,让程序能够将文本转化为自然流畅的语音输出。讯飞(iFlytek)是中国知名的语音技术提供商,其SDK提供了丰富的语音服务,包括语音合成(TTS)、语音识别、语义理解等。在这个项目中,我们将专注于"java集成讯飞SDK在线合成语音"这一主题。
集成讯飞SDK的准备工作包括下载适合Java平台的SDK包,通常包含JAR文件以及必要的文档。解压IflyVoice压缩包后,你会找到这些资源。确保你的开发环境支持Java,并且已经安装了JDK。
接着,我们需要在项目中引入讯飞的JAR包。这可以通过在项目的类路径中添加JAR文件或者使用Maven或Gradle等构建工具来管理依赖。例如,在Maven的pom.xml文件中,你可以添加如下依赖:
```xml
<dependency>
<groupId>com.iflytek.cloud</groupId>
<artifactId>sdk</artifactId>
<version>版本号</version>
</dependency>
```
请替换“版本号”为你实际下载的SDK版本。
然后,为了实现在线合成语音,我们需要创建一个讯飞的SpeechSynthesizer对象。初始化一个SpeechConfig,设置APPID、API_KEY和SECRET_KEY,这些信息可以在讯飞开发者平台上获取。示例代码如下:
```java
import com.iflytek.cloud.*;
SpeechConfig config = SpeechConfig.init(
"你的APPID",
"你的API_KEY",
"你的SECRET_KEY");
config.setSpeechSynthesizerListener(new MySynthesizerListener());
```
这里的`MySynthesizerListener`是自定义的语音合成监听器,用于接收合成事件的通知。
接下来,使用SpeechSynthesizer进行语音合成。以下是一个简单的例子:
```java
SpeechSynthesizer synthesizer = new SpeechSynthesizer(config);
String text = "你好,这是一个测试。";
synthesizer.speak(text, SpeechSynthesizer.TYPE_TEXT, null);
```
这段代码会将字符串`text`的内容合成并播放出来。`TYPE_TEXT`表示输入的是纯文本,如果文本包含特殊格式如SSML,可以使用`TYPE_SSML`。
在实际开发中,我们可能需要处理各种情况,比如网络异常、合成状态变化等。这时,`SpeechSynthesizerListener`的角色就显得尤为重要。你需要实现它的各个方法,比如`onEvent`来处理事件,`onCompleted`来获取合成结果,`onError`来捕获错误等。
除了基本的语音合成,讯飞SDK还提供了调整发音人、语速、音调、音量等功能,以及设置合成的音频格式和编码方式。例如:
```java
synthesizer.setParameter(SpeechConstant.VOICE_NAME, "小燕"); // 设置发音人
synthesizer.setParameter(SpeechConstant.SPEED, "50"); // 设置语速
synthesizer.setParameter(SpeechConstant.PITCH, "50"); // 设置音调
synthesizer.setParameter(SpeechConstant.VOLUME, "80"); // 设置音量
synthesizer.setParameter(SpeechConstant.AUDIO_FORMAT, "pcm"); // 设置音频格式
```
记得在应用退出时释放资源,避免内存泄漏:
```java
synthesizer.stopSpeaking();
synthesizer.release();
```
通过以上步骤,你就能在Java项目中成功集成讯飞SDK,实现在线语音合成了。这不仅为用户提供了更直观的交互体验,也为无障碍应用开发提供了便利。在后续的开发中,你还可以探索更多讯飞SDK的功能,如语音识别、语义理解,进一步提升你的应用程序的智能化水平。
Andy_Zheng.
- 粉丝: 184
- 资源: 5
最新资源
- Python实现HTML压缩功能
- 完结26章Java主流分布式解决方案多场景设计与实战
- ECSHOP模板堂最新2017仿E宠物模板 整合ECTouch微分销商城
- Pear Admin 是 一 款 开 箱 即 用 的 前 端 开 发 模 板,提供便捷快速的开发方式,延续 Admin 的设计规范
- 51单片机仿真摇号抽奖机源程序12864液晶显示仿真+程序
- 家庭用具检测21-YOLO(v5至v11)、COCO、Paligemma、TFRecord、VOC数据集合集.rar
- Intel-633246-eASIC-PB-006-N5X-Product-Brief .pdf
- Avue.js是基于现有的element-plus库进行的二次封装,简化一些繁琐的操作,核心理念为数据驱动视图,主要的组件库针对table表格和form表单场景,同时衍生出更多企业常用的组件,达到高复
- STM32F401,使用ST-link时候,不能识别,显示ST-LINK USB communication error
- 快速排序算法Python实现:详解分治法原理与高效排序步骤