[JAVA] Bitten Sie Sota, die Werte in der Datenbank zurückzusprechen

Hallo! Mein Name ist @ saike1119 und ich bin Ingenieurpraktikum bei Ozvision Co., Ltd.. Ich bin normalerweise ein Student und ich bin warmherzig in einem Labor, das stark in KI (künstliche Intelligenz) und Verarbeitung natürlicher Sprache ist. Dort entwickeln wir eine Anwendung mit Sota als Abschlussforschung. Darüber hinaus sind KI, Roboter und intelligente Lautsprecher heutzutage sehr beliebt. Daher möchte ich die Implementierung einer einfachen Verarbeitung mit Sota beschreiben. Der diesmal zu implementierende Prozess besteht darin, dass Sota die Datenbank nach dem gesprochenen Inhalt durchsucht und den zugehörigen Inhalt zurückgibt. Das Bild ist hier. スクリーンショット 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

Implementieren Sie die Sota-Seite

Sota kann entweder mit VStone Magic oder Java entwickelt werden, aber dieses Mal werden wir es in Java implementieren.

Die von Sota zu implementierenden Java-Dateien lauten wie folgt.

SearchDbSota.java


//Ändern Sie das Paket searchdbsota in einen beliebigen Paketnamen
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";
	//Geben Sie die Ausführungsdatei an
	static final String getText_url = "Geben Sie die Ausführungsdatei an"; //Beispiel:http://192.168.11.10/SearchFruitsSotaSample/SearchFruits.php

	//VSMD und Kommunikationssocket / Speicherzugriffsklasse
	private static CRobotMem mem = new CRobotMem();
	private static CSotaMotion motion = new CSotaMotion(mem);
	//Bewegungssteuerungsklasse für Sota
	private static SpeechRecog recog = new SpeechRecog(motion);
	private static CRobotPose pose;

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

		//VSMD und Kommunikationssocket / Speicherzugriffsklasse
		CRobotMem mem = new CRobotMem();
		//Bewegungssteuerungsklasse für Sota
		CSotaMotion motion = new CSotaMotion(mem);

		if (mem.Connect()) {
			//Initialisieren Sie VSMD gemäß den Sota-Spezifikationen
			motion.InitRobot_Sota();

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

			//Schalten Sie das Drehmoment am Servomotor in der aktuellen Position ein
			CRobotUtil.Log(TAG, "Servo On");
			motion.ServoOn();

			//Initialisieren Sie alle Achsen
			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
			);
			//Schalten Sie die LED ein (linkes Auge: rot, rechtes Auge: rot, Mund: max, Netzschalter: rot)
			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("Über welche Früchte möchten Sie wissen? Wenn Sie aufhören, sagen Sie Ende."));
			CRobotUtil.Log(TAG, "Mic Recording...");
			String fruitName = recog.getResponse(15000, 3);
			CRobotUtil.Log(TAG, fruitName);

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

	/**
	 *Verarbeitung, um auf den Webserver zuzugreifen und den Text per GET abzurufen
	 *
	 * @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(); //Anfrage per GET an URL senden

			//HTTP-Antwortcode
			final int status = con.getResponseCode();
			if (status == HttpURLConnection.HTTP_OK) {
				//Erfolgreiche Kommunikation
				//Holen Sie sich den Text
				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;
				//Lesen Sie den Text Zeile für Zeile
				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) {
				//Trennen
				con.disconnect();
			}
		}
		// System.out.println("result=" + result.toString());

		return result.toString();
	}

	/**
	 *Suchen Sie nach Werten aus der Datenbank
	 *
	 * @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;
	}

	/**
	 *Codieren Sie den empfangenen String
	 *
	 * @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;
	}

	/**
	 *Azatoi Pose
	 */
	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);
	}
}

Platzieren Sie die obige Java-Datei in der Hierarchie, die Sie ausführen möchten. Beispiel: SearchFruitsSotaSample / bin / jp / vstone / searchdbsota / SearchDbSota.java

Bereiten Sie die Serverseite vor

Bereiten Sie auf der Serverseite eine einfache LAMP-Umgebung vor, auf die von Sota aus zugegriffen werden kann.

Die auf der Serverseite zu implementierenden PHP-Dateien lauten wie folgt.

db_def.php


<?php
//unten$Legen Sie einen anderen Wert als dbname fest
$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 .= 'Ist' . $row["description"];
    }
    $result->free();
} else {
    $speech_txt .= 'Wurde nicht gefunden.';
}

$mysqli->close();

echo $speech_txt;

Platzieren Sie die obige PHP-Datei in einer ausführbaren Hierarchie auf dem Server. Beispiel: /var/www/html/SearchFruitsSotaSample/db_def.php Beispiel: /var/www/html/SearchFruitsSotaSample/SearchFruit.php

Bereiten Sie eine DB vor

Dieses Mal werden wir nach dem Wert in der Test-DB-Tabelle suchen. In diesem Fall ist es MySQL. Melden Sie sich bei MySQL an und führen Sie die folgende SQL-Anweisung aus.

  1. Erstellen Sie eine Früchte_Daten-Datenbank
create database fruits_data;
  1. Verwenden Sie die Datenbank obst_data
use fruits_data;
  1. Erstellen Sie eine Obsttabelle
create table fruits (id int not null primary key auto_increment, fruit varchar(20), description varchar(255));
  1. Fügen Sie der Obsttabelle Werte hinzu
insert into fruits (fruit, description) values ('Apfel', 'Ein Laubbaum der Rosenfamilie. Im Frühling blühen weiße oder hellrote Blüten. Die Früchte sind kugelförmig und süß und sauer. Es gibt viele Sorten, Anfang Ende Juni und Ende Anfang Dezember. Es gibt auch Farben wie Rot, Gelb und Hellgrün.'), ('Mandarine', 'Mandarine科の常緑低木または高木。六月ごろ白い花が咲き、冬に黄色で丸い果実を結ぶ。食用。品種が多い。'), ('Traube', 'Traube科の落葉植物。茎がつるになって他の物にからみついて伸び、夏、球状の実が房のような形につく。実は食用、またTraube酒の原料。');

Versuchen Sie, Sota zu bewegen

Sobald Sie das oben genannte getan haben, lassen Sie uns Sota tatsächlich bewegen! Senden Sie den auf der Sota-Seite implementierten Inhalt in send.xml und melden Sie sich bei Erfolg mit ssh bei Sota an. (Sota spricht den Hostnamen von send.xml und ssh) Führen Sie dann die SearchDbSota.java-Datei aus, die Sie gerade mit `` `. / Java_run.sh``` erstellt haben!

Ergebnis

Sota-Demo-Video

Es ist fertig! Damit durchsucht Sota die Datenbank nach Ihren Aussagen und spricht zurück.

abschließend

Wie war das? Sota ist ein ausgezeichneter humanoider Roboter, der in verschiedenen Szenen eingesetzt wird und von vielen Unternehmen eingeführt wird. Hier verwenden wir nur Sprachkomposition, Spracherkennung und Pause, aber es gibt endlose Möglichkeiten, indem wir die Bilderkennung integrieren und mit verschiedenen APIs verknüpfen! Trotzdem gibt es nicht viele Artikel über Sota, es ist also ein einfacher Prozess, aber ich hoffe, dass dieser Inhalt für diejenigen hilfreich ist, die ihn gelesen haben! Wenn Sie Fragen oder Bedenken haben, hinterlassen Sie bitte einen Kommentar. Noshi

Recommended Posts

Bitten Sie Sota, die Werte in der Datenbank zurückzusprechen
Wechseln Sie dynamisch die Datenbank, zu der eine Verbindung hergestellt werden soll
So löschen Sie die Datenbank beim Neuerstellen der App
[Java / PostgreSQL] Verbinden Sie die WEB-Anwendung mit der Datenbank
3. Erstellen Sie eine Datenbank für den Zugriff über das Webmodul
Beispielcode zum Abrufen der Werte der wichtigsten SQL-Typen in Java + Oracle Database 12c