#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <sstream>
#include <regex>
#include <algorithm>
class VoicePlayer {
public:
std::map<std::string, std::string> digitMap = {
{"0", "digital_zero.pcm"},
{"1", "digital_one.pcm"},
{"2", "digital_two.pcm"},
{"3", "digital_three.pcm"},
{"4", "digital_four.pcm"},
{"5", "digital_five.pcm"},
{"6", "digital_six.pcm"},
{"7", "digital_seven.pcm"},
{"8", "digital_eight.pcm"},
{"9", "digital_nine.pcm"},
{"10", "digital_ten.pcm"},
{"100", "digital_hundred.pcm"},
{".1", "digital_point_one.pcm"},
{".2", "digital_point_two.pcm"},
{".3", "digital_point_three.pcm"},
{".4", "digital_point_four.pcm"},
{".5", "digital_point_five.pcm"},
{".6", "digital_point_six.pcm"},
{".7", "digital_point_seven.pcm"},
{".8", "digital_point_eight.pcm"},
{".9", "digital_point_nine.pcm"}
};
std::map<std::string, std::string> textMap = {
{"今天", "today.pcm"},
{"温度", "temp.pcm"},
{"湿度", "humi.pcm"},
{"是", "is.pcm"},
{"的", "de.pcm"},
{"温度是", "tempis.pcm"},
{"度", "degree.pcm"},
{"百分之", "percent.pcm"},
};
void playText(std::string& text) {
std::vector<std::string> voiceFiles;
size_t pos = 0;
while (pos < text.length()) {
bool matched = false;
std::regex reg("\\d+\\.?\\d*");
std::smatch match;
std::string subText = text.substr(pos);
if (std::regex_search(subText, match, reg)) {
std::string number = match.str();
if (number.find('.') != std::string::npos) {
size_t dotPos = number.find('.');
std::string integerPart = number.substr(0, dotPos);
std::string fractionalPart = number.substr(dotPos);
addDigitToVoiceFiles(integerPart, voiceFiles);
addDigitToVoiceFiles(fractionalPart, voiceFiles);
} else {
addDigitToVoiceFiles(number, voiceFiles);
}
pos += match.position() + match.length();
matched = true;
}
if (!matched) {
std::cout << "Trying to match text from position " << pos << ": " << text.substr(pos) << std::endl;
for (auto it = textMap.rbegin(); it != textMap.rend(); ++it) {
if (text.substr(pos).find(it->first) == 0) {
std::cout << "Matched: " << it->first << " => " << it->second << std::endl;
voiceFiles.push_back(it->second);
pos += it->first.size();
matched = true;
break;
}
}
}
if (!matched) {
pos++;
}
}
printJson(voiceFiles);
}
private:
void addDigitToVoiceFiles(const std::string& number, std::vector<std::string>& voiceFiles) {
if (number.find('.') == std::string::npos) {
int num = std::stoi(number);
if (num >= 10) {
int tens = num / 10;
if (tens > 0) {
voiceFiles.push_back(digitMap[std::to_string(tens)]);
voiceFiles.push_back(digitMap["10"]);
}
int ones = num % 10;
if (ones > 0) {
voiceFiles.push_back(digitMap[std::to_string(ones)]);
}
} else {
voiceFiles.push_back(digitMap[number]);
}
} else {
size_t dotPos = number.find('.');
std::string integerPart = number.substr(0, dotPos);
std::string fractionalPart = number.substr(dotPos);
addDigitToVoiceFiles(integerPart, voiceFiles);
voiceFiles.push_back(digitMap["."]);
for (size_t i = 1; i < fractionalPart.size(); ++i) {
std::string fractionalDigit(1, fractionalPart[i]);
voiceFiles.push_back(digitMap[fractionalDigit]);
}
}
}
void printJson(const std::vector<std::string>& voiceFiles) {
std::cout << "{\n \"voice\": [\n";
for (size_t i = 0; i < voiceFiles.size(); ++i) {
std::cout << " \"" << voiceFiles[i] << "\"";
if (i != voiceFiles.size() - 1) {
std::cout << ",";
}
std::cout << "\n";
}
std::cout << " ]\n}\n";
}
};
int main() {
VoicePlayer player;
std::string text = "今天的温度是25.5度湿度是百分之60";
player.playText(text);
return 0;
}