Monday, June 25, 2007

The Java Speech API: A Primer on Speech Applications


You read about them in science fiction, you see them in the movies, and you've have dreamed of using them—machines that talk to you, listen to you and take your commands. Speech-based applications can make life more efficient, faster, and maybe add a little pep to the monotony of the everyday grind. The essential component in of these machines are based on speech technology.

Even though computer-based speech technology was first created in the latter half of the 1950s, it made little progress due to the cost and availability of equipment. Speech technology today has become more affordable and is being widely deployed in fields like security systems, medical systems, voice response systems, dictation systems, and in assistive technology for the disabled.

Most of the early work and applications using speech were done using C, C++, and other native languages. Now that speech applications need to be integrated with Web-based applications, Java has become the language of choice in which to build them.

The Java Speech API
The Java Speech API outlines standards and guidelines as to how speech applications can be built to inter-operate with each other and on all Java compatible platforms. As such, it provides the API and functionality to build the base for speech applications.

Features

* Converts speech to text
* Converts text and delivers them in various formats of speech
* Supports events based on the Java event queue
* Easy to implement API interoperates with multiple Java-based applications like applets and Swing applications
* Interacts seamlessly with the AWT event queue
* Supports annotations using JSML to improve pronunciation and naturalness in speech
* Supports grammar definitions using JSGF
* Ability to adapt to the language of the speaker

Hello World
To show you how the speech API works, this article walks you through a simple program. To run the sample program, you will need a Java implementation that supports the Java Speech API. This example uses CloudGarden's TalkingJava SDK (although you could also use FreeTTS; See 'Running the demo applications' to use FreeTTS). You can download a 30-day trial of the implementation here. Use the setup to install the application.

There are two files you need for developing your speech applications—cgjsapi.jar and cgjsapi.dll. Before starting work with the samples, make sure that the cgjsapi.dll file is available in your PATH and that the cgjsapi.jar file is available in your CLASSPATH:


TellTime.java:
This simple program demonstrates the working of the Speech API
by reading out the system time.

package speechdemo;

import javax.speech.*;
import javax.speech.synthesis.*;
import java.util.*;

public class TellTime {

public static void main(String[] args) {
try {
Calendar calendar = new GregorianCalendar();
String sayTime = "Its " +
calendar.get(Calendar.HOUR) + " " +
calendar.get(Calendar.MINUTE) + " " +
(calendar.get(Calendar.AM_PM)== 0 ? "AM" : "PM");

Synthesizer synth = Central.createSynthesizer(null);
synth.allocate();
synth.resume();

synth.speakPlainText(sayTime,null);

synth.waitEngineState(Synthesizer.QUEUE_EMPTY);
synth.deallocate();

} catch (Exception e) {
e.printStackTrace();
}
}
}

Friday, June 1, 2007

Mobile Java 3D Tips, Tricks & Code

MascotWorldConnected: adding interaction between two phones via Bluetooth

This example is based on a previous example entitled "MascotWorld" and adds player interaction via Bluetooth™.

Download MascotWorldConnected example>>

To run this application, you need two Bluetooth-enabled mobile phones (e.g. Sony Ericsson K750) and you connect them at the start of application using Bluetooth. Once communication is established, the 3D world is started and each user sees two cars: his own and the opponent's. Each user can drive his own car or navigate through the 3D world. You can switch between these using the phone's soft keys.

The Bluetooth part of the application consists of server or a client. The user chooses between them.

While you are moving your own car, the updated position and rotation coordinates are sent to other party, so your car can be displayed in the proper location on your opponents screen.

The User can control movement of the car, but this is limited. When the user is moving the car, the camera follows the same way. The car can move:

* arrow left/right: turn left/right
* arrow up/down: move forward/backward
* keys 4/6: move left/right
* fire: centers camera on top of car

In a commercial application, it is possible to speed up the Bluetooth connection setup by hardcoding the URL of the other phones. This could be done by caching the URL once connected, so it will connect much faster the next time.

Mobile Java 3D Tips, Tricks & Code

JSR 184: 3D co-ordinates and orientation overview



This article gives a brief introduction to the 3D co-ordinate system and orientation in the 3D world using the JSR 184 API.

Download MIDlet and source code>>


Figure 1.

The co-ordinate system in 3D space is shown in the image to the left (Figure 1). This is called world co-ordinates and all objects in the 3D scene can be moved around and rotated in this co-ordinate system.

This co-ordinate system is the same for all objects in the scene and it will never change. The default view for the user is down the negative z-axis.

In addition to the world co-ordinates, each object also has a local co-ordinate system and the figures can also be moved within the local co-ordinate system (Figure 2).
The big difference between the co-ordinate systems is that the local co-ordinate system's orientation may change; the local co-ordinate system is actually rotated with the figure if the figure is rotated (Figure 3).

Figure 2.

Figure 3.

This can sometimes be confusing. For example, if the figure is first rotated 90 degrees on the z-axis and then translated on the y-axis in the local coordinate system the visible effect will be a translation on the x-axis in the world.

When rotating an object, the result may be different depending on the method that is used for the rotation. The mesh can be translated and rotated around its local center or it can be translated and rotated around the world center. (Figure 4).

Translation and rotation of an object can be made on all Transformable objects in JSR 184 and that includes: Mesh, Light, camera, Group and Sprite3D. Translation and rotation can also be set to a Transformable using the Transform class.

Figure 4.

In JSR 184 it is also possible to add a mesh to a group. For example if a group is added to the world and then a mesh is added to the group, the translation of the node will be in the co-ordinate system of the parent.
The basic functions are:
Transformable:
- postRotate(float angle, float ax, float ay, float az)
- translate(float tx, float ty, float tz)
Transform:
- postRotate(float angle, float ax, float ay, float az)
- postTranslate(float tx, float ty, float tz)
mesh.postRotate(3.0f, 1.0f, 0.0f, 0.0f);
When rotation is made directly on the transformable object the rotation will be made around the origo of the local co-ordinate system.
transform.postRotate(3.0f, 1.0f, 0.0f, 0.0f);
mesh.setTransform(transform);
When the rotation is made using the transform class the object will rotate around its center.
mesh.translate(0.0f, 0.0f, 5.0f);
When the object is moved using methods in the transformable class the object is moved in the co-ordinate system of the parent node.
transform.postTranslate(0.0f, 0.0f, 5.0f);
mesh.setTransform(transform)
When the object is moved using the transform class the object is moved in the local co-ordinate system.

To get a visual effect of the different methods download the source code and example MIDlet here >>