编辑代码

#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;

        // 1. 处理数字部分
        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
            pos += match.position() + match.length();
            matched = true;
        }

        // 2. 处理文本部分
        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++;
        }
    }

    // 打印生成的json格式
    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 {
            // 小于10的情况直接加入数字
            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]);
        }
    }
}


    // 打印json格式
    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;
}