[JAVA] Demandez à Sota de revenir sur les valeurs de la base de données

salut! Je m'appelle @ saike1119 et je suis ingénieur stagiaire chez Ozvision Co., Ltd.. Je suis généralement étudiant et je suis au chaud dans un laboratoire qui est fort en IA (intelligence artificielle) et en traitement du langage naturel. Là, nous développons une application utilisant Sota comme recherche de fin d'études. En plus de cela, l'intelligence artificielle, les robots et les haut-parleurs intelligents sont populaires de nos jours, je voudrais donc décrire la mise en œuvre d'un traitement simple à l'aide de Sota. Le processus à mettre en œuvre cette fois consiste à demander à Sota de rechercher dans la base de données le contenu parlé et de renvoyer le contenu associé. L'image est ici. スクリーンショット 2017-12-20 4.44.48.png

http://www.vstone.co.jp/sotamanual/index.php?Java%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B

Mettre en œuvre le côté Sota

Sota peut être développé avec VStone Magic ou Java, mais cette fois, nous l'implémenterons en Java.

Les fichiers Java à implémenter par Sota sont les suivants.

SearchDbSota.java


//Remplacez le package searchdbsota par n'importe quel nom de package
package jp.vstone.searchdbsota;

import java.awt.Color;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import jp.vstone.RobotLib.CPlayWave;
import jp.vstone.RobotLib.CRobotMem;
import jp.vstone.RobotLib.CRobotPose;
import jp.vstone.RobotLib.CRobotUtil;
import jp.vstone.RobotLib.CSotaMotion;
import jp.vstone.sotatalk.SpeechRecog;
import jp.vstone.sotatalk.TextToSpeechSota;

public class SearchDbSota {

	static final String TAG = "SearchDbSota";
	//Spécifiez le fichier d'exécution
	static final String getText_url = "Spécifiez le fichier d'exécution"; //Exemple:http://192.168.11.10/SearchFruitsSotaSample/SearchFruits.php

	//VSMD et prise de communication / classe d'accès mémoire
	private static CRobotMem mem = new CRobotMem();
	private static CSotaMotion motion = new CSotaMotion(mem);
	//Classe de contrôle de mouvement pour Sota
	private static SpeechRecog recog = new SpeechRecog(motion);
	private static CRobotPose pose;

	public static void main(String[] args) {
		CRobotUtil.Log(TAG, "Start " + TAG);

		//VSMD et prise de communication / classe d'accès mémoire
		CRobotMem mem = new CRobotMem();
		//Classe de contrôle de mouvement pour Sota
		CSotaMotion motion = new CSotaMotion(mem);

		if (mem.Connect()) {
			//Initialiser VSMD aux spécifications Sota
			motion.InitRobot_Sota();

			CRobotUtil.Log(TAG, "Rev. " + mem.FirmwareRev.get());

			//Activer le couple sur le servomoteur à la position actuelle
			CRobotUtil.Log(TAG, "Servo On");
			motion.ServoOn();

			//Initialiser tous les axes
			pose = new CRobotPose();
			pose.SetPose(new Byte[] { 1, 2, 3, 4, 5, 6, 7, 8 } // id
					, new Short[] { 0, -900, 0, 900, 0, 0, 0, 0 } // target pos
			);
			//Allumez la LED (œil gauche: rouge, œil droit: rouge, bouche: Max, bouton d'alimentation: rouge)
			pose.setLED_Sota(Color.ORANGE, Color.ORANGE, 255, Color.ORANGE);

			motion.play(pose, 100);
			CRobotUtil.wait(100);
		}

		while (true) {
			pose();
			CPlayWave.PlayWave_wait(TextToSpeechSota.getTTSFile("Quel fruit voulez-vous connaître? Lorsque vous arrêtez, dites fin."));
			CRobotUtil.Log(TAG, "Mic Recording...");
			String fruitName = recog.getResponse(15000, 3);
			CRobotUtil.Log(TAG, fruitName);

			if (fruitName.contains("Fin")) {
				CRobotUtil.Log(TAG, "finish...");
				break;
			}
			String speech_text = searchFruit(fruitName);
			CPlayWave.PlayWave_wait(TextToSpeechSota.getTTSFile(speech_text));
		}
	}

	/**
	 *Traitement pour accéder au serveur Web et obtenir le texte par GET
	 *
	 * @param strGetUrl
	 * @return
	 */
	public static String getStringByCallGET(String strGetUrl) {

		HttpURLConnection con = null;
		StringBuffer result = new StringBuffer();

		try {

			URL url = new URL(strGetUrl);

			con = (HttpURLConnection) url.openConnection();

			con.setRequestMethod("GET");
			con.connect(); //Envoyer la demande par GET à l'URL

			//Code de réponse HTTP
			final int status = con.getResponseCode();
			if (status == HttpURLConnection.HTTP_OK) {
				//Communication réussie
				//Obtenez le texte
				final InputStream in = con.getInputStream();
				String encoding = con.getContentEncoding();
				if (null == encoding) {
					encoding = "UTF-8";
				}
				final InputStreamReader inReader = new InputStreamReader(in, encoding);
				final BufferedReader bufReader = new BufferedReader(inReader);
				String line = null;
				//Lire le texte ligne par ligne
				while ((line = bufReader.readLine()) != null) {
					result.append(line);
				}
				bufReader.close();
				inReader.close();
				in.close();
			} else {
				// System.out.println(status);
			}

		} catch (Exception e1) {
			e1.printStackTrace();
		} finally {
			if (con != null) {
				//Déconnecter
				con.disconnect();
			}
		}
		// System.out.println("result=" + result.toString());

		return result.toString();
	}

	/**
	 *Rechercher des valeurs dans DB
	 *
	 * @param fruit
	 * @return
	 */
	public static String searchFruit(String fruit) {
		String param = "?";
		String speechSota = "";
		String error = "error";

		if (fruit != null && fruit.length() > 0) {
			param += "fruitsName=" + encodeWord(fruit);
		}
		speechSota = getStringByCallGET(getText_url + param);
		if (speechSota != null && speechSota.length() > 0) {
			return speechSota;
		}
		return error;
	}

	/**
	 *Encoder la chaîne reçue
	 *
	 * @param word
	 * @return
	 */
	public static String encodeWord(String word) {
		if (word != null) {
			try {
				word = URLEncoder.encode(word, "utf-8");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return word;
	}

	/**
	 *Pose de l'azatoi
	 */
	public static void pose() {
		pose.SetPose(new Byte[] { 1, 2, 3, 4, 5 }, new Short[] { 0, 180, -850, -180, 850 });
		motion.play(pose, 1000);
		CRobotUtil.wait(100);
	}
}

Placez le fichier Java ci-dessus dans la hiérarchie que vous souhaitez exécuter. Exemple: SearchFruitsSotaSample / bin / jp / vstone / searchdbsota / SearchDbSota.java

Préparez le côté serveur

Côté serveur, préparez un environnement LAMP simple accessible depuis Sota.

Les fichiers PHP à implémenter côté serveur sont les suivants.

db_def.php


<?php
//au dessous de$Définissez une valeur autre que dbname
$dbhost = '127.0.0.1';
$dbuser = 'root';
$dbpasswd = 'root';
$dbname = 'fruits_data';
?>

SearchFruit.php


<?php

include_once('db_def.php');

$speech_txt = "";
$fruitsName = "";

$mysqli = new mysqli($dbhost, $dbuser, $dbpasswd, $dbname);

if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit();
}
if (isset($_REQUEST['fruitsName'])) {
    $fruitsName = $_REQUEST['fruitsName'];
    $fruitsName = mysqli_escape_string($mysqli, $fruitsName);
    $speech_txt = $fruitsName;
}

$query = "select * from fruits WHERE fruit = '{$fruitsName}';";
$result = $mysqli->query($query);
if ($result->num_rows >= 1) {
    while ($row = $result->fetch_assoc()) {
        $speech_txt .= 'Est' . $row["description"];
    }
    $result->free();
} else {
    $speech_txt .= 'N'a pas été trouvé.';
}

$mysqli->close();

echo $speech_txt;

Placez le fichier PHP ci-dessus dans une hiérarchie exécutable au sein du serveur. Exemple: /var/www/html/SearchFruitsSotaSample/db_def.php Exemple: /var/www/html/SearchFruitsSotaSample/SearchFruit.php

Préparer un DB

Cette fois, nous chercherons la valeur dans la table de base de données de test. Dans ce cas, c'est mysql. Connectez-vous à mysql et exécutez l'instruction sql suivante.

  1. Créez une base de données fruits_data
create database fruits_data;
  1. Utilisez la base de données fruits_data
use fruits_data;
  1. Créez une table de fruits
create table fruits (id int not null primary key auto_increment, fruit varchar(20), description varchar(255));
  1. Ajouter des valeurs au tableau des fruits
insert into fruits (fruit, description) values ('pomme', 'Un arbre à feuilles caduques de la famille des roses. Au printemps, des fleurs blanches ou rouge clair fleurissent. Les fruits sont sphériques et aigre-doux. Il existe de nombreuses variétés, début juin et fin décembre. Il existe également des couleurs telles que le rouge, le jaune et le vert clair.'), ('Mandarine', 'Mandarine科の常緑低木または高木。六月ごろ白い花が咲き、冬に黄色で丸い果実を結ぶ。食用。品種が多い。'), ('Grain de raisin', 'Grain de raisin科の落葉植物。茎がつるになって他の物にからみついて伸び、夏、球状の実が房のような形につく。実は食用、またGrain de raisin酒の原料。');

Essayez de déplacer Sota

Une fois que vous avez fait ce qui précède, déplaçons Sota! Envoyez le contenu implémenté côté Sota dans send.xml, et en cas de succès, connectez-vous à Sota avec ssh. (Sota prononce le nom d'hôte de send.xml et ssh) Ensuite, exécutez le fichier SearchDbSota.java que vous venez de créer avec ``. / Java_run.sh ''!

résultat

Vidéo de démonstration Sota

C'est fait! Avec cela, Sota recherchera dans la base de données ce que vous avez dit et répondra.

en conclusion

Comment était-ce? Sota est un excellent robot humanoïde qui est utilisé dans diverses scènes et est en fait introduit par de nombreuses entreprises. Ici, nous n'utilisons que la composition vocale, la reconnaissance vocale et la pause, mais les possibilités sont infinies en intégrant la reconnaissance d'image et en créant des liens avec diverses API! Même ainsi, il n'y a pas beaucoup d'articles sur Sota, donc c'est un processus simple, mais j'espère que ce contenu sera utile à ceux qui l'ont lu! Aussi, si vous avez des questions ou des préoccupations, veuillez laisser un commentaire. Noshi

Recommended Posts

Demandez à Sota de revenir sur les valeurs de la base de données
Basculer dynamiquement la base de données à laquelle se connecter
Comment effacer la base de données lors de la recréation de l'application
[Java / PostgreSQL] Connectez l'application WEB à la base de données
3. Créez une base de données à laquelle accéder à partir du module Web
Exemple de code pour obtenir les valeurs des principaux types SQL dans Java + Oracle Database 12c